SpringMVC注解式开发
1.在类上添加@RequestMapper
可将所有请求的公共部分,提取出
2.@RequestMapper:请求映射
属性: method
表示请求的方式。它的值RequestMethod类枚举值。
例如表示get请求方式,RequestMethod.GET,post方式,RequestMethod.POST
3.处理器方法的参数
处理器方法可以包括一下四类参数,这些参数会在系统调用时由系统自动赋值
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 请求中所携带的参数
接收用户提交的参数
- 逐个接收
- 对象接收
逐个接收请求参数
要求:处理器(控制器)方法的形参名和请求中参数名必须一致,同名的请求参数赋值给同名的形参
框架接收请求的参数
-
使用request对象接收请求参数
- String strName = request.getParameter(“name”)
- String strAge = request.getParameter(“age”)
-
SpringMVC框架通过DispatcherServlet调用MyController的doSome()方法,调用方法时,按名称对应,把接收的参数赋值给形参
框架会提供类型转换的功能,能把String转为int ,long,float,double等类型
@Controller
public class MyController {
@RequestMapping(value = "/receiveproperty.do")
public ModelAndView doSome(String name, Integer age) {
ModelAndView mv = new ModelAndView();
mv.addObject("myName", name);
mv.addObject("myAge", age);
mv.setViewName("show");
return mv;
}
}
<form action="receiveproperty.do" method="post">
姓名:<input type="text" name="name"> <br/>
年龄:<input type="test" name="age"> <br/>
<input type="submit" value="提交参数">
</form>
过滤器
注意:在提交请求时,get请求方式没有乱码,使用post方式提交请求,中文有乱码,需要使用过滤器处理乱码问题
过滤器可以自定义,也可以使用框架中提供的过滤器 CharacterEncodingFilter
<!--注册声明过滤器,解决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>
<!--强制请求对象(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>
请求中参数名与形参名不一样的问题
@RequestParam:解决请求中参数名与形参名不一样的问题
属性:
- value 请求中的参数名称
- required 是一个boolean,默认为true,true:表示请求中必须包含该参数
位置:在处理器方法的形参定义的前面
对象接收
- 创建一个类,类属性名与参数名保持一致
- 处理器方法形参是Java对象,这个对象的属性名和请求中参数名一样
- 框架会创建形参的Java对象,给属性赋值。请求中的参数是name,框架会调用setName()
4.处理方法的返回值
4.1返回ModelAndView
有数据和视图,对视图执行forward
4.2返回String
表示视图,可以逻辑名称,也可以完整视图
若有完整路径则不可以有视图解析器
4.3void
不能表示数据,也不能表示视图,在处理ajax的时候,可以使用void返回值。通过HttpServletResponse输出数据,响应ajax请求.
ajax请求服务器端返回的就是数据,和视图无关。
4.4Object
对象是属性,属性就是数据,所以返回Object表示数据,和视图无关。可以使用对象表示数据,响应ajax请求
现在做ajax,主要使用json的数据格式。实现步骤:
- 加入处理json的工具库的依赖,SpringMVC默认使用的jackson。
- 在SpringMVC配置文件中加入
<mvc:annoction-driven>
注解驱动 - 在处理器方法的上面加入@ResponseBody注解
SpringMVC处理器方法返回Object,可以转为json输出到浏览器,响应ajax的内部原理
-
<mvc:annoction-driven>
注解驱动。注解驱动实现的功能是 完成Java对象到json,xml,text,二进制等数据格式的转换
HttpMessageConveter接口:消息转换器
功能:定义Java转为json,xml等数据格式的方法。
-
@ResponseBody注解
放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求
返回对象框架的处理流程
- 框架会把返回的Student类型,调用框架中
ArrayList<HttpMessageConverter>
中每个类的canWrite()方法检查哪个 HttpMessageConverter 接口的实现类能处理Student类型的数据。 - 框架会调用实现类的write() 将对象转为json
- 框架会调用@ResponseBody将 2 的结果数据输出到浏览器,ajax请求处理完成
/**
* 处理器方法返回一个Student,通过框架转为json,响应ajax请求
*/
@RequestMapping(value = "/returnStudentJson.do")
@ResponseBody
public Student doStudentJsonObject(String name, Integer age) {
//调用service,获取请求结果数据,Student对象表示结果数据
Student student = new Student();
student.setName("name");
student.setAge(1);
//会被框架转为Json
return student;
}
/**
* 处理器方法返回List<Student>
*/
@RequestMapping(value = "/returnStudentJsonArray.do")
@ResponseBody
public List<Student> doStudentJsonObjectArray(String name, Integer age) {
List<Student> list = new ArrayList<>();
//调用service,获取请求结果数据,Student对象表示结果数据
Student student = new Student();
student.setName("name");
student.setAge(1);
list.add(student);
student = new Student();
student.setName("name2");
student.setAge(2);
list.add(student);
student = new Student();
student.setName("name3");
student.setAge(3);
list.add(student);
System.out.println(list);
return list;
}
4.5返回String表示数据,不是视图
区分返回值String是数据,还是视图,看有没有@ResponseBody注解,如果有@ResponseBody注解,返回String就是数据
/**
* text/plain;charset=ISO-8859-1
* 解决作为乱码
* 给RequestMapping增加一个属性 produces,使用这个属性指定新的contentType
*/
@RequestMapping(value = "/returnStringData.do", produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData() {
return "返回对象,表示数据";
}
5.中央调度器url-pattern设置为 /
tomcat本身能处理静态资源的访问,像html,图片,js文件都是静态资源
<url-pattern>/</url-pattern> <!--表示静态资源和未映射的请求都由这个default处理-->
- 处理静态资源
- 处理未映射到其他servlet请求
<!--
使用"/" 它会代替tomcat中的default
导致所以的静态资源都给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力
没有控制器对象能处理静态资源的访问,所以静态资源都是404
动态资源可以访问
-->
<servlet-mapping>
<servlet-name>sprinigmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
5.1第一种处理静态资源的方式
需要在SpringMVC配置文件中加入<mvc:default-servlet-handler>
原理:
加入这个标签后,框架会创建控制器对象DefaultServletHttpRequestHandler(类似与我们自己创建的MyController)
DefaultServletHttpRequestHandler 这个对象可以把接收的请求转发给 tomcat的default这个servlet
default-servlet-handler 和 @RequestMapping注解有冲突,需要加入annotation-driven(注解驱动)
5.3第二种
mvc:resources
加入后框架会创建 ResourceHttpRequestHandler这个处理器对象,让这个对象处理静态资源,不依赖tomcat服务器
<!--
第二种
mapping:访问静态资源的uri地址,使用通配符 **
location:静态资源在项目的目录位置
-->
<mvc:resources mapping="/html/**" location="/html/"></mvc:resources>
<!--注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
resources 和 @RequestMapping注解有冲突,需要加入annotation-driven(注解驱动)