SpringMVC基础知识
1 概念
springmvc: spring的一个模块
以mvc的设计模式实现model和view分离(数据处理和数据显示的分离)的控制层框架-->替代servlet
1.1 mvc:软件的设计模式
- mvc:软件的设计模式-->实现model和view的分类
1.2 springmvc的原理/执行流程
- 案例:老王要账
1: DispatcherServlet:中央控制器接受客户端请求
2: 中央控制器拿请求咨询HandlerMapping:处理器映射器,获取请求url对应的controller处理器
3: 中央控制器把请求交给对应的HandlerAdapter:处理器适配器,处理器适配器把请求交给controller处理器
4: controller处理器处理请求后 把结果和数据封装为ModelAndView对象并提交给处理器适配器
5:处理器适配器把ModelAndView传递给中央控制器
6:中央控制器把ModelAndView交给ViewResolver视图解析器,进行解析,解析后得到view,并提交给中央控制器
7:中央控制器对view进行渲染后,响应给客户
1.3 springmvc的四大组件
- DispatcherServlet中央控制器
作为前端控制器接受请求、给与响应,统一调度:整个流程控制的中心,
控制其它组件执行,降低组件之间的耦合性,提高每个组件的扩展性。
- HandlerMapping处理器映射器
通过扩展处理器映射器实现不同的映射方式
例如:配置文件方式,实现接口方式,注解方式等
指定url和controller的对应关系
- HandlerAdapter处理器适配器
通过扩展处理器适配器,支持更多类型的处理器
接受中央控制器的请求,把请求交给对应的controller
指定可以处理请求的controller的类型
- ViewResolver视图解析器
通过扩展视图解析器,支持更多类型的视图解析 例如:jsp、freemarker、pdf、excel等。
对modelandview进行解析,得到view结果视图
1.4 servlet四宗罪
* 1 servlet泛滥:一个servlet只能接受一种请求
* 2 不能单元测试:servlet的service方法需要参数HttpServletRequest和HttpServletResponse程序员无法创建这两个对象
* 3 servlet创建时继承了HttpServlet,java只支持类与类的单继承,没法继承其他类,无法再扩展
* 4 servlet统一步骤:设置编码集-获取请求参数-封装对象-调用dao-设置域属性-选择跳转的页面,无法实现代码复用
2 案例1
2.1 创建web项目
2.2 导入jar包
ioc+aop+springmvc+jdbc+jstl+json
2.3 分包
2.4 导入jstl的tld文件
JSTL标签所需要的tld文件,放在WEB-INF下
c.tld
fmt.tld
fn.tld
2.5 创建请求页面:test.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">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
table {
border: 1px solid blue;
width: 600px;
margin: 100px auto;
border-collapse: collapse;
}
th, td {
border: 1px solid blue;
padding: 10px;
}
</style>
</head>
<body>
<form action="<c:url value='/login.action'/>" method="post">
<table>
<tr>
<th>用户名:</th>
<td><input type="text" name="uname" /></td>
</tr>
<tr>
<th>密 码:</th>
<td><input type="text" name="upwd" /></td>
</tr>
<tr>
<th colspan="2"><input type="submit" value="登录" /></th>
</tr>
</table>
</form>
<c:if test="${not empty message }">
错误提示信息:${message }
</c:if>
</body>
</html>
2.6 登录成功页面:test_success.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">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
table {
border: 1px solid blue;
width: 600px;
margin: 100px auto;
border-collapse: collapse;
}
th, td {
border: 1px solid blue;
padding: 10px;
}
</style>
</head>
<body>
<!-- ModelAndView默认是request域 -->
uname=${uname}<br />
upwd=${requestScope.upwd}<br />
</body>
</html>
2.7 创建类实现接口:Controller
package action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class Test01 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
req.setCharacterEncoding("utf-8");
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
String message = null;
if (!uname.equals("admin")) {
message = "用户名错误";
} else if (!upwd.equals("123")) {
message = "密码错误!";
}
// 设置域属性,默认request
ModelAndView mav = new ModelAndView();
if (message != null) {
mav.addObject("message", message);
// 选择跳转的资源
mav.setViewName("/jsp/test.jsp");
} else {
mav.addObject("uname", uname);
mav.addObject("upwd", upwd);
mav.setViewName("/jsp/test_success.jsp");
}
return mav;
}
}
2.8 创建springmvc的核心配置文件
springmvc.xml-->位置:src下
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 为controller创建bena -->
<bean class="action.Test01" name="/login.action" />
</beans>
2.9 在web.xml配置中央控制器
<!-- 在webxml中配置srpingmvc的中央控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过servlet的初始化参数指定springmvc的核心配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
3 四大组件
3.1 中央控制器:DispatcherServlet
接受请求+给予响应+统一调度
<!-- 配置中央控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
*通过初始化参数 指定核心配置文件的位置
*如果不指定核心配置文件的位置:springmvc的配置文件必须在WEB-INF下
*并且名字必须是${servlet-name}-servlet.xml
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
-->
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
3.2 处理器映射器:HandlerMapping
指定url和controller的对应关系
<!--
*** 配置处理器映射器 ***: <HandlerMapping>
如果不设置处理器映射器的情况下,使用默认映射器
默认处理器映射器:BeanNameUrlHandlerMapping
bean标签的name属性是action的url
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-->
<!-- 处理器映射器:SimpleUrlHandlerMapping:通过bean的id和url设置对应关系 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test01.action">t1</prop>
<prop key="/test02.action">t2</prop>
<prop key="/test03.action">t1</prop>
</props>
</property>
</bean>
3.3 处理器适配器:HandlerAdapter
指定action需要实现的接口
<!--
*** 配置处理器适配器:HanderAdapter ->指定action必须实现什么接口 ***
默认处理器适配器:SimpleControllerHandlerAdapter
action必须实现接口 org.springframework.web.servlet.mvc.Controller
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!--
处理器适配器:HttpRequestHandlerAdapter
action必须实现接口 org.springframework.web.HttpRequestHandler
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
public class Test01 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp)
throws Exception {
req.setCharacterEncoding("utf-8");
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
String message = null;
if (!uname.equals("admin")) {
message = "用户名错误";
} else if (!upwd.equals("123")) {
message = "密码错误!";
}
// 设置域属性,默认request
ModelAndView mav = new ModelAndView();
if (message != null) {
mav.addObject("message", message);
// 选择跳转的资源
mav.setViewName("/jsp/test.jsp");
} else {
mav.addObject("uname", uname);
mav.addObject("upwd", upwd);
mav.setViewName("jsp/test_success");
}
return mav;
}
}
public class Test02 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String uname = req.getParameter("uname");
String upwd = req.getParameter("upwd");
String message = null;
if (!uname.equals("admin")) {
message = "用户名错误";
} else if (!upwd.equals("123")) {
message = "密码错误!";
}
if (message != null) {
// 设置域属性
req.getSession().setAttribute("message", message);
// 选择跳转的资源
req.getRequestDispatcher("/test02.jsp").forward(req, resp);
} else {
req.getSession().setAttribute("uname", uname);
req.setAttribute("upwd", upwd);
req.getRequestDispatcher("/jsp/test_success.jsp").forward(req, resp);
}
}
}
3.4 视图解析器:ViewResolver
<!--
*** 视图解析器: ViewResolver->解析modelandview获取结果view ***
唯一的试图解析器 :org.springframework.web.servlet.view.InternalResourceViewResolver
如果视图解析器不配置:prefix和suffix->modelandview中设置就是真实路径
如果视图解析器配置:prefix和suffix->modelandview中设置就是逻辑路径
真实路径=prefix+逻辑路径+suffix
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
3.5 springmvc-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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 通过context标签扫描指定包 -->
<context:component-scan base-package="action"/>
<!-- 为controller创建bena -->
<bean class="action.Test01" name="/test01/login.action" id="t1" />
<bean class="action.Test02" id="t2" />
<bean class="action.Test03" name="/test03/login.action" />
<!--
*** 配置处理器映射器 ***: <HandlerMapping>
如果不设置处理器映射器的情况下,使用默认映射器
默认处理器映射器:BeanNameUrlHandlerMapping
bean标签的name属性是action的url
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-->
<!-- 处理器映射器:SimpleUrlHandlerMapping:通过bean的id和url设置对应关系 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test01.action">t1</prop>
<prop key="/test02.action">t2</prop>
<prop key="/test03.action">t1</prop>
</props>
</property>
</bean>
<!--
*** 配置处理器适配器:HanderAdapter ->指定action必须实现什么接口 ***
默认处理器适配器:SimpleControllerHandlerAdapter
action必须实现接口 org.springframework.web.servlet.mvc.Controller
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!--
处理器适配器:HttpRequestHandlerAdapter
action必须实现接口 org.springframework.web.HttpRequestHandler
-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
<!--
*** 视图解析器: ViewResolver->解析modelandview获取结果view ***
唯一的试图解析器 :org.springframework.web.servlet.view.InternalResourceViewResolver
如果视图解析器不配置:prefix和suffix->modelandview中设置就是真实路径
如果视图解析器配置:prefix和suffix->modelandview中设置就是逻辑路径
真实路径=prefix+逻辑路径+suffix
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
4 实现跳转
方式1:可以通过传统的request和response的方法实现跳转
方式2:通过ModelAndView实现跳转
2.1 默认是请求转发到jsp:如果在视图解析器中设置前缀和后缀 ModelAndView中设置的路径就是逻辑路径
mav.setViewName("jsp/testSuccess");//modelandview中设置的是逻辑路径
mav.setViewName("forward:/jsp/testSuccess.jsp");//modelandview中设置的是真实路径
2.2 重定向到jsp后缀action:
mav.setViewName("redirect:/jsp/testSuccess.jsp");//重定向到jsp
mav.setViewName("redirect:/test_2.action");//重定向到action
2.3 请求转发到action:
mav.setViewName("forward:/test_2.action");//madelandview中设置的是action的路径
- Test_1.java
package action;
public class Test_1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int n = Integer.parseInt(req.getParameter("n"));
// 通过request对象跳转到jsp
if (n == 1) {
req.setAttribute("message", "action/Test_1请求转发到/jsp/testSuccess.jsp 成功!");
req.getRequestDispatcher("/jsp/testSuccess.jsp").forward(req, resp);
return null;
}
// 重定向到jsp
if (n == 2) {
resp.sendRedirect(req.getContextPath() + "/jsp/testSuccess.jsp");
return null;
}
// 通过request对象跳转到action
if (n == 3) {
req.setAttribute("message", "action/Test_1请求转发到/testSuccess.jsp 成功!");
req.getRequestDispatcher("/test_2.action").forward(req, resp);
return null;
}
// 重定向到action
if (n == 4) {
resp.sendRedirect(req.getContextPath() + "/test_2.action");
return null;
}
///////////////////////////////////////////////////////////////////////////
// 通过modelandview跳转到jsp
ModelAndView mav = new ModelAndView();
if (n == 11) {
mav.addObject("message", "action/Test_1请求转发到/test02_success.jsp 成功!");
mav.setViewName("forward:/jsp/testSuccess.jsp");
}
// 重定向到jsp
if (n == 22) {
mav.setViewName("redirect:/jsp/testSuccess.jsp");
}
// 通过modelandview跳转到action
if (n == 33) {
mav.addObject("message", "action/Test_1请求转发到/test02/2.action 成功!");
mav.setViewName("forward:/test_2.action");
}
// 重定向到action
if (n == 44) {
mav.setViewName("redirect:/test_2.action");
}
return mav;
}
}
- test02_success.jsp
<body>
<h2>通过request对象跳转到jsp</h2>
<a href="<c:url value='/test_1.action?n=1'/>">请求转发到testSuccess.jsp?n=1</a> <br />
<a href="<c:url value='/test_1.action?n=2'/>">重定向到testSuccess.jsp?n=2</a> <br />
<h2>通过request对象跳转到action</h2>
<a href="<c:url value='/test_1.action?n=3'/>">请求转发到action:/Test_2?n=3</a> <br />
<a href="<c:url value='/test_1.action?n=4'/>">重定向到action:/Test_2?n=4</a> <br />
<h2>通过mav对象跳转到jsp</h2>
<a href="<c:url value='/test_1.action?n=11'/>">请求转发到testSuccess.jsp?n=11</a> <br />
<a href="<c:url value='/test_1.action?n=22'/>">重定向到testSuccess.jsp?n=22</a> <br />
<h2>通过mav对象跳转到action</h2>
<a href="<c:url value='/test_1.action?n=33'/>">请求转发到action:/test/Test_2?n=33</a> <br />
<a href="<c:url value='/test_1.action?n=44'/>">重定向到action:/test/Test_2?n=44</a> <br />
</body>
5 注解形式实现springmvc
5.1 导入jar
spring-webmvc-3.1.4.RELEASE.jar
5.2 在web.xml中指定中央控制器
指定springmvc核心配置文件的位置
5.3 创建springmvc的核心配置文件
1 引入context的命名空间和xsd文件
2 通过context的 指定扫描包:为添加注解的类创建bean
3 配置注解处理器映射器和处理器适配器
4 配置视图解析器
*** springmvc-servlet.xml ***
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--
1 引入context的命名空间和xsd文件
2 通过context的component-scan标签指定扫描包:为添加注解的类创建bean
3 配置注解处理器映射器和处理器适配器
4 配置视图解析器
-->
<context:component-scan base-package="action"/>
<!-- *** 配置处理器映射器 *** -->
<!-- 3.0之前用: DefaultAnnotationHandlerMapping
org.springframework.web.servlet.mvc.annotation.
DefaultAnnotationHandlerMapping
-->
<!-- 3.0之后用: RequestMappingHandlerMapping
org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerMapping
-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- *** 配置处理器适配器 *** -->
<!-- 3.0之前用: AnnotationMethodHandlerAdapter
org.springframework.web.servlet.mvc.annotation.
AnnotationMethodHandlerAdapter
-->
<!-- 3.1之后用: RequestMappingHandlerAdapter
org.springframework.web.servlet.mvc.method.annotation.
RequestMappingHandlerAdapter
-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
<!-- *** 视图解析器 *** -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
5.4 创建action
1 action类不需要实现接口
2 action类中的每个方法都接收一种请求
3 action上添加Controller注解
4 在action类和action方法上加RequestMapping注解指定url
*** /test01/m1.action ***
@Controller
// 指定当前action类中所有的action的虚拟目录
@RequestMapping("/test01")
public class Test {
// 当前action的url是 /test01/m1.action
@RequestMapping("/m1.action")
public ModelAndView method01() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "method_1");
mv.setViewName("jsp/test01");
return mv;
}
// 当前action的url是 /test01/m2.action
@RequestMapping("/m2.action")
public ModelAndView method02() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "method_2");
mv.setViewName("jsp/test01");
return mv;
}
}
5.5 测试页面
<%@ 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">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
</style>
</head>
<body>
<c:if test="${not empty message }">
提示信息:${message }<br />
</c:if>
<a href="<c:url value='/test01/m1.action'/>">请求/test01/m1.action</a> <br />
<a href="<c:url value='/test01/m2.action'/>">请求/test01/m2.action</a> <br />
</body>
</html>
6 action请求方式
package action;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
// 指定当前action类中所有的action的虚拟目录
@RequestMapping("/test01")
public class Test {
// *** 默认情况: action->接受get请求+post请求 ***
// 只接受post请求
@RequestMapping(value = "m1.action", method = RequestMethod.POST)
public ModelAndView method01() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "method_1:method = RequestMethod.POST");
mv.setViewName("jsp/test01");
return mv;
}
// 只接受get请求
@RequestMapping(value = "/m2.action", method = RequestMethod.GET)
public ModelAndView method02() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "method_2:method=RequestMethod.GET");
mv.setViewName("jsp/test01");
return mv;
}
// 接受get和post
@RequestMapping(value = "/m3.action", method = { RequestMethod.GET, RequestMethod.POST })
public ModelAndView method03() {
ModelAndView mv = new ModelAndView();
mv.addObject("message", "method0_3:method={RequestMethod.GET,RequestMethod.POST}");
mv.setViewName("jsp/test01");
return mv;
}
}
<body>
<c:if test="${not empty message }">
提示信息:${message }<br />
</c:if>
<form action="<c:url value='/test01/m1.action'/>" method="post">
<input type="submit" value="/test01/m1.action">
</form>
<form action="<c:url value='/test01/m2.action'/>" method="get">
<input type="submit" value="/test02/m1.action">
</form>
<form action="<c:url value='/test01/m3.action'/>" method="post">
<input type="submit" value="/test03/m1.action">
</form>
</body>
7 action请求参数类型
testArgs.jsp
<c:if test="${not empty arg}">
这是mv.addObject(): ${arg}<br/>
${name}${age}${dy}
</c:if>
<c:if test="${not empty a}">
这是域对象: ${a}<br/>
</c:if>
<c:if test="${not empty b}">
这是session域: ${b}<br/>
</c:if>
<a href="<c:url value='/test/arg1.action'/>">测试参数1model</a><br/>
<a href="<c:url value='/test/arg2.action'/>">测试参数2HttpServletRequest</a><br/>
<a href="<c:url value='/test/arg3.action'/>">测试参数3HttpServletResponse</a><br/>
<a href="<c:url value='/test/arg4.action'/>">测试参数4HttpSession</a><br/>
<a href="<c:url value='/test/arg5.action?dy=true&age=11&name=tom'/>">测试参数5三个参数</a><br/>
<a href="<c:url value='/test/arg6.action?dy=true&age=11&name=tom'/>">测试参数6一个对象</a><br/>
TestAction.java
@Controller
@RequestMapping("/test")
public class TestAction {
@RequestMapping("/arg1.action")
public ModelAndView arg1(Model model) {
model.addAttribute("a", "model");
ModelAndView mv = new ModelAndView();
mv.addObject("arg", "model");
mv.setViewName("testArgs");
return mv;
}
@RequestMapping("/arg2.action")
public ModelAndView arg2(HttpServletRequest req) {
req.setAttribute("a", "req");
ModelAndView mv = new ModelAndView();
mv.addObject("arg", "req");
mv.setViewName("testArgs");
return mv;
}
@RequestMapping("/arg3.action")
public ModelAndView arg3(HttpServletResponse resp) throws Exception{
resp.sendRedirect("http://www.baidu.com");
return null;
}
@RequestMapping("/arg4.action")
public ModelAndView arg4(HttpSession session) {
session.setAttribute("b", "session");
ModelAndView mv = new ModelAndView();
mv.addObject("arg", "session");
mv.setViewName("testArgs");
return mv;
}
@RequestMapping("/arg5.action")
public ModelAndView arg5(int age,String name,boolean dy) {
ModelAndView mv = new ModelAndView();
mv.addObject("arg", age+":"+name+":"+dy);
mv.addObject("age", age);
mv.addObject("name", name);
mv.addObject("dy", dy);
mv.setViewName("testArgs");
return mv;
}
@RequestMapping("/arg6.action")
public ModelAndView arg6(Student stu) {
ModelAndView mv = new ModelAndView();
mv.addObject("arg", stu);
mv.setViewName("testArgs");
return mv;
}
}