SpringMVC基础知识

1 概念

springmvc: spring的一个模块
	以mvc的设计模式实现model和view分离(数据处理和数据显示的分离)的控制层框架-->替代servlet

image-20211109091528525

1.1 mvc:软件的设计模式

  • mvc:软件的设计模式-->实现model和view的分类

image-20211109091514615

1.2 springmvc的原理/执行流程

image-20211109091704589

  • 案例:老王要账

image-20211109093640488

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

image-20211109101653397

2.3 分包

image

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;
	}
}
posted @ 2021-11-09 22:31  RenVei  阅读(35)  评论(0编辑  收藏  举报