处理器方法的参数:
处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 请求中所携带的请求参数
控制器方法:
前面三个参数怎么用呢,在控制器方法的形参列表中定义就可以了,springmvc框架会自动赋值:
@Controller
@RequestMapping("/test")
public class MyController2 {
@RequestMapping("/first.do")
public ModelAndView doFirst(HttpServletRequest request,
HttpServletResponse response,
HttpSession session){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","=====欢迎使用springmvc做web开发======" + request.getParameter("name")+request.getParameter("age"));
mv.addObject("fun","执行的是doFirst方法");
mv.setViewName("other");
return mv;
}
}
index.jsp:
<form action = "test/first.do" method = "POST">
姓名:<input type = "text" name = "name"/>
年龄:<input type = "text" name = "age"/>
<input type = "submit" value = "注册"/>
</form>
测试结果:
用户提交的数据:
逐个接收:
1、当处理器(控制器)方法的形参名和请求中参数名一致时,同名的请求参数值给同名的形参
<form action = "test/first.do" method = "POST">
姓名:<input type = "text" name = "name"/>
年龄:<input type = "text" name = "age"/>
<input type = "submit" value = "注册"/>
</form>
@Controller
@RequestMapping("/test")
public class MyController2 {
@RequestMapping("/first.do")
public ModelAndView doFirst(String name, int age){
ModelAndView mv = new ModelAndView();
mv.addObject("myName",name );
mv.addObject("myAge",age);
mv.setViewName("show2");
return mv;
}
}
show2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<h3>当处理器(控制器)方法的形参名和请求中参数名一致时,同名的请求参数值给同名的形参</h3>
<h3>myName数据:${myName}</h3>
<h3>myAge数据:${myAge}</h3>
</head>
<body>
</body>
</html>
1、使用request对象接收请求参数:
String strName = request.getParameter("name");
String strAge = request.getParameter( "age");
2、springmvc框架通过 Dispatcherservlet 调用 MyController的doFirst ()方法,调用方法时,按名称对应,把接收的参数赋值给形参
框架会提供类型转换的功能,能把string转为 int ,long ,float , double等类型:
doFirst (strName , Integer. valueOf(strAge) )
3、现在有个问题,如果age不赋值呢:
400状态码是客户端错误,表示提交请求参数过程中,发生了问题,无法正常接收,出现400的情况一般是你发请求的过程中提交的这些数据和控制器方法的形参对应不上
因为age不写的话就是一个空字符串,框架在进行转换的时候会报错:
String strAge = request.getParameter( "age");
doFirst (strName , Integer. valueOf(strAge) )
年龄乱填,例如abc,也会报错,无法转换成Integer类型!
你可以改为Integer类型,这样就可以接受空字符串,当然,字符串和浮点型仍然接受不了,可以在前端用正则表达式做筛选:
如果你觉得这种限制很麻烦,你可以改为String,因为所有参数在接收的时候原值都是字符串:
String strName = request.getParameter("name");
String strAge = request.getParameter( "age"); //使用request对象接收请求参数:
中文乱码:
<form action = "test/first.do" method = "POST">
姓名:<input type = "text" name = "name"/>
年龄:<input type = "text" name = "age"/>
<input type = "submit" value = "注册"/>
</form>
POST请求方式提交请求参数时会出现中文乱码问题:
但是GET请求方式提交请求参数时不会出现:
<form action = "test/first.do" method = "get">
姓名:<input type = "text" name = "name"/>
年龄:<input type = "text" name = "age"/>
<input type = "submit" value = "注册"/>
</form>
POST请求方式提交请求参数时会出现中文乱码问题,需要使用过滤器处理乱码问题,过滤器可以自定义,也可使用框架中提供的过滤器 CharacterEncodingFilter
设置字符集过滤器:
在web.xml文件中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--
声明、注册spring MVC的核心对象:DispatcherServlet,在tomcat服务启动后,
创建DispatcherServlet对象的实例。
为什么要创建DispatcherServlet对象的实例呢?
因为在创建DispatcherServlet对象过程中,同时会创建SpringMVC容器对象,
读取SpringMVC的配置文件,把这个配置文件中的对象都创建好,当用户发起请求时就可以直接适用对象了
-->
<servlet>
<servlet-name>myweb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自定义springmvc配置文件的位置-->
<init-param>
<!--springmvc的配置文件的位置属性-->
<param-name>contextConfigLocation</param-name>
<!--指定自定义文件的位置: 类路径下,名字叫做springmvc.xml-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--在tomcat启动后,创建servlet对象,load-on-startup表示tomcat启动后创建对象的顺序,
它的值是整数,数值越小,tomcat创建对象的时间越早,大于等于0的整数-->
</servlet>
<!--使用框架的时候 , url-pattern可以使用两种值
1.使用扩展名方式,语法 *.xxxx ,xxxx是自定义的扩展名。 常用的方式 *,do,*,action,*.mvc等等
http://localhost;8080/myweb/some.do
http://localhost:8080/myweb/other.do
2.使用斜杠“/"
-->
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<url-pattern>*.do</url-pattern>
<!--*.do:凡是.do结尾的请求都交给名字叫做myweb的中央调度器处理-->
</servlet-mapping>
<filter>
<!--注册、声明过滤器,解决post请求乱码的问题-->
<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>
<!--强制请求对象 ( HttpServletRequest ) 使用encoding编码的值-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--强制应答对象 ( HttpServletResponse ) 使用encoding编码的值-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!--强制所有的请求先通过过滤器处理-->
</filter-mapping>
</web-app>
@RequestParam:
请求中参数名和处理器方法的形参名不一致的问题
@RequestParam
还个接收请求参数中解决请求中参数名形参名不一样的问题
属性 : 1.value 请求中的参数名称
2.required 是-boolean,默认是true
true : 表示请求中必须包含此参数。
位置:
在处理器方法的形参定义的前面