zoukankan      html  css  js  c++  java
  • springMVC第二章

    springMVC第二章

    一、URL 映射

    可以同时设置多个URL来访问某个控制器或方法。设置value属性:

    @RequestMapping(value= {"/grade","/g"}) 表示访问这个控制器有2URL

    URL 组成的方式由:字面量,分隔符,占位符,通配符 组成。

    /user/update/{id} user,update叫字面量,它要与访问的URL的字面量完全匹配。

    访问的URL: user/update/12 这个可以访问,users/update/10 这个是不能访问到。

    / 叫分隔符 {id} 叫占位符,设置时占一个位置,访问时有数据来填充。在控制器端可以获取到请求填充的数据:

    //删 id叫占位符,请求时有数据填充

    @RequestMapping("delete/{id}")

    public ModelAndView delete(@PathVariable(value="id") int id){

    System.out.println("删除的学生编号为:"+id);  //10001

    return new ModelAndView("studentList");

    }  

    URL : student/delete/10001

    URL通配符映射

    通配符有“?”和“*”两个字符。其中“?”表示1个任意字符,“*”表示匹配多个任意字符,“**”表示匹配0个或多个路径。

    /helloworld/index?”可以匹配“/helloworld/indexA”、“/helloworld/indexB”,

      但不能匹配 /helloworld/index”与“/helloworld/indexAA”。

    /helloworld/index*” 匹配“/helloworld/index”、“/helloworld/indexA”、“/helloworld/indexAA

      不能匹配:/helloworld/index/A”;

    /helloworld/index/*”匹配“/helloworld/index/”、“/helloworld/index/A”、

                        “/helloworld/index/AA”、“/helloworld/index/AB

      不能匹配:/helloworld/index”、“/helloworld/index/A/B;

    /helloworld/index/**”可以匹配“/helloworld/index/”下的多有子路径, 如:“/helloworld/index/A/B/C/D;/helloworld/index”和“/helloworld/*”,

    如果请求地址为/helloworld/index”那么将如何匹配?Spring MVC会按照最长匹配优先原则(即和映射配置中哪个匹配的最多)来匹配,所以会匹配“/helloworld/index”。

    URL正则表达式映射  

      @RequestMapping(value="/reg/{name:\w+}-{age:\d+}")

      public ModelAndView regUrlTest(@PathVariable(value="name")

         String name, @PathVariable(value="age") Integer age){}

    约束了name:是字符型,ageint型,请求的URLreg/张三/20则匹配,reg/李四/xyz,则不会匹配。

    限制action所接受的请求方式(getpost

      @RequestMapping(value="/paramstest", params="example",

        method = {RequestMethod.GET})'

    RequestMethod.GET属性表示此Action只支持get请求,如果要支持post请求,则RequestMethod取值POST。此属性没有,则支持所有请求。

    二、视图与控制器之间数据传递

    (一)控制器传数据到页面。

       SpringMVC的控制器方法中,返回数据的方式有多种:

    ModelAndView,Model,ModelMap,Map,View,String,Void

    ModelAndView是我们常用的一种,可以返回视图及数据模型。它有多个方法的重载。

    常用的方法是:

    public ModelAndView(String viewName, String modelName, Object modelObject)

    //如果需要数据库中的数据,则调用底层方法取数据,

    List<Grade> list = new ArrayList<Grade>();

    list.add(new Grade());

    list.add(new Grade());

    list.add(new Grade());

    list.add(new Grade());  

    //返回的是视图的名称及一种类型数据

    return new ModelAndView("gradeList","grades",list);

    此方法只适合返回一种类型的数据。如果有多种类型数据,则用:

    public ModelAndView(String viewName, Map<String, ?> model)解决:

    //如果需要数据库中的数据,则调用底层方法取数据,

    List<Grade> list = new ArrayList<Grade>();

    list.add(new Grade());

    list.add(new Grade());

    list.add(new Grade());

    list.add(new Grade());

    List<Student> students = new ArrayList<>();

    students.add(new Student());

    students.add(new Student());

    students.add(new Student());

    students.add(new Student());

           

    //把多种类型数据再封装,

    Map<String, Object> map = new HashMap<String, Object>();

       map.put("grades", list);

       map.put("students", students);

    //返回的是视图的名称及数据

    return new ModelAndView("gradeList",map);

    public ModelAndView(String viewName) 只是返回视图名称.

        

    还可以用Model这就是一个已经封装好的Map对象,直接可以用。

    @RequestMapping("list") //设置访问到此方法的URL

    public ModelAndView list(Model model) {

    //如果需要数据库中的数据,则调用底层方法取数据,

    List<Grade> list = new ArrayList<Grade>();

    list.add(new Grade());

    list.add(new Grade());

    list.add(new Grade());

    list.add(new Grade());

    List<Student> students = new ArrayList<>();

    students.add(new Student());

    students.add(new Student());

    students.add(new Student());

    students.add(new Student());

    //自动回传到视图中,直接在视图中就可以获取到

    model.addAttribute("grades",list);

    model.addAttribute("students",students);

    //返回的是视图的名称

    return new ModelAndView("gradeList");

    }

     

    Map返回值

    public Map<String, String> getMap() {  

       Map<String, String> map = new HashMap<String, String>();

       map.put("key1", "value-1");

       map.put("key2", "value-2");

       return map;

    jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。

    返回的视图名与访问的URL一致..

    String

        Model是一个模型对象,主要包含spring封装好的modelmodelMap,以及Java.util.Map,当没有视图返回的时候视图名称将由requestToViewNameTranslator决定;Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。通常结合String返回类型使用:

    @RequestMapping(method = RequestMethod.GET)

    public String index(Model model) {

      List<User> users = userService.getUsers();

      model.addAttribute("users", users);

      return "user/index";

    }

    Void

      方法没有返回值,返回的视图名与访问的URL一致

    (二)页面传数据到控制器。

    数据从视图中传递到控制器,也有多种方式:

    URL上占位符传递数据,取占位符的数据。

    @RequestMapping("delete/{id}")

    public ModelAndView delete(@PathVariable(value="id") int id){

    System.out.println("删除的学生编号为:"+id);  //10001

    return new ModelAndView("studentList");

    }  

    URL : student/delete/10001

    URL上参数传递数据,取参数的数据。

    URLgrade/delete?id=10

    @RequestMapping("delete")    //id参数就自动获取到URL上参数的数据

    public ModelAndView delete(int id) {

    System.out.println(id);

    return new ModelAndView("gradeList");

    }

    表单提交传递数据。取表单中的数据的可以在方法上添加参数,参数名与表单元素的name属性值一致就可以了。

    @RequestMapping("save")

    public ModelAndView save(String gradeName) {

    System.out.println(gradeName);

    return new ModelAndView("gradeList");

    }

    但是,如果表单元素比较多的情况下,则方法中的参数也会有很多,麻烦。我们还可以直接把表单中的数据封装成实体对象获取。

    @RequestMapping("save")  //把表单中的数据封装成实体对象,要求表单元素的name属性值与实体对象的属性名一致。

    public ModelAndView save(Grade grade) {

    System.out.println(grade.getGradeName());

    return new ModelAndView("gradeList");

    }

    三、中文乱码问题的解决:

    以前的解决方案是自己写一个过滤器,对所有的请求进行过滤。用SpringMVC框架时,他已经考虑到这个问题,所以在SpringMVC框架中已经封装好了这个过滤器,就需要我们再创建过滤器类,直接用SpringMVC框架提供的过滤器就可以了。

    <!-- SpringMVC 解决中文乱码的问题, -->

      <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>

         <init-param>

           <param-name>forceEncoding</param-name>

           <param-value>true</param-value>

         </init-param>

      </filter>

      <filter-mapping>

         <filter-name>characterFilter</filter-name>

         <!--  /*  过滤到所有的请求  -->

         <url-pattern>/*</url-pattern>

      </filter-mapping>

    四、在控制器的方法中访问另一个方法或另一个控制器的方法

    采用redirectforward这两种方式。

    @RequestMapping("save") // 把表单中的数据封装成实体对象,要求表单元素的name属性值与实体对象的属性名一致。

    public ModelAndView save(Grade grade) {

    int result = gradeService.addGrade(grade);

    if (result > 0) { // 添加成功

    //redirect:list 去执行list这个URL,如果没有redirect或forward,则认为list是视图

    return new ModelAndView("redirect:list"); //list是视图名称

    }

    return new ModelAndView("gradeAdd");

    }

    五、静态资源访问

    静态资源访问时,也是向服务端发请求,DispatcherServlet 前端控制器拦截到请求后,且后端是没有做此URL映射的,所以,静态资源的访问被拦截后,报404

    三月 01, 2019 10:23:37 上午 org.springframework.web.servlet.DispatcherServlet noHandlerFound

    警告: No mapping found for HTTP request with URI [/springMVCDemo/images/2.jpg] in DispatcherServlet with name 'springMVC'

    浏览器上的报错信息如下:

    解决方案是,让DispatcherServlet 前端控制器不拦截静态资源的请求。在springMVC 的主配置文件下进行配置:

    <!-- 静态资源处理 -->

    <mvc:resources location="/images/" mapping="/images/**"/>

    <mvc:resources location="/css/" mapping="/css/**"/>

    <mvc:resources location="/js/" mapping="/js/**"/>

    <!-- 也可以如下处理,静态资源的处理交给容器的Servlet来处理 -->

    <mvc:default-servlet-handler/>

  • 相关阅读:
    mysql中InnoDB存储引擎的行锁和表锁
    阿里云出海 埃森哲护航
    阿里云出海 埃森哲护航
    阿里云出海 埃森哲护航
    阿里云出海 埃森哲护航
    Python开发简单爬虫
    Python开发简单爬虫
    Python开发简单爬虫
    Python开发简单爬虫
    问大家一个问题,如何用1万元创业,每天利润达到500元?
  • 原文地址:https://www.cnblogs.com/warriors-curry/p/10489355.html
Copyright © 2011-2022 走看看