SpringMvc_请求处理
Spring MVC 框架也是一个基于请求驱动的 Web 框架,并且使用了前端控制器模式(是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理来进行设计,再根据请求映射规则分发给相应的页面控制器(动作/处理器)进行处理
一、请求参数处理
1.SpringMvc对请求参数的处理
@RequestParam:获取请求的参数
如何获取SpringMVC中请求中的信息 默认情况下,可以直接在方法的参数中填写跟请求一样的名称,此时会默认接受参数 如果有值,直接赋值,如果没有,那么直接给空值 @RequestParam:获取请求中的参数值,使用此注解之后,参数的名称不需要跟请求 的名称一致,但是必须要写
此注解还包含三个参数: value:表示要获取的参数值 required:表示此参数是否必须,默认是true,如果不写参数那么会报错, 如果值为false,那么不写参数不会有任何错误 defaultValue:如果在使用的时候没有传递参数,那么定义默认值即可
示例:
@RequestMapping("/bobo")
public String bobo(@RequestParam(value = "username", defaultValue = "徐庶") String name) {
System.out.println(name);
return "index.jsp";
}
@RequestHeader:获取请求头信息
如果需要获取请求头信息该如何处理呢? 可以使用@RequestHeader注解, 如果要获取请求头中没有的信息,那么此时会报错 同样,此注解中也包含三 个参数,跟@RequestParam一样 value required defalutValue
示例:
@RequestMapping("/header")
public String header(@RequestHeader("Host") String host){
System.out.println(host);
return "/index.jsp";
}
@CookieValue:获取cookie中的值
如果需要获取cookie信息该如何处理呢? 可以使用@CookieValue注解 如果要获取cookie中没有的信息,那么此时会报错 同样,此注解中也包含三 个参数,跟@RequestParam一样 value required defalutValue
示例:
@RequestMapping("/cookie")
public String cookie(@CookieValue("JSESSIONID") String jsessionId){
System.out.println(jsessionId);
return "/index.jsp";
}
2.乱码问题的解决
我们在表单或者发送请求的时候,经常会遇到中文乱码的问题 那么 如何解决乱码问题呢?
GET请求:修改tomcat的server.xml,在Connector标签后面+ URIEncoding=“utf-8” POST请求:编写过滤器进行实现
在web.xml中加入过滤器进行实现POST请求 注:此过滤器要写在其他过滤器前面,否则不起作用
<!-- 解决编码识别问题-->
<filter>
<filter-name>characterEncodingFileter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- encoding 编码格式-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 同时开启请求和响应的编码设置 -->
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFileter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
3.SpringMvc对原生API的支持
springMvc中的handler可以接收如下的servletAPI:
1.HttpServletRequest 2.HttpServletResponse 3.HttpSession 4.java.security.Principal 5.Locale 6.InputStream 7.OutputStream 8.Reader 9.Writer
通过导入Tomcat中lib文件下的service和jsp包 导入依赖 示例:
@RequestMapping("/servlet")
public String servlet(String username , HttpServletRequest request, HttpServletResponse response){
System.out.println(username);
String name = request.getParameter("name");
System.out.println(name);
request.setAttribute("name",name);
return "/index.jsp";
}
二、请求映射处理
1.@RequestMapping
作用:将请求和处理请求的控制器方法关联起来,建立映射关系。 @RequestMapping用来匹配客户端发送的请求,可以在方法上使用, 也可以在类上使用。 方法:表示用来匹配要处理的请求 类上:表示为当前类的所有方法的请求地址添加一个前置路径,访问 的时候必须要添加此路径
@RequestMapping就是用来标识此方法用来处理什么请求,其中的/可以取消 取消后默认也是从当前项目的根目录开始查找,一般在编写的时候看个人习惯 同时,@RequestMapping也可以用来加在类上,
@RequestMapping("/bobo1")
public String bobo1(User user) {
System.out.println(user);
return "index.jsp";
}
2.@PathVariable
此注解就是提供了对占位符URL的支持,就是将URL中占 位符参数绑定到控制器处理方法的参数中。 @PathVariable 用在参数上面的 专门用来获取URL目录级别的参数 比如 http://localhost:8080/springmvc/path/user/123/xushu 要获得123 @RequestMapping(“/user/{id}”) : @PathVariable(“id”) Int eger id 10
示例:
@RequestMapping("/user/{id}/{username}")
public String path01(@PathVariable("id") Integer id,@PathVariable("username") String name)
{
System.out.println(id);
System.out.println(name);
return "/index.jsp";
}
3.REST
REST即表述性状态传递(英文:Representational State Transfer, 简称REST)是RoyFielding博士在2000年他的博士论文中提出来的一种软件架 构风格。 它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。 一种相较与之前URL所产生一种更优雅的URL风格
如果是原来的架构风格,需要发送四个请求,分别是? 查询用户:http://localhost:8080/app/user.do?action=getUser&id=xxx GET 增加用户: http://localhost:8080/app/user_add.do POST 修改用户: http://localhost:8080/app/xiugaiuser.do POST 删除用户: http://localhost:8080/app/delete.do?id=1 GET/POST
让不同的请求方式表示不同的请求类型就可以简化我们 的查询,改成名词 看URL就知道要什么看http method就知道干什么 查询用户: http://localhost:8080/xxx/user/1 GET --查询 查询多个用户: http://localhost:8080/xxx/users GET 新增用户: http://localhost:8080/xxx/user POST ---新增 修改用户: http://localhost:8080/xxx/user/1 PUT --修改 删除用户:http://localhost:8080/xxx/user/1 DELETE --删除
对网络上所有的资源都有一个资源标志符; 对资源的操作不会改变标识符; 同一资源有多种表现形式(xml、json); 所有操作都是无状态的(Stateless) 符合上述REST原则的架构方式称为RESTful;
HiddenHttpMethodFilter:浏览器 form 表单只支持 GET与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与DELETE 请求。 在web.xml中配置过滤器,来实现delete和put方法
<!-- 处理html不支持rest中put和delete-->
<filter>
<filter-name>hiddenHttpMethod</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethod</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
@Controller
@RequestMapping("/rest")
public class RestController {
@GetMapping("/user/{id}")
public String get(@PathVariable("id") Integer id){
System.out.println("查询用户:"+id);
return "/index.jsp";
}
@PostMapping("/user")
public String add(User user){
System.out.println("新增用户:"+user);
return "/index.jsp";
}
@PutMapping("/user/{id}")
public String update(User user){
System.out.println("修改用户:"+user);
return "/index.jsp";
}
@DeleteMapping("/user/{id}")
public String delete(@PathVariable("id") Integer id){
System.out.println("删除用户:"+id);
return "/index.jsp";
}
}
4.静态资源的访问
当页面中包含静态资源的时候我们能够正确的获取到吗? 在自己设置的xml文件中加入一个配置 我这里图片放在web文件夹下的image文件夹中
<mvc:default-servlet-handler/>
<!-- <mvc:annotation-driven></mvc:annotation-driven>-->
<mvc:resources mapping="/images/**" location="/image/"/>
访问静态资源,只要在xml文件中加入如下配置即可:
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
|