一、SpringMVC
1.HelloWorld案例
①步骤:
加jar包
在web.xml文件中配置DispatcherServlet
加入SpringMVC的配置文件
编写处理请求的处理器,并标识为处理器
编写视图
②配置web.xml文件
DispatcherServlet
③创建控制器类,并标识出来
@Controller
handler
④在springmvc.xml文件中配置
配置视图解析器:<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
⑤访问页面
index.jsp
1.概述
①Spring为表现层提供了基于MVC设计理念的优秀的Web框架,是目前主流的MVC框架之一。
②Spring3.0之后全面超越Struts2,成为最优秀的MVC框架。
③SpringMVC通过一套MVC注解,让POJO成为处理请求的的控制器,而无需实现任何接口。
④支持REST风格的URL请求。
⑥采用了松散耦合可插拔组件结构,比其他MVC框架更具有扩展性和灵活性
2.映射请求的注解
①@RequestMapping来映射一个请求的URL,SpringMVC使用@ReuqestMapping注解控制器指定可以处理
那些URL请求,在处理器的类定义及方法定义处都可标注。
标注在方法上,方法返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver解析器,
会有如下解析:通过 prefix + returnVal + suffix,得到实际的物理视图,然后做转发操作。
如:WEB-INF/views/success.jsp
②@RequestMapping标注位置:
类定义:提供初步的请求映射信息,相对于web应用的根目录
方法定义处:提供进一步的请求映射信息,相对于类定义处的URL,若类定义处标注@RequestMapping,则方法处标注相对于web应用的根目录
③除了可以映射URL之外,还可以映射请求参数,请求方法或请求头,@RequestMapping的value、method、params、heads
分别表示请求URL、请求方法、请求参数、请求头,他们之间是“与”的关系,联合使用多个条件可以让请求映射更加精确化
④@ReuqestMapping还支持Ant的风格的URL,Ant风格资源地址支持3种匹配符
⑤@PathVariable映射URL绑定的占位符,带占位符的URL是Spring3.0之后新增的功能,该功能在SpringMVC向着REST目标
挺近发展过程中具有里程碑的意义。通过@PathVariable可以将URL中占位符绑定到控制器处理方法的入参中:URL中的{xxx}
占位符可以通过@PathVariable{“xxx”}绑定到操作方法的入参中
⑥@RequestPrarm映射请求参数,其中:
value值即为请求参数的参数名
required该参数是否必须,默认为true
defaultValue请求参数的默认值
⑦@RequestHeader绑定请求报头的属性值,请求头包含若干个属性,服务器可据此获知客户端的信息,通过@RequestHeader
即可将请求头中的属性值绑定到处理方法的入参中。
⑧@CookieValue绑定请求中的Cookie值
⑨使用POJO对象绑定请求参数值,SpringMVC会按请求参数名和POJO属性名进行自动匹配,自动为该对象填充属性值,支持级联属性
3.REST:(资源)表现层状态转化,是目前最流行的一种互联网架构,它结构清晰、符合标准、易于理解、方便扩展,所以得到越来越多的网站的应用
资源:网络上的一个实体,或者说网络上的一个具体信息,每种资源对应一个特定的URI。
表现层:把资源具体呈现出来的形式
状态转化:没发出一个请求,就代表了客户端和服务器的一次交互过程,HTTP协议是一个无状态的协议,即所有的状态都保存咋服务端,因此,客户端想要操作服务器
必须通过某种手段,让服务器发生某种“状态转化”,而这种转化是建立在表现层之上的,所以叫做表现层状态转化。
具体说,就是在HTTP协议里面,四种表示操作方式的动词:GET、POST、PUT、DELETE,它们分别对应四种基本操作
GET用来获取资源,POST用来新建资源,PUT用来更新资源、DELETE用来删除资源
示例:
/order/1 HTTP GET:得到ID为1的order
/order/1 HTTP DELETE:删除ID为1的order
/order/1 HTTP PUT:更新ID为1的order
/order HTTP POST:新增order
HiddenHttpMethodFilter:由于浏览器form表单只支持GET和POST请求,而DELETE和PUT等method并不支持,Spring3.0添加了一个过滤器,
可以将这些请求转化为标准的HTTP,使得支持GET、POST、PUT、DELETE请求。
如何使用:
①配置org.springframework.web.filter.HiddenHttpMethodFilter过滤器:把POST请求转化为DELETE或PUT请求
②需要发送POST请求
③需要在发送POST请求时,携带一个name为”_method”的隐藏域,值为DELETE或PUT
④在SpringMVC的目标方法中如何得到id值呢? 使用@PathVariable注解
4.处理模型数据ModelAndView
SpringMVC提供了几种途径输出模型数据:
①ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据
②Map及Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.uti.Map、java.uti.Map
处理方法返回时,Map中的数据会自动添加到模型中
③@SessionAttribute:将模型中的某个属性暂存到HttpSession中,一便多个请求之间可以共享这个属性
④@ModelAttribute:方法入参标注该注解之后,入参的对象就会放到数据模型中
二、代码
1.页面
inde.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 1.@RequestMapping标注在方法上:映射URL请求 -->
<a href="helloworld">Hello World!</a>
<br><br>
<!-- 2.@RequestMapping标注在类上:提供初步的请求映射信息,相对于web应用的根目录 -->
<a href="springmvc/testRequestMapping">testRequestMapping</a>
<br><br>
<!-- 3.@RequestMapping的method属性,因为Method属性指定为POST请求,但超链接是GET请求,所以使用from表单,更改请求方式 -->
<form action="springmvc/testMethod" method="post">
<input type="submit" value="Submit"/>
</form>
<a href="springmvc/testMethod">testMethod</a>
<br><br>
<!-- 4.@RequestMapping映射请求参数和请求头,参数值age为10则,无法访问到资源,不是10则可以访问到 -->
<a href="springmvc/testParamsAndHeads?username=test&age=10">testParamsAndHeads age参数值不能为10</a>
<br><br>
<!-- 5.@RequestMapping支持Ant风格的URL -->
<a href="springmvc/testAntPath/123123/abc">testAntPath </a>
<br><br>
<!-- 6.@PathVariable注解 映射URL中的占位符到目标方法的参数-->
<a href="springmvc/testPathVariable/12">testPathVariable</a>
<br><br>
<!-- 7.REST风格的请求 -->
<p>查找</p>
<a href="springmvc/testRest/1">Test Rest GET</a>
<br><br>
<p>添加</p>
<form action="springmvc/testRest" method="post">
<input type="submit" value="Test Rest POST">
</form>
<p>删除</p>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="Test Rest DELETE">
</form>
<p>更新</p>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="Test Rest PUT">
</form>
<!-- 8.RequestParam -->
<a href="springmvc/testRequestParam?username=test&age=22">Test RquestParam</a>
<br><br>
<!-- 9.@RequestHeader -->
<a href="springmvc/testRequestHeader">Test RequestHeader</a>
<br><br>
<!-- 10.@CookieValue绑定请求中的Cookie值 -->
<a href="springmvc/testCookieValue">Test CookieValue</a>
<br><br>
<!-- 11.使用POJO对象绑定请求参数值 -->
<form action="springmvc/testPojo" method="post">
username:<input type="text" name="username">
<br>
password:<input type="password" name="password">
<br>
Email:<input type="text" name="email">
<br>
age:<input type="text" name="age">
<br>
city:<input type="text" name="address.city">
<br>
province:<input type="text" name="address.province">
<br>
<input type="submit" value="Submit">
</form>
<br><br>
<!-- 12.使用Servlet原生的API -->
<a href="springmvc/testServletAPI">Test testServletAPI</a>
<br><br>
<!-- 13.处理模型数据ModelAndView -->
<a href="springmvc/testModelAndView">Test ModelAndView</a>
<br><br>
<!-- 14.处理模型数据Map -->
<a href="springmvc/testMap">Test Map</a>
<br><br>
<!-- 15.处理模型数据SessionAttribute -->
<!--
16.处理模型数据ModelAttribute
模拟修改操作
1.原始数据为1,Tom,1231,test@.com,21
2.要求:密码不能被修改
3.表单回显,模拟操作直接在表单填写对象的属性值
-->
<form action="springmvc/testModelAttribute" method="post">
<input type="hidden" name="id" value="1"/>
userName:<input type="text" name="username" value="Tom">
<br><br>
Email:<input type="text" name="email" value="test@.com">
<br><br>
age:<input type="text" name="age" value="21">
<br><br>
<input type="submit" name="Submit">
</form>
<br><br>
<!-- 17.视图解析流程 -->
<a href="springmvc/testViewAndViewResolver">Test ViewAndViewResolver</a>
<br><br>
<!-- 18.自定义视图 -->
<a href="springmvc/testView">Test View</a>
<br><br>
<!-- 19.重定向 -->
<a href="springmvc/testRedirect">Test Redirect</a>
<br><br>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 导入国际化标签 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>Success Page</h3>
<br><br>
<!-- 处理模型数据ModelAndView -->
time:${requestScope.time}
<br><br>
<!-- 处理模型数据Map -->
Names:${requestScope.names }
<br><br>
<!-- 处理模型数据SessionAttribute -->
request User:${requestScope.user }
<br><br>
<!-- 处理模型数据SessionAttribute -->
Session User:${sessionScope.user }
<br><br>
<!-- 国际化 -->
<fmt:message key="i18n.username"></fmt:message>
<br><br>
<fmt:message key="i18n.password"></fmt:message>
<br><br>
</body>
</html>
2.实体类
User.java
package com.test.springmvc.entities;
public class User {
private String id;
private String username;
private String password;
private String email;
private String age;
private Address address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public User(String username, String password, String email, String age) {
super();
this.username = username;
this.password = password;
this.email = email;
this.age = age;
}
public User(String id, String username, String password, String email,
String age) {
super();
this.id = id;
this.username = username;
this.password = password;
this.email = email;
this.age = age;
}
public User() {
super();
}
/*@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", email=" + email + ", age=" + age + ", address=" + address
+ "]";
}*/
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + ", email=" + email + ", age=" + age + "]";
}
}
Address.java
package com.test.springmvc.entities;
public class Address {
private String province;
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address [province=" + province + ", city=" + city + "]";
}
}
3.Handle
HelloWorld.java
package com.test.springmvc.handlers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloWorld {
/**
* 1.应答一个请求,使用@RequestMapping来映射一个请求的URL
* 2.返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver解析器,会有如下解析:
*通过 prefix + returnVal + suffix,得到实际的物理视图,然后做转发操作
*如:WEB-INF/views/success.jsp
*/
@RequestMapping("/helloworld")
public String hello(){
System.out.println("你好!");
return "success";
}
}
SpringmvcTest.java
package com.test.springmvc.handlers;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import com.test.springmvc.entities.User;
//@SessionAttributes({"user"})
@Controller
@RequestMapping("/springmvc")
public class SpringmvcTest {
private static String SUCCESS = "success";
/**
* 1.测试@RequestMapping标注在类定义处
* @return
*/
@RequestMapping("/testRequestMapping")
public String testRequestMapping(){
System.out.println("testRequestMapping");
return SUCCESS;
}
/**
* 2.常用:使用Method属性指定请求属性
* @return
*/
@RequestMapping(value="/testMethod", method=RequestMethod.POST)
public String testMethod(){
System.out.println("testMehtod");
return SUCCESS;
}
/**
* 3.了解:映射请求参数和请求头
* @return
*/
@RequestMapping(value="/testParamsAndHeads",
params={"username", "age!=10"}, headers={})
public String testParamsAndHeads(){
System.out.println("testParamsAndHeads");
return SUCCESS;
}
/***
* 4.Ant的风格的URL,Ant风格资源地址支持3种匹配符
* @return
*/
@RequestMapping("testAntPath/*/abc")
public String testAntPath(){
System.out.println("testAntPath");
return SUCCESS;
}
/**
* 4.@PathVariable注解映射URL中的占位符到目标方法的参数
* @param id
* @return
*/
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id){
System.out.println("testPathVariable" + id);
return SUCCESS;
}
//5.REST风格
/**
* GET(查找)请求
* @param id
* @return
*/
@RequestMapping(value="/testRest/{id}", method=RequestMethod.GET)
public String testRESTGET(@PathVariable Integer id){
System.out.println("test Rest GET:" + id);
return SUCCESS;
}
/**
* POST(添加)请求
* @return
*/
@RequestMapping(value="/testRest", method=RequestMethod.POST)
public String testRESTPOST(){
System.out.println("test Rest POST");
return SUCCESS;
}
/**
* DELETE(删除)请求
* @param id
* @return
*/
@RequestMapping(value="/testRest/{id}", method=RequestMethod.DELETE)
public String testRESTDELETE(@PathVariable Integer id){
System.out.println("test Rest DELETE:" + id);
return SUCCESS;
}
/**
* PUT(更新)请求
* @param id
* @return
*/
@RequestMapping(value="/testRest/{id}", method=RequestMethod.PUT)
public String testRESTPUT(@PathVariable Integer id){
System.out.println("test Rest PUT:" + id);
return SUCCESS;
}
/**
* 6.使用@RequestPrarm映射请求参数,其中:
* value值即为请求参数的参数名
* required该参数是否必须,默认为true
* defaultValue请求参数的默认值
* @return
*/
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="username") String un,
@RequestParam(value="age", required=false, defaultValue="0") int age){
System.out.println("testRequestParam:" + un + ":" + age);
return SUCCESS;
}
/**
* 7.@RequestHeader绑定请求报头的属性值
* @param al
* @return
*/
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language") String al){
System.out.println("testRequestHeader:Accept-Language:" + al);
return SUCCESS;
}
/**
* 8.@CookieValue绑定请求中的Cookie值
* @return
*/
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String sessionId){
System.out.println("testCookieValue:sessionID:" + sessionId);
return SUCCESS;
}
/**
* 9.使用POJO对象绑定请求参数值
* @return
*/
@RequestMapping("/testPojo")
public String testPojo(User user){
System.out.println("testPojo:" + user);
return SUCCESS;
}
/**
* 10.使用Servlet原生的API
*/
@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request,
HttpServletResponse response){
System.out.println("testServletAPI:" + request + ":" + response);
return SUCCESS;
}
/**
* 11.处理模型数据1,目标方法的返回值可以是ModelAndView类型,其中可以包含视图和模型信息
* SpringMVC会把ModelAndView的model中的数据放入到request域对象中。
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);
//添加模型数据到ModelAndView中
modelAndView.addObject("time", new Date());
return modelAndView;
}
/**
* 12.处理模型数据2,目标方法可以添加Map类型的参数
* @return
*/
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("names", Arrays.asList("Lili", "Tom", "Jerry"));
return SUCCESS;
}
/**
* 13.@SessionAttribute,在控制器上标注@SessionAttributes({"user"}),该注解只能放到类的上面
* @return
*/
@RequestMapping("/testSessionAttribute")
public String testSessionAttribute(Map<String, Object> map){
User user = new User("Tom", "1231", "test@qq.com", "21");
map.put("user", user);
return SUCCESS;
}
/**
* 14.ModelAttribute
* @param user:该参数的部分属性是从数据库中获取的,另一部分属性是form表单映射的数据
* @return
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改:" + user);
return SUCCESS;
}
/**
* 1.有@ModelAttribute标记的方法,会在目标方法(14.testModelAttribute())执行之前被SpringMVC调用
* 2.从数据库中取出对象
* 3.把对象放入到Map中
* 4.传入目标方法的参数(user),该对象的部分参数是从数据库中获取的,另一部分的属性是表单映射过来的
* 5.SpringMVC从Map中取出User对象,并把表单映射的参数赋值给该User对象对应的属性
* 6.SpringMVC把上述对象传入到目标方法的参数
*注意:在@modelAttribute修饰的方法中,放入到Map时的键需要和目标方法入参类型的第一个字母小写的字符串一致
* @param id
*/
@ModelAttribute
public void getUser(@RequestParam(value="id", required=false) Integer id, Map<String, Object> map){
System.out.println("ModelAttribute");
if(id != null){
//模拟从数据库库中获取对象
User user = new User("1", "Tom", "1231", "test@.com", "21");
System.out.println("从数据库中获取对象");
map.put("user", user);
}
}
/**
* 15.视图解析流程
* 视图和视图解析器:
* 对于返回类型为String、ModelAndView、View的处理方法,SpringMVC也会在内部将他们装配成一个ModelAndView对象
*它包含了逻辑名和模型对象的视图,SpringMVC借助视图解析器得到最终的视图对象
*ModelAndView——>ViewResolver——>视图对象(JSP/JSTL/PDF)
*
* 以国际化为例,演示视图解析
*/
@RequestMapping("/testViewAndViewResolver")
public String testViewAndViewResolver(){
System.out.println("testViewAndViewResolver");
return SUCCESS;
}
/**
* 16.自定义视图
*/
@RequestMapping("/testView")
public String testView(){
System.out.println("testView");
return "helloView";
}
/**
* 17.重定向,一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,如果返回的字符串中带有forword:或
* redirect:前缀时,SpringMVC会对他们进行特殊处理,将forword:和redirect当成指示符,其后的字符串作为URL
* 来处理。
*/
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("testRedirect");
return "redirect:/index.jsp";
}
}
4.视图类
HelloView.java
package com.test.springmvc.view;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;
/**
* 自定义视图,注意注解@Component不能忘了
*
*/
@Component
public class HelloView implements View{
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> arg0, HttpServletRequest arg1,
HttpServletResponse arg2) throws Exception {
arg2.getWriter().print("Hello View Time:" + new Date());
}
}
5.配置文件
国际化
i18n_en_US.properties
i18n.username=Username
i18n.password=Password
i18n_zh_CN.properties
i18n.username=u7528u6237u540D
i18n.password=u5BC6u7801
i18n.properties
i18n.username=Username
i18n.password=Password
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Demo18_Spring_MVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter:可以把POST请求转化为DELETE或PUT请求 -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
配置DispatcherServlet的初始化参数:配置SpringMVC配置文件的名称和位置,
实际上也可以不通过contextConfigLocation配置SpringMVC的配置文件,而使用默认的
默认的配置文件为:/WEB-INF/<servlet-name>-servlet.xml
-->
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param> -->
<!-- 当前web应用被加载时创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 应答所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
dispatcherServlet-servlet.xml
<?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: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-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.test.springmvc"></context:component-scan>
<!-- 配置视图解析器,如何把handler的方法返回的值解析为实际的物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置前缀,配置前缀时,一定要注意,不能少了第一个斜杠,它代表根目录,少了的话,会因为@RequestMapping注解到类上而出现路径问题-->
<property name="prefix" value="/WEB-INF/views/"></property>
<!-- 配置后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 自定义视图,配置视图解析器:BeanNameViewResolver,使用视图的名字来解析视图,若希望下载的是一个Excel文档,
则可以设置响应头Content-Disposition的值为attachment;filename=xxx.xls
该配置文件中,配置了两个视图解析器,那么使用哪个呢?
通过配置order属性,来定义视图的优先级,order的值越小,优先级越高
-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"></property>
</bean>
<!-- 配置国际化资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
<!-- 配置直接转发的页面,可以直接向相应的页面转发,而无需再经过Handler的方法。但是这种方法会导致@RequestMapping注解失效。 -->
<mvc:view-controller path="/success" view-name="success"/>
<!-- 解决办法:在实际开发中通常会配置mvc:annotation-driven 标签 -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
6.用到的jar包
commons-logging-1.1.1.jar
jstl.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
standard.jar