2.SpringMVC-请求处理

1,请求参数处理(请求参数获取)

请求参数获取就是当前端发起请求过后,后端程序获取请求里携带参数的过程.

1.SpringMVC 获取请求参数,是把请求参数 以key/value的形式,绑定到 Controller中的方法的形参上。而不是把请求参数作为 Controller类的私有成员变量 。

2 Springmvc中只需要在处理方法中声明对应的参数就可以自动接收请求的参数并且还可以自动转换类型

1.获取请求参数的方式

1.对于基本型,我们可以直接把形参的名字和请求参数的name 一一对应即可。

注意事项:

1.请求参数如果是基本型,尽量使用基本型的包装类,如果传参时没有传递和形参名字一样的参数,那么这个形参会被自动的负值为null,而基本型不能为null,会报错。

2.如果表单当中,有对应的name的输入框,而没有写值直接提交,后台获取的是 一个 ""的字符串,此时后台应该用String接受

3.如果输入框里 没有填值提交,那么对于字符串 得到的是 "" 而其他的包装类 得到的是 null

4.如果 参数的名字和 形参名不一样 可以在 方法的形参前 加上注解

@RequestParam("请求参数名")

  @RequestMapping("param2")
    public String methdo2(@RequestParam("uname") String username){
        System.out.println("执行了method2");
        System.out.println(username);
        return "index.jsp";
    }

ps:一旦加入 @RequestParam("")注解 那么请求的参数中,必须携带同名的参数。否则方法不会被执行

@RequestParam 注解的属性:

  • value/name 等同于前端的请求参数的名字
  • required 是否必须提交该参数
  • defaultValue 在没有提交参数时的默认值

2.对与基本型的数组而言,只需要前端参数的名字和方法形参名字一样即可,同时形参的类型为

基本型的数组即可

 // 对于基本型的数组 ,只需要 前端参数的名字 和 方法形参的名字 一致即可 不需要参数名字后加[1]
    @RequestMapping("param3")
    public String methdo2(String[] names){
        for(String name:names){
            System.out.println(name);
        }
        return "index.jsp";
    }

3.对于基本型的集合,必须要在 方法的形参前 加上@RequestParam()注解,形参类型为基本型的集合(List 或者 Set,不推荐使用Set) 注解里的value要和前端请求的参数一样

 

 @RequestMapping("param4")
    public String methdo2(@RequestParam("names") Set<String> names){
        for(String name:names){
            System.out.println(name);
        }
        return "index.jsp";
    }

4.对于map类型,在方法的形参前 加上 @RequestParam (不去备注名字),则会把请求参数中的所有参数都以 name-value的形式放入到 map中去

 

 @RequestMapping("param5")
    public String methdo5(@RequestParam Map<String,String> map){
        System.out.println(map);
        return "index.jsp";
    }

5.对于pojo类型,请求参数的名字和对象的属性名一样即可,注意不是和形参的对象的名字一样。

pojo

package com.edu.bean;
​
import java.util.List;
​
public class User {
​
    private String username;
​
    private String password;
​
    private int age;
​
    private House house;
​
    private List<String> hobbyList;
​
    private List<Car> cars;
​
    public List<Car> getCars() {
        return cars;
    }
​
    public void setCars(List<Car> cars) {
        this.cars = cars;
    }
​
    public List<String> getHobbyList() {
        return hobbyList;
    }
​
    public void setHobbyList(List<String> hobbyList) {
        this.hobbyList = hobbyList;
    }
​
    public House getHouse() {
        return house;
    }
​
    public void setHouse(House house) {
        this.house = house;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public String getUsername() {
        return username;
    }
​
    public void setUsername(String username) {
        this.username = username;
    }
​
    public String getPassword() {
        return password;
    }
​
    public void setPassword(String password) {
        this.password = password;
    }
​
    public User() {
    }
​
​
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
​
​
package com.edu.bean;
​
public class House {
​
    private String houseName;
​
    private String houseAddress;
​
    public String getHouseName() {
        return houseName;
    }
​
    public void setHouseName(String houseName) {
        this.houseName = houseName;
    }
​
    public String getHouseAddress() {
        return houseAddress;
    }
​
    public void setHouseAddress(String houseAddress) {
        this.houseAddress = houseAddress;
    }
}
​
​
package com.edu.bean;
​
public class Car {
​
    private String carName;
​
    private String color;
​
    public String getCarName() {
        return carName;
    }
​
    public void setCarName(String carName) {
        this.carName = carName;
    }
​
    public String getColor() {
        return color;
    }
​
    public void setColor(String color) {
        this.color = color;
    }
​
    @Override
    public String toString() {
        return "Car{" +
                "carName='" + carName + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/param/param7" method="post">
      <input type="text" name="username" >
      <input type="text" name="password" >
      <input type="text" name="house.houseName" >
      <input type="text" name="house.houseAddress" >
      <input type="checkbox" value="sing" name="hobbyList">唱
      <input type="checkbox" value="dance" name="hobbyList">跳
      <input type="checkbox" value="basketball" name="hobbyList">篮球
      <input type="text" name="cars[0].carName">
      <input type="text" name="cars[0].color">
      <input type="text" name="cars[1].carName">
      <input type="text" name="cars[1].color">
      <input type="submit">
    </form>
  </body>
</html>

 @RequestMapping("param7")
    public String method7(User user){
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        System.out.println(user.getHouse().getHouseName());
        System.out.println(user.getHouse().getHouseAddress());
        for(String s:user.getHobbyList()){
            System.out.println(s);
        }
        for(Car c:user.getCars()){
            System.out.println(c);
        }
        return "index.jsp";
 }

 

 

ps:如果对象的属性 是另外一种对象,在页面上 写属性名.属性 即可

  • 如果对象的属性 是某种基本型的 数组或者是集合 请求参数的名字 直接写 属性名即可

  • 如果对象的属性 是某种复杂类型的 数组或者集合 在页面上传参时 属性[索引].属性

  • 如果方法的参数 希望是 一个复杂性的 数组或者复杂型的集合,建议数组或者集合,放到一个对象中去,作为对象的属性。

2.SpringMVC对请求参数的处理

1.获取请求头中的数据(比如 浏览器信息 ip地址等等)

1.通过上述方式 获取到 request对象,再通过request的相关方法 获取 请求头中的数据

2.在controller中的方法中 直接使用 @RequestHeader(“请求头的数据名”) 进行注入

该注解的 其他属性和 @RequestParam 类似

@RequestMapping("/header")
public String header(@RequestHeader("User‐Agent") String agent){
    System.out.println(agent);
    return "success";
}

2.获取Cookie中的信息

1.向cookie中添加数据:自行查看去年的笔记

2.获取cookie

a.获取request对象,再获取 该请求中所有的 cookie的数组 再通过getName 和getValue进行获取

b.直接使用 @CookieValule("cookie的Name") 直接把需要的值 注入到后面参数中

@CookieValue的其他属性和 @RequestHeader 类似

@RequestMapping("/cookie")
public String cookie(@CookieValue("JSESSIONID") String id){
    System.out.println(id);
}

3.处理中文乱码问题

SpringMVC提供了 用于处理编码格式的过滤器:CharacterEncodingFilter,只需要配置其编码格式即可

 <filter>
        <filter-name>characterFilter</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>
  </filter>
  <filter-mapping>
      <filter-name>characterFilter</filter-name>
      <servlet-name>springmvc</servlet-name>
  </filter-mapping>

对于get请求 只需要在 tomcat的conf下 修改 server.xml

添加URIEncoding=“UTF­8”

4.SpringMVC获取ServletAPI

什么是ServletAPi?

简单的说 就是我们在使用原始Servlet的时候 会用到的一些接口 比如 HttpServletRequest,HttpServletReponse,

HttpSession,ServletContext

获取方式

需要使用 request,response,session对象的时候,直接在Controller里的方法中加入 对应数据类型的参数,而对于 application对象的获取 需要通过request对象间接获取。

 @RequestMapping("/login2")
    public void userLogin2(HttpServletRequest request, HttpServletResponse resp, HttpSession session) throws ServletException, IOException {
        System.out.println( request.getParameter("username"));
        System.out.println( request.getParameter("password"));
        System.out.println( request.getParameter("trueName"));
        HttpSession session1 = request.getSession();
        ServletContext application = request.getServletContext();
        System.out.println(application);
        System.out.println(session1 == session);
        request.getRequestDispatcher("/success.jsp").forward(request,resp);
 }

2.请求映射处理

1.@RequestMapping

使用@RequestMapping 把请求的URL 和具体的方法 绑定在一起。

1.RequestMapping 可以放在类上面,用于接受请求

2.也可以放在方法上面,用于接受请求

3.当类和方法上都有时,请求的URL 应该是两者拼接起来

4.整个项目中 不能有相同的RequestMapping的值 作用于不同的方法上。

5.RequestMapping的一些其他属性

value name path 用于映射请求的URL

method 用于映射 可接受的 请求的类型 (RequestMethod.POST,GET,PUT,DELETE)

params 用于规定 请求中 必须携带的参数

header 规定 请求头中 必须携带的 数据

6.RequestMapping 中的请求路径 可以使用 通配符

?表示一个字符

*表示任意个任意字符或者一级目录

**表示多级目录

2.@PathVariable

获取请求的URL中的参数

1.获取请求URL中的参数 并不是在URL中 通过? 去绑定参数的形式,而是URL中的某一部分,作为请求中的参数。核心即时@PathVariable注解

2.使用方法

a.在 @RequestMapping中使用 {参数名} 表示一个占位符

b.如果URL中的参数 是基本型,通过@PathVariable(“参数名”) 去绑定给 方法里的形参

c.如果请求参数 是一个引用型对象,则直接在形参中写对象,但是占位符的参数名要和对象的属性名一致

d.允许通过多级目录去使用多个占位符

@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.静态资源配置

对于 css文件 js文件 html文件 以及项目中用到的图片 在访问时 是不需要经过DispatcherServlet的。如果不配置 或默认认为是一个 Get请求,回去找相关的Controller和方法,无疑是找不到的。

配置的方式

<!-- 开启mvc的注解驱动-->
   <mvc:annotation-driven></mvc:annotation-driven>
   <!-- 当请求的url符合某种格式的时候,请求不再通过 springmvc 还是直接定位到某个文件夹   -->
   <mvc:resources mapping="/resource/**" location="/resource/"></mvc:resources>
阅读剩余
THE END