1. 程式人生 > >SpringMVC的學習文檔

SpringMVC的學習文檔

nfa manage 實例 message 亂碼 throw 基於 ins 分析

1 SpringMVC

  1. 什麽是SpringMVC?

Spring MVC是一個基於MVC模式的WEB框架,它解決WEB開發中常見的問題(參數接收、文件上傳、表單驗證、國際化、等等),使用非常簡單,SpringMVC作為Spring中的一個模塊,可以與Spring無縫集成。

M: Model

VView

CController

  1. 為什麽要學習SpringMVC?

Spring是一個輕量級的Java 開發框架,為了解決企業應用開發的復雜性而創建。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。SpringMVCSpring

框架為核心,為應用程序中的Web層(表現層)提出的一套優秀的解決方案。

目前很多公司都使用Spring MVC90%的招聘單位要求熟悉使用Spring MVC

1.1 SpringMVC_01_HelloWorld

1.1.1 導入包

導入spring的基本包,其它包根據需要再加入

導入SpringMVC的包

Spring包的基礎上再加上下面的包.

1.1.2 web.xml中加入核心功能處理器

<servlet>

<servlet-name>dispatcherServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- 啟動的時候需要讀取spring的配置文件 -->

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring.xml</param-value>

</init-param>

<!-- 隨著web容器tomcat的啟動,實例化這個servlet .

數字要>=0,數字越小,啟動越早-->

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dispatcherServlet</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

1.1.3 /*/的區別

<url-pattern>/*</url-pattern>

<url-pattern>/</url-pattern>

二者的區別

二者都可以攔截所有的請求。

/*訪問jsp的時候也會攔截,/不會

1.1.4 控制器

public class MyController implements Controller{

@Override

public ModelAndView handleRequest(HttpServletRequest request,

HttpServletResponse response) throws Exception {

/*

* ModelAndView對象包含數據對象和視圖對象

* 視圖:目前使用jsp

*/

//實例化ModelAndView對象

ModelAndView modelAndView = new ModelAndView();

//放數據,相當於 request.setAttribute("msg", "helloworld")

modelAndView.addObject("msg", "helloworld");

//放視圖

modelAndView.setViewName("/WEB-INF/jsp/show.jsp");

return modelAndView;

}

}

1.1.5 config/spring.xml中配置MyController

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--

配置controller

name屬性就是控制器controller的訪問名字,一般加/

-->

<bean name="/myController" class="cn.com.bochy.controller.MyController"/>

<!--

加入了springmvc的很多功能

其中就有HandlerMappingHandlerAdapterViewResolver

還有參數的賦值,靜態資源的訪問,json的處理等等...

-->

<mvc:annotation-driven/>

</beans>

1.1.1 分析

1.1 SpringMVC_02_Controller

1.1.1 Controller的第一種寫法

1.1.2 Controller的第二種寫法

1.1.3 Controller的第三種寫法

全註解也是開發中寫的

@Controller註解必須配合掃描才能變成控制器(spring.xml)

Controller是單例模式,所以不能在Controller的類中定義成員變量,會造成線程安全問題.Struts2中的Action是原型模式,所以在Action中定義成員變量不會造成線程安全問題.

1.1.4 SpringMVC 執行流程

控制器=處理器(Handler Controllers)

SpringMVC工作流程描述

1. 用戶向服務器發送請求,請求被SpringMVC前端控制DispatcherServlet捕獲;

2. DispatcherServlet通過調用HandlerMapping(處理器映射管理對象)獲得該請求對應的Handler對象(包括控制器以及Handler對象對應的攔截器)

HandlerExecutionChain對象(包含:控制器+2個攔截器);

3. DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter。(附註:如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(...)方法)

4. 提取Request中的模型數據,填充Handler入參,開始執行HandlerController)。 在填充Handler的入參過程中,根據你的配置,Spring將幫你做一些額外的工作:

HttpMessageConverter: 將請求消息(如Jsonxml等數據)轉換成一個對象,將對象轉換為指定的響應信息

數據轉換:對請求消息進行數據轉換。如String轉換成IntegerDouble

數據格式化:對請求消息進行數據格式化。 如將字符串轉換成格式化數字或格式化日期等

數據驗證: 驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResultError

5.Handler執行完成後,向DispatcherServlet 返回一個ModelAndView對象;

6.根據返回的ModelAndView,選擇一個適合的ViewResolver(必須是已經註冊到Spring容器中的ViewResolver)返回給DispatcherServlet

7. ViewResolver 結合ModelView,來渲染視圖(Model+View合成)

8. 將渲染結果返回給客戶端。


SpringMVC工作流程描述(簡易)

1. 客戶端請求提交到DispatcherServlet

2. DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的handler

3. DispatcherServlet將請求轉發給到handler

4. 通過HandlerAdatper執行handler調用業務邏輯處理後,返回ModelAndView

5. DispatcherServlet查詢一個或多個ViewResovler視圖解析器,將model渲染views。

6.views結果顯示到客戶端。

1.2 SpringMVC_03_Param

首先在web.xml中加入springmvc的核心功能攔截器.

<!-- springmvc核心功能攔截器 -->

<servlet>

<servlet-name>dispatcherServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-clas>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>dispatcherServlet</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

config/spring.xml中加入:

<!--

加入了springmvc的很多功能

其中就有HandlerMappingHandlerAdapterViewResolver

還有參數的賦值,靜態資源的訪問,json的處理等等...

-->

<mvc:annotation-driven />

<!--

掃描本包或者子包頭部是否有註解

@Component,@Service,@Controller,@Repository

如果有,實例化該對象,交給spring管理

-->

<context:component-scan base-package="cn.com.bochy"/>

User.java:

package cn.com.bochy.entity;

public class User {

private int id;

private String name;

//省略get,settoString

}

UserQueryVo.java:

package cn.com.bochy.entity;

public class UserQueryVo {

private List<Integer> ids;

private List<User> users;

private Map<String, String> map;

private Date birthday;

//省略getset方法

}

1.2.1 簡單數據類型賦值

index.jsp:

<ol>

<li>簡單類型參數賦值

<form action="user/test1" method="post">

用戶名:<input name="n"/><br />

密碼:<input name="pwd"/><br />

年齡:<input name="age"/><br />

<input value="登錄" type="submit" />

</form>

</li>

</ol>

UserController.java:

package cn.com.bochy.controller;

@Controller

@RequestMapping("/user")

public class UserController{

@RequestMapping("/test1")

public ModelAndView test1(@RequestParam("n")String name,

@RequestParam(required=false)String pwd,

@RequestParam(defaultValue="110")int age){

return null;

}

}

1.2.2 對象屬性賦值

index.jsp:

<li>非簡單類型(對象)參數賦值

<form action="user/test2" method="post">

ID:<input name="id"/><br />

用戶名:<input name="name"/><br />

<input value="登錄" type="submit" />

</form>

</li>

UserController.java:

//@RequestMapping("/test2",)

@RequestMapping(value="/test2",method={RequestMethod.POST,RequestMethod.GET})

public ModelAndView test2(User user){

return null;

}

1.2.3 數組賦值

<li>數組參數賦值

<form action="user/test3">

id1:<input name="ids" value="1"/><br/>

id2:<input name="ids" value="2"/><br/>

id3:<input name="ids" value="3"/><br/>

<input value="登錄" type="submit" />

</form>

</li>

@RequestMapping("/test3")

public ModelAndView test3(Integer[] ids){

return null;

}

1.2.4 集合賦值

必須將集合包裝成某個類的屬性賦值.

<li>list集合(簡單類型泛型約束)賦值

<form action="user/test4" method="post">

id1:<input name="ids[0]" value="1"/><br/>

id2:<input name="ids[1]" value="2"/><br/>

id3:<input name="ids[2]" value="3"/><br/>

<input value="登錄" type="submit" />

</form>

</li>

@RequestMapping("/test4")

public ModelAndView test4(UserQueryVo userQueryVo){

return null;

}

<li>list集合(非簡單類型泛型約束)賦值

<form action="user/test5" method="post">

user1:<input name="users[0].id" value="0"/>

<input name="users[0].name" value="name0"/><br/>

user2:<input name="users[1].id" value="1"/>

<input name="users[1].name" value="name1"/><br/>

user3:<input name="users[2].id" value="2"/>

<input name="users[2].name" value="name2"/><br/>

<input value="登錄" type="submit" />

</form>

</li>

@RequestMapping("/test5")

public ModelAndView test5(UserQueryVo userQueryVo){

return null;

}

<li>map集合賦值

<form action="user/test6" method="post">

1:<input name="map[‘k1‘]" value="v1"/><br/>

2:<input name="map[‘k2‘]" value="v2"/><br/>

3:<input name="map[‘k3‘]" value="v3"/><br/>

<input value="登錄" type="submit" />

</form>

</li>

@RequestMapping("/test6")

public ModelAndView test6(UserQueryVo userQueryVo){

return null;

}

1.2.5 restful風格

<li>restful風格

<a href="user/test7/10">restful風格</a>

</li>

@RequestMapping("/test7/{id}")

public ModelAndView test7(@PathVariable("id") Integer id){

return null;

}

1.2.6 日期賦值

不能直接處理,必須使用轉換器

1) 定義轉換器,實現接口Converter<From,To>

DateConverter.java:

package cn.com.bochy.converter;

import org.springframework.core.convert.converter.Converter;

//自定義類型轉換器

public class DateConverter implements Converter<String, Date>{

private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

@Override

public Date convert(String value) {

Date date = null;

try {

date = sdf.parse(value);

} catch (ParseException e) {

e.printStackTrace();

}

return date;

}

}

2) 註冊轉換器

spring.xml:

<!-- 註冊轉換器 -->

<bean name="formattingConversionServiceFactoryBean"

class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

<property name="converters">

<set>

<!--匿名bean-->

<bean class="cn.com.bochy.converter.DateConverter"/>

</set>

</property>

</bean>

3) 引用轉換器

1.2.7 使用系統註入對象

<li>使用系統註入對象

<form action="user/test9" method="post">

用戶名:<input name="name"/><br />

<input value="登錄" type="submit" />

</form>

</li>

@RequestMapping("/test9")

public String test9(String name,Model model,HttpServletRequest request,

HttpServletResponse response,

HttpSession session){

model.addAttribute("name", name);

return "/WEB-INF/jsp/show.jsp";

}

show.jsp:

<h1>show.jsp</h1><hr/>${name}

1.2.8 中文亂碼

1.2.8.1 get請求亂碼

找到tomcatserver.xml,修改

1.2.8.2 post請求亂碼

web.xml:

<!-- 解決post傳入中文亂碼問題 -->

<filter>

<filter-name>characterEncodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>utf-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>characterEncodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

1.3 SpringMVC_04_JSON

1) 導入json插件包

2) 定義方法

public Object 方法名(..){

//定義一個對象,存放需要轉成json的內容

return 對象;

}

UserController.java:

index.jsp:

<a href="user/test1">json測試1</a>

1.4 SpringMVC_05_Upload

1) 導入包:

2) 設置form的必要屬性

3) 配置對應的resolver

4) 功能方法接收

5) 具體實現

web.xml不變.

spring.xml中加入:

<!-- 配置可以解析多功能文件的解析器,beanname屬性值必須為multipartResolver,因為spring是根據byName引用的這個bean對象 -->

<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="maxUploadSize" value="10485760"/>

</bean>

index.jsp:

<h1>springmvc上傳</h1>

<form action="user/upload" method="post" enctype="multipart/form-data">

用戶名:<input type="text" name="name"/><br/><br/>

上傳文件:<input type="file" name="myfile" /><br/><br/>

<input type="submit" value="上傳">

</form>

UserController.java:

package cn.com.bochy.controller;

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/upload")

public String upload(String name,MultipartFile myfile,Model model,

HttpServletRequest request) throws Exception{

/*獲取輸入流*/

InputStream is = myfile.getInputStream();

/*獲取輸出流*/

String realPath = this.getRealPath(request, "/images");

String fileName = this.doFileName(myfile.getOriginalFilename());

OutputStream os = new FileOutputStream(new File(realPath,fileName));

/*copy*/

IOUtils.copy(is, os);

/*關閉流,釋放資源*/

os.close();

is.close();

return "/WEB-INF/jsp/show.jsp";

}

/**

* 傳入一個文件夾的名字返回其在服務器上的真實路徑

* 如果真實路徑不存在,直接創建

* @return

*/

private String getRealPath(HttpServletRequest request,String path){

String realPath =request.getServletContext().getRealPath(path);

File file = new File(realPath);

if(!file.exists()){

file.mkdirs();

}

return realPath;

}

/**

* 處理文件的名字,這裏只是使用UUID實現

* @param fileName

* @return

*/

private String doFileName(String fileName){

//獲取後綴

String extension = FilenameUtils.getExtension(fileName);

//獲取uuid字符串

String uuid = UUID.randomUUID().toString();

return uuid+"."+extension;

}

}

/WEB-INF/jsp/show.jsp:

<h1>上傳成功</h1>

1.5 SpringMVC_06_Download

web.xmlspring.xml不變.

index.jsp:

<h1>springmvc下載</h1>

<a href="user/download?name=hehe.jpg">下載1</a>

<a href="user/download?name=奶茶.jpg">下載2</a>

提供兩張圖片供下載:

UserController.java:

package cn.com.bochy.controller;

import java.net.URLEncoder;

import org.apache.tomcat.util.codec.binary.Base64;

@Controller

@RequestMapping("/user")

public class UserController {

@RequestMapping("/download")

public void download(String name,HttpServletRequest request,HttpServletResponse response) throws Exception{

/*設置響應的內容:下載,預覽*/

response.setHeader("Content-Disposition",

"attachement;filename="+this.setDownloadFileName(name, request));//下載

//response.setHeader("Content-Disposition", "filename="+name);//預覽

/*獲取輸入流*/

String realPath = this.getRealPath(request, "/images");

InputStream is = new FileInputStream(new File(realPath,name));

/*輸出流*/

OutputStream os = response.getOutputStream();

/*copy*/

IOUtils.copy(is, os);

/*關閉流,釋放資源*/

os.close();

is.close();

}

/**

* 傳入一個文件夾的名字返回其在服務器上的真實路徑

* 如果真實路徑不存在,直接創建

* @return

*/

private String getRealPath(HttpServletRequest request,String path){

String realPath =request.getServletContext().getRealPath(path);

File file = new File(realPath);

if(!file.exists()){

file.mkdirs();

}

return realPath;

}

/**

* 根據不同瀏覽器的版本設置下載文件名

* @param downloadFileName

*/

public String setDownloadFileName(String fileName,HttpServletRequest request) {

try {

if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {//火狐瀏覽器

fileName = "=?UTF-8?B?"+(new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))) + "?=";

} else { //其它瀏覽器

fileName = URLEncoder.encode(fileName, "UTF-8");

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return fileName;

}

}

1.6 SpringMVC_07_Mybatis

1.6.1 需求

SpringMVC整合mybatis完成用戶註冊的案例

1.6.2 實現

User.java:

package cn.com.bochy.entity;

public class User {

private int id;

private String name;

private String pwd;

//省略get,settoString

}

UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.com.bochy.mapper.UserMapper">

<insert id="insertUser" parameterType="User">

insert into bochy_user(name,pwd) values(#{name},#{pwd})

</insert>

</mapper>

UserMapper.java:

package cn.com.bochy.mapper;

public interface UserMapper {

void insertUser(User user) throws Exception;

}

UserService.java:

package cn.com.bochy.service;

public interface UserService {

void insertUser(User user) throws Exception;

}

UserServiceImpl.java:

package cn.com.bochy.service.impl;

@Component

public class UserServiceImpl implements UserService{

@Autowired

private UserMapper userMapper;

@Override

public void insertUser(User user) throws Exception {

userMapper.insertUser(user);

}

}

UserController.java:

package cn.com.bochy.controller;

@Controller

@RequestMapping("/user")

public class UserController {

@Autowired

private UserService userService;

@RequestMapping("/registerUI")

public String registerUI() throws Exception{

//默認是forward

//return "user/register";設置了視圖解析器的前綴,後綴之後才可以這樣簡寫.

return "forward:/WEB-INF/jsp/user/register.jsp";

}

@RequestMapping("/register")

public String register(User user) throws Exception{

userService.insertUser(user);

//return "user/success";設置了視圖解析器的前綴,後綴之後才可以這樣簡寫.

//return "redirect:/WEB-INF/jsp/user/success.jsp";

}

}

config/db.properties:

db.driverClass=com.mysql.jdbc.Driver

db.jdbcUrl=jdbc:mysql://localhost:3306/mybatis

db.user=root

db.password=root

config/log4j.properties:

# Global logging configuration

log4j.rootLogger=DEBUG, stdout

# MyBatis logging configuration...

log4j.logger.org.mybatis.example.BlogMapper=TRACE

# Console output...

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

config/mybatis-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!-- 讀取連接數據庫的配置文件 -->

<properties resource="db.properties"/>

<!--

除了MapperTypeAliases的其它配置,一般在這裏進行配置,非常直觀,簡單。

-->

</configuration>

config/spring_content.xml:

<!--

掃描base-package這個包,或者子包下的類。

如果發現類的頭部有註解@Component,將次類初始化,默認調用無參的構造方法

並且對象的名字,默認是類名首字母小寫

-->

<context:component-scan base-package="cn.com.bochy" />

<!--

spring整合Mybatis步驟1:配置數據庫的連接

具有連接池數據源的,一般使用c3p0或者dbcp

這裏需要指定一些屬性:

1、連接數據庫的4大件

2c3p0的屬性

-->

<context:property-placeholder location="classpath:db.properties"/>

<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

<property name="driverClass" value="${db.driverClass}"/>

<property name="jdbcUrl" value="${db.jdbcUrl}"/>

<property name="user" value="${db.user}"/>

<property name="password" value="${db.password}"/>

</bean>

<!-- spring整合Mybatis步驟2:配置SqlSessionFactory對象

這裏需要指定一些屬性:

1、數據源對象

2mybatis的配置文件的位置,

也可以不配置,mybatis的配置文件的所有屬性,在SqlSessionFactoryBean的屬性中配置起來

一般不推薦,因為有些復雜屬性還是配置在mybatis的配置文件中裏比較直觀。

3mapping文件的位置

也可以不配置,第2步中如果引用使用mybatis的的配置文件

-->

<bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<property name="configLocation" value="classpath:mybatis-config.xml"/>

<!-- 掃描此包下的所有的實體類,改別名:類名/類名首字母小寫.以後引用的時候不用再寫全類名 -->

<property name="typeAliasesPackage" value="cn.com.bochy.entity"/>

</bean>

<!-- spring整合Mybatis步驟3:掃描Mapper包得到mapper對應的的代理對象

必須符合mapper開發的所有格式:Mybatis_04_Mapper

這裏需要指定一些屬性:

1mapper所在的包

2SqlSessionFactory對象的名字,是一個字符串

-->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="cn.com.bochy.mapper"/>

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

</bean>

<!-- spring整合Mybatis步驟4:配置DataSourceTransactionManager對象

這裏需要指定一些屬性:

1dataSource對象

-->

<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>

<!--

spring整合Mybatis步驟5:使用xml完成事務的配置

-->

<aop:config>

<aop:pointcut id="trPointCut" expression="execution(public * cn.com.bochy.service.impl.*.*(..))" />

<aop:advisor advice-ref="myTx" pointcut-ref="trPointCut" />

</aop:config>

<tx:advice id="myTx" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="delete*" read-only="false"/>

<tx:method name="update*" read-only="false"/>

<tx:method name="insert*" read-only="false"/>

<tx:method name="select*" read-only="true"/>

</tx:attributes>

</tx:advice>

<aop:aspectj-autoproxy proxy-target-class="true"/>

config/spring_mvc.xml:

<!--

加入了springmvc的很多功能

其中就有HandlerMappingHandlerAdapterViewResolver

還有參數的賦值,靜態資源的訪問,json的處理等等...

-->

<mvc:annotation-driven/>

web.xml:

原來:

改為:

index.jsp:

<a href="user/registerUI">去註冊</a>

/WEB-INF/jsp/user/register.jsp:

<form action="user/register" method="post">

用戶名:<input name="name"/><br/><br/>

密碼:<input name="pwd"/><br/><br/>

<input type="submit" value="註冊"/>

</form>

success.jsp:

<h1>註冊成功</h1>

1.6.3 訪問靜態資源

因為web.xml中的dispatcherServleturl-pattern/,對除了jsp頁面之外所有的資源都攔截.所以我們要對靜態資源做一些特殊的配置.

現在訪問: http://localhost:8080/SpringMVC_07_Mybatis/style/images/hehe.jpg

spring_mvc.xml中加入:

<!-- 設置訪問靜態資源的目錄

比如html,css,image,js...

-->

<mvc:resources location="/script/" mapping="/script/**"/>

<mvc:resources location="/style/" mapping="/style/**"/>

再訪問: http://localhost:8080/SpringMVC_07_Mybatis/style/images/hehe.jpg就沒問題了.

1.6.4 視圖解析器

spring_mvc.xml中加入:

<!--

設置視圖解析器的一些屬性

前綴和後綴,對forwardredirect不起作用

所以,當項目中有重定向的時候,這個標簽不應該配置.

**一般不配置

-->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/"/>

<property name="suffix" value=".jsp"/>

</bean>

UserController.java中修改返回的視圖為簡寫形式.

SpringMVC的學習文檔