SpringMVC-2-(Controller)

一)参数类型

    @RequestMapping("hello4")
    @ResponseBody
    public ModelAndView Hello4(
//                                Servlet的三个参数
                               HttpServletRequest request,
                               HttpServletResponse response,
                               HttpSession session,
//                               传入接本数据类型和引用数据类型,注意要和前端同名
                               String name,
                               People people,
//                               和前端不同命的解决办法
                               @RequestParam("address1")String address,
//                               前段没有传值,设置默认值
                               @RequestParam(defaultValue = "27") int age,
//                               设置这个值一定要有,没有就报错
                               @RequestParam(required = true) String email,
//                               接前端传过来的复选框的值
                               @RequestParam("likes")List<String> list,
//                               前端写法
//                               <input type="text" name="peo.name"/>
//                               <input type="text" name="peo.age"/>
//                               另外再写一个实体类,属性就是前端传值的名
//                               public class Test {
//                                    private People people;
                               Test test,
//                               前端写法
//                               <input type="text" name="peo[1].name"/>
//                               <input type="text" name="peo[1].age"/>
//                               另外要写一个实体类,属性就是前端传值的list集合
//                               public class Test {
//                                    private People people;
//                                    private List<People> peoples;
                               Test test1,
//                               其实model和ModelAndView还有session都产不多用法,只是返回一个数据参见下边的代码
                               Model model
                               )
            throws ServletException, IOException {

        ModelAndView hello = new ModelAndView("main");
        Model model1 = model.addAttribute("name", "xupeilei");
        return hello;
    }

   restful风格:

<a href="hello1?name=aaa&age=27">普通风格</a>
<a href="hello2/bbb/17">result风格</a>
@RequestMapping("hello1/{name}/{age}")
    public ModelAndView Hello1(@PathVariable String name,@PathVariable String age) {
        System.out.println(name+"   "+age);
        System.out.println("hello springMVC控制器");
        ModelAndView hello = new ModelAndView("main");
        return hello;
    }

  参数绑定到实体类:

    有时间在写

  自定义参数绑定

    有事件在写

二)返回值类型及重定向和转发(默认方式都是请求转发)

  理解重定向和转发:

    重定向:

      相当于是浏览器发出请求,返回一个url浏览器再去请求这个url,这时浏览器是知道他请求到哪里去了,所以地址栏可以看到url的改变

    转发:

      服务器的行为,浏览器发出请求之后,服务器可能又去请求了其他的资源最终只返回一个数据或者模型,这时浏览器并不知道服务器到底做了什么,他只能显示他请求的url;

 

  @RequestMapping:会去找视图解析器

    String

@RequestMapping("hello2")
    public String hello2(){
//        转发
//        return "forward:/html/err.html";
//        return "forward:/hello1";
//        重定向
//        return "redirect:/html/err.html";
        return "redirect:/hello1";
//        通过视图解析器
//        return "main";
    }

    ModelAndView:

@Controller
public class HelloController {
    @RequestMapping("hello1")
    public ModelAndView hello1(){
        
//        自定义视图解析器找到main.jsp
//        ModelAndView modelAndView = new ModelAndView("main");
        
//        服务器转发,
//          跳转到err.html
//        ModelAndView modelAndView = new ModelAndView("forward:/html/err.html");
//          跳转到其他controller(hello2)
//        ModelAndView modelAndView = new ModelAndView("forward:/hello2");
        
//        浏览器重定向,
//          重定向到err.html
//        ModelAndView modelAndView = new ModelAndView("redirect:/html/err.html");
//          重定向到其他controller(hello2)
          ModelAndView modelAndView = new ModelAndView("redirect:/hello2");
          
//        会使用自定义视图解析器,结果找不到报错404
//        ModelAndView modelAndView = new ModelAndView("hello2");
        
        return modelAndView;
    }

    void(没有返回值,只能重定向和转发)

@RequestMapping("hello3")
    public void hello3(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        重定向
        request.getRequestDispatcher("/html/err.html");
//        request.getRequestDispatcher("/hello1");
//        转发
//        response.sendRedirect("/html/err.html");
//        response.sendRedirect("/hello1");

    }

  @RequestMapping:

  @ResponseBody:

    String

    void

    ModelAndView

  对象:(坑!大坑!!巨坑!!!超级坑!!!)(使用jackSon的时候要用高版本不然报错406,无法转换json格式)

@RequestMapping("/hello4")
    @ResponseBody
    public People hello4(HttpServletResponse response){
        People p=new People();
        p.setName("sss");
        p.setAddress("www");
        p.setAge(1);
        p.setEmail("ee");
        return p;
    }
     <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

 

三)自定义视图解析器

  表示在返回值的前边加上/路径和后边加上.jsp,表示所要找的jsp所在德位置,就不需要在controller中手写了,作用就是偷懒;

  但是注意:自定义视图解析器controller中的返回值不能加前缀,加的话就走默认的视图解析器,

  存在的意义:当我们需要转发的时候

    看图:

        图一:                            图二:

            

    看图一:因为前边没有加任何东西,并且我又自定义视图解析器,那他走的就是自定义视图解析器,回去找一个demo11.jsp的东西,但是会发现找不到报错404

    看图二:因为前边加了forward:这时候自定义的视图解析器就失效了,走默认视图解析器,解析出来要转发到dome11,就不去找demo11.jsp了

  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

四)请求方法限定

 @RequestMapping(value = {"/hello123","/456",method = RequestMethod.POST)}  

五)@ResponseBody注解

  做了两件事情:

    一:将返回值变成json字符串;

    二:同时设置响应头为application/json

    加上这个之后就不跳转了,以流的形式输出出去,也就不走视图解析器了,并且是直接填充到body中去了

 

String:

ModelAndView:

考虑一下返回值为ModelAndView 却得到一个json字符串的方式

Void:

对象:

 

 六:拦截器

 

 

  

posted @ 2018-10-13 07:43  凤凰山小旋风  阅读(183)  评论(0编辑  收藏  举报