Spring MVC参数处理

    • 使用Servlet API作为参数
      • HttpServletRequest
      • HttpServletResponse
      • HttpSession
    • 使用流作为参数
    • 总结


Spring MVC通过分析处理处理方法签名,将HTTP请求信息自动绑定到处理方法的参数中。

@RequestMapping : 获取前台传递的参数

    @RequestMapping("/p1")
    public String param1(String uname,String pwd){
        //接收参数
        //调用业务层
        //调用Dao。。。。
        if("admin".equals(uname)&&"123".equals(pwd)){
            //登录成功
        }else{
            //登录失败
        }
        System.out.println("uname="+uname+",pwd="+pwd);
        return "hello";
    }

@RequestHeader : 将请求头中的属性值绑定到处理方法的参数中。

@RequestMapping("/p4")
    public String param4(@RequestHeader("Cookie")String cookie){
        System.out.println("cookie:"+cookie);
        return "hello";
    }

@CookieValue: 将请求中的Cookie的值绑定到处理方法的参数中。

@RequestMapping("/p5")
    public String param5(@CookieValue("JSESSIONID")String sessionid){
        return "hello";
    }

使用POJO,Spring MVC 会将请求参数和POJO中的属性进行匹配,自动填充属性,并支持级联。

@RequestMapping("/p6")
    public String param6(User user){
        //new User
        //set+Uname
        System.out.println(user);
        return "hello";
    }

使用Servlet API作为参数

HttpServletRequest

@RequestMapping("/s1")
    public String s1(HttpServletRequest request){
        System.out.println(request.getParameter("uname"));
        System.out.println(request.getParameter("pwd"));
        request.setAttribute("sex", "man");
        return "hello2";
    }

HttpServletResponse

/**
     * 方法返回值可以是void
     * 如果没有HttpServletResponse,返回值一定不能是void
     */
    @RequestMapping("/s2")
    public void s2(HttpServletResponse response) throws IOException{
        /*response.sendRedirect("../WEB-INF/pages/hello2.jsp");*/
        response.sendRedirect("../test.jsp");
    }


@RequestMapping("/s3")
    public void s3(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        request.getRequestDispatcher("../test.jsp").forward(request, response);
    }

HttpSession

/**
     * 把User保存在session中
     * @param session
     */
    @RequestMapping("/s4")
    public String s4(HttpSession session,User user){
        session.setAttribute("user", user);
        return "hello3";
    }
  • @SessionAttributes(“user”)
  • @SessionAttributes:
  • 可以把模型数据当中对应的对象存储到session中
  • session.setAttr(“user”,request.getAttr(“user”))
public class SessionController {

    @RequestMapping("/se1")
    public String sess1(User user,Notice notice) {
        return "hello6";
    }

    /**
     * 如果参数列表当中有两个类型相同的参数,只会在模型数据中存储一个
     * 使用@ModelAttribute可以给两个类型相同的对象做区分,
     * 让他们都可以存储在模型数据中
     * 如果遇到有两个类型相同并且都需要存储到session中时,
     * 可以使用model去解决问题
     */
    @RequestMapping("/se2")
    public String sess2(User user,User user2,Model model) {
        model.addAttribute("user", user);
        model.addAttribute("user2", user2);
        return "hello6";
    }

}

使用流作为参数

InputStream

OutputStream

@RequestMapping("/s5")
    public void s5(OutputStream os) throws IOException{
        os.write(new String("hcfgyhgghyvf").getBytes());
    }

Reader

Writer

    @RequestMapping("/s6")
    public void s6(PrintWriter writer) {
        writer.print("asdfghjkl");
    }

总结:

  • request,response,session 可以直接使用,不需要创建这个对象的类型
  • 如果涉及到页面跳转,尽量不要使用request,response
  • 如果使用了request和response进行页面跳转,它就不再使用视图解析器去匹配页面了(需要根据当前控制器的路径去匹配)
  • 方法带返回值:String要在控制器当中做页面的跳转。(普通的控制器)
  • 方法不带返回值:
  • 1.通过request(转发)或者response(重定向)这里两个对象去做跳转
  • 2.通过OutputStream或Writer直接在也页面显示内容。(前台是Ajax访问获取数据时)
  • 如果返回值是void可以搭配ajax使用(ajax拿到的就是当前控制器的信息)
  • 如果返回值不是void,必然要跳转页面。

你可能感兴趣的:(➹➹➹②SpringMVC)