龙空技术网

Spring MVC请求处理

Iliuhu 63

前言:

而今各位老铁们对“mvc接收list”大概比较注意,兄弟们都想要学习一些“mvc接收list”的相关文章。那么小编在网上搜集了一些对于“mvc接收list””的相关文章,希望同学们能喜欢,各位老铁们快快来学习一下吧!

MVC三层架构三层架构MVCSpring MVC的实现原理DispatcherServlet ===> 前端控制器

配置DispatcherServlet映射

url-pattern

① / ===> 除了.jsp的请求都会被匹配 (推荐使用)

② /* ===> 所有的请求都会匹配

③ *.do、*.action ===> 结尾以.do或者.action的请求会匹配

④ /request/* ===> 要进行约定 将jsp放在/views/ 所有的servlet请求都用/request/

<!--web.xml--><?xml version="1.0" encoding="UTF-8"?><web-app xmlns=";         xmlns:xsi=";         xsi:schemaLocation=" ;         version="4.0">    <servlet>        <servlet-name>springmvc</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <!--初始化参数            contextConfigLocation 配置springmvc的xml配置文件,指定路径            也可以不配置: 会自动WEB-INF去找, springmvc-servlet.xml文件        -->        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:spring-mvc.xml</param-value>        </init-param>        <!--启动时加载servlet:            当web服务器 启动时就会创建servlet(会自动调用servlet的构造函数及init()方法)        -->        <load-on-startup>1</load-on-startup>    </servlet>    <!--配置DispatcherServlet映射        springmvc映射的路径为:        /               除了.jsp的请求都会被匹配        /*              所有的请求都会匹配        *.do *.action   url结尾以.do或者.action的请求会匹配        /request/*      要进行约定 将jsp放在/views/ 所有的servlet请求都用/request/    -->    <servlet-mapping>        <servlet-name>springmvc</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping></web-app>
Spring MVC 解决中文乱码问题
<!--配置编码过滤器, 解决中文乱码问题--><filter>    <filter-name>characterEncodingFilter</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>forceEncoding</param-name>        <param-value>true</param-value>    </init-param></filter><!--配置拦截哪些请求进行过滤--><filter-mapping>    <filter-name>characterEncodingFilter</filter-name>    <!--拦截规则 有两种规则-->    <!--① 根据url请求进行匹配-->    <!--<url-pattern></url-pattern>-->    <!--② 指定过滤哪个servlet-->    <servlet-name>springmvc</servlet-name></filter-mapping
请求参数

》》》RequestParam:获取请求的参数

基本数据类型参数传递

package com.demo.controllers;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * 在springmvc中只需要在处理方法中声明对应的的参数就可以自动接收请求的参数并且还可以自动转换类型 * *  如果类型未匹配会报400 * *  基本数据类型匹配规则: *      请求的参数必须跟处理方法的参数名一致 *          如果处理方法的参数未传入的情况会自动传入null *   *      请求的参数跟处理方法的参数不一致 *          @RequestParam 管理请求参数 *              value: 用来重命名参数 *              required: 用来指定参数是否必须传入值 *                     true:默认 必须传入值,不传值会报400 *                     false: 可以不用传入值 *              defaultValue: 当参数为null的时候会自动设置一个默认值 *              注意:基本数据类型是无法接收null;当设置了默认值可以省略required=false *					处理请求参数乱码: *									GET: 直接设置tomcat目录下conf/server.xml 里面<Connector URIEncoding="UTF-8" *									POST: ① 在servlet, 在获取参数之前 设置request.setCharacterEncoding("UTF-8"),每个请求都需要处理一次,非常麻烦 *														 ② 推荐使用过滤器处理乱码问题。 *														 ③ 在Spring MVC, 解决乱码问题:CharacterEncodingFilter, 需在web.xml中配置 *								 */@Controllerpublic class ParamsController {    @RequestMapping("/params")    public String params(@RequestParam(value="username", required = true, defaultValue = "heihei") String name) {        System.out.println("name = " + name);        // 响应        // redirect  重定向        // forward 转发 ===> 默认        return "/index.jsp";    }}
复杂类型参数传递
package com.demo.controllers.entity;import lombok.Data;import java.util.List;import java.util.Map;@Datapublic class User {    private Integer id;    private String name;    private String[] alias;    private List<String> hobbies;    private Map<String, String> relatives;    private Role role;    private List<User> friends;}
package com.demo.controllers.entity;import lombok.Data;@Datapublic class Role {    private Integer id;    private String name;}
package com.demo.controllers.entity;import lombok.Data;@Datapublic class UserDTO {    private User user;    private Role role;}
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body>    <h2>简单参数</h2>    <%--${pageContext.request.contextPath}: 动态获取项目路径--%>    <form action="${pageContext.request.contextPath}/params01" method="post">        姓名:<input name="username" type="text" /> <br />        <input type="submit" value="提交">    </form>    <h2>复杂参数</h2>    <form action="${pageContext.request.contextPath}/params02" method="post">        id:<input name="user.id" type="text" /> <br />        姓名:<input name="user.name" type="text" /> <br />        别名: <input name="user.alias" type="checkbox" value="AA1" checked />AA1 <br />             <input name="user.alias" type="checkbox" value="AA2" checked />AA2        爱好: <input name="user.hobbies" type="checkbox" value="BB1" checked />BB1 <br />            <input name="user.hobbies" type="checkbox" value="BB2" checked />BB2        亲属: <input name="user.relatives['k1']" type="checkbox" value="CC1" checked />CC1 <br />            <input name="user.relatives['k2']" type="checkbox" value="CC2" checked />CC2        角色:<input name="user.role.name" type="text" /> <br />        朋友:<input name="user.friends[0].name" type="text" value="张三"/> <br />        <input name="user.friends[1].name" type="text" value="李四"/> <br />        <h2>新增角色</h2>        id:<input name="role.id" type="text" /> <br />        角色:<input name="role.name" type="text" /> <br />        <input type="submit" value="提交">    </form></body></html>
package com.demo.controllers;import com.demo.controllers.entity.User;import com.demo.controllers.entity.UserDTO;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;/** * 在springmvc中只需要在处理方法中声明对应的的参数就可以自动接收请求的参数并且还可以自动转换类型 * *  如果类型未匹配会报400 * *  类型匹配规则: *      请求的参数必须跟处理方法的参数名一致 *          如果处理方法的参数未传入的情况会自动传入null * *      请求的参数跟处理方法的参数不一致 *        基本数据类型参数: *          @RequestParam 管理请求参数 *              value: 用来重命名参数 *              required: 用来指定参数是否必须传入值 *                     true:默认 必须传入值,不传值会报400 *                     false: 可以不用传入值 *              defaultValue: 当参数为null的时候会自动设置一个默认值 *              注意:基本数据类型是无法接收null;当设置了默认值可以省略required=false * *       复杂类型参数: *             不用加上对象,直接传入对象的属性名 *              包装类型:直接输入属性名 ===> name="id" *              数组: 表单元素要同样的name ===> name="alias" *              List: 必须加上[index] ===> name=list[0]  如果List<User>  name="list[0].name" *              Map: 必须加上[key] ===> name="map['key']" *              实体类: 只能给某个属性赋值 ===> name="object.xxx" *              注意: 如果出现多个对象(User user, Role role)参数的情况 建议再次封装一层javaBean (DTO data transfer object) */@Controllerpublic class ParamsController {    @RequestMapping("/params01")    public String params01(@RequestParam(value="username", required = true, defaultValue = "heihei") String name) {        System.out.println("name = " + name);        // 响应        // redirect  重定向        // forward 转发 ===> 默认        return "/index.jsp";    }    @RequestMapping("/params02")    public String params02(UserDTO userDTO) {        System.out.println("userDTO = " + userDTO);        return "/index.jsp";    }}

》》》RequestHeader:获取请求头信息

/** * 获取请求头信息 * @param host * @return */@RequestMapping("/header")public String header(@RequestHeader("host") String host) {    System.out.println("host = " + host);    return "/index.jsp";}

》》》CookieValue:获取cookie的值

/** * 获取cookie * JSESSIONID: 客户端发送请求时,为了保证客户端和服务端数据一致性,服务端响应一个JSESSIONID给客户端,实际JSESSIONID依赖cookie * @param jsSessionId * @return */@RequestMapping("/cookie")public String cookie(@CookieValue("JSESSIONID") String jsSessionId){    System.out.println("jsSessionId = " + jsSessionId);    return "/index.jsp";}

》》》Spring MVC + Servlet API

/** * 使用原生的servlet API, 但未解决耦合问题 * Spring MVC 可以和 Servlet API结合一起使用 * @param request * @param response * @return */@RequestMapping("/servlet")public String servlet(String username, HttpServletRequest request, HttpServletResponse response) {    System.out.println("username = " + username);    String name = request.getParameter("name");    System.out.println("name = " + name);    request.setAttribute("name", name);    return "/index.jsp";}
请求映射RequestMapping

处理URL映射,将请求映射到处理方法中

如果放在类上,所有的方法都会被映射,进行模块化,防止方法中的请求重复映射

》》》RequestMapping| GetMapping/PostMapping

@RequestMapping(value = "/mapping01", method = RequestMethod.POST)public String mapping01() {    System.out.println("映射成功");    return "/index.jsp";}@PostMapping(value = "/mapping02")public String mapping02() {    System.out.println("请求方式等同于上方的请求方式");    return "/index.jsp";}
RequestMapping中参数

》》》params

/** * params: 设置请求必须携带某些参数 *            1. 必须要有某些参数 params = {"username"} *            2. 必须没有某些参数 params = {"!username"} *            3. 必须等于某值 params = {"username=liliu"} *            4. 必须不等于某值 params = {"username!=liliu"} * @return */@RequestMapping(value = "/params", params = {"username"})public String params() {    System.out.println("请求参数!");    return "/index.jsp";}

》》》headers

/** * 请求头必须包含指定的值 * @return */@RequestMapping(value = "/headers", headers = {"Connection: keep-alive"})public String headers() {    System.out.println("请求映射!");    return "/index.jsp";}

》》》consumes ===> 请求类型

/** *  consumes: 当前请求的内容类型必须为指定值 *            请求内容类型不匹配,报415 * * @return */@RequestMapping(value = "/consumes", consumes = {"application/x-www-form-urlencoded"})public String consumes() {    System.out.println("请求映射!");    return "/index.jsp";}

》》》produces ===> 响应内容类型

/** * 设置当前响应的内容类型 * @return */@RequestMapping(value = "/produces", produces = {"application/json"})public String produces() {    System.out.println("响应内容类型参数!");    return "/index.jsp";}
RequestMapping支持通配符
/** * 通配符的映射 * @return */@RequestMapping(value = "/**/ant")public String mapping06() {    System.out.println("通配符 **");    return "/index.jsp";}
@PathVariable
/** * @PathVariable 用在参数上面的 *               专门来获取URL目录级别的参数 *               单个参数接收必须要使用@PathVariable来声明对应的参数占位符名字 * @param id * @param username * @return */@RequestMapping("/user/{id}/{username}")public String path01(@PathVariable("id") Integer id, @PathVariable("username") String username) {    System.out.println("id = " + id);    System.out.println("username = " + username);    return "/index.jsp";}
/** * javaBean可以省略@PathVariable, 但是要保证占位符的名字和javaBean的属性名一致 * @param user * @return */@RequestMapping("/user02/{id}/{name}")public String path02(User user) {    System.out.println("user = " + user);    return "/index.jsp";}
REST

表述性状态传递(Representational State Tranfer, 简称REST)

RESTful:一种优雅的URL风格

》》》URL CRUD

》》》REST CRUD

<%@ page contentType="text/html;charset=UTF-8" language="java" %><% request.setAttribute("basepath", request.getContextPath()); %><html><head>    <title>Title</title></head><body>    <h2>简单参数</h2>    <%--${pageContext.request.contextPath}: 动态获取项目路径--%>    <form action="${basepath}/params01" method="post" >    </form>  </body></html>

解决报405的错误

form表单提交PUT和DELETE出现问题:会将PUT和DELETE作为GET提交,因为HTML无法支持PUT和DELETE

解决方案:

① 添加HiddenHttpMethodFilter过滤器

<!--处理HTML表单不支持REST中PUT和DELETE--><filter>    <filter-name>hiddenHttpMethodFilter</filter-name>    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping>    <filter-name>hiddenHttpMethodFilter</filter-name>    <servlet-name>springmvc</servlet-name></filter-mapping>

② 在表单中添加隐藏域

<form action="${basepath}/params01" method="post" >    <!--form的method:post, value: put或delete请求方式-->    <input type="hidden" name="_method" value="put" /></form>

》》》基于服务API的方式使用restful

package com.demo.controllers;import com.demo.controllers.entity.User;import org.springframework.web.bind.annotation.*;/** * 基于服务API的方式使用RESTful *      返回的数据基本是: JSON格式的 */@RestController@RequestMapping("/restful")public class RestfulController {    // 修改    @PutMapping("/user/{id}")    public String update(User user) {        System.out.println("修改用户: " + user);        // 返回的数据是JSON格式        return "{'msg':'success'}";    }    // 删除    @DeleteMapping("/user/{id}")    public String delete(@PathVariable("id") Integer id) {        System.out.println("删除用户: " + id);        // 返回的数据是JSON格式        return "{'msg':'success'}";    }}
静态资源处理
<?xml version="1.0" encoding="UTF-8"?><beans xmlns=";       xmlns:xsi=";       xmlns:mvc=";       xsi:schemaLocation="       ;>    <!--配置访问静态资源-->    <mvc:annotation-driven />    <!--第一种方式(推荐使用)        将映射的地址直接指向静态资源文件夹, Spring MVC就不会将此映射作为handler    -->    <mvc:resources mapping="/images/**" location="/images/"/>    <!--第二种方式: 尝试交给tomcat去处理的    当Spring MVC没有映射到某一个请求的时候,就会调用默认servlet处理    -->    <!--<mvc:default-servlet-handler />--></beans>

标签: #mvc接收list #aspnetmvc访问html #netcoremvc表单 #springmvc访问不到jsp #jssession