zoukankan      html  css  js  c++  java
  • SpringMVC中参数的传递(一)

    前言

    1.首先,我们在web.xml里面配置前端控制器DispatcherServlet以及字符编码过滤器(防止中文乱码),配置如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="3.0" 
     3     xmlns="http://java.sun.com/xml/ns/javaee"
     4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     6     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     7     
     8     <!-- 配置前端控制器 -->
     9     <servlet>
    10         <servlet-name>abc</servlet-name>
    11         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    12         <!-- 修改springMVC的配置文件路径 -->
    13         <!-- 如果不配置init-param就会在  这个路径下找/WEB-INF/servletName-servlet.xml(默认名) -->
    14         <!-- 所以如果init-param配置错误的话会报FileNotFound异常,提示找不到servletName-servlet.xml文件 -->
    15         <init-param>
    16             <param-name>contextConfigLocation</param-name>
    17             <param-value>classpath:springmvc.xml</param-value>
    18         </init-param>
    19         <!-- 自启动,Tomcat启动时加载这个类 -->
    20         <load-on-startup>1</load-on-startup>
    21     </servlet>
    22     <!-- 拦截请求     /表示拦截所有请求但不拦截jsp请求,其他的静态资源如html,css,images都会被拦截 -->
    23     <servlet-mapping>
    24         <servlet-name>abc</servlet-name>
    25         <url-pattern>/</url-pattern>
    26     </servlet-mapping>
    27     
    28     <!-- 字符编码过滤器 -->
    29     <filter>
    30         <filter-name>encoding</filter-name>
    31         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    32         <!-- 初始化参数 -->
    33         <init-param>
    34             <param-name>encoding</param-name>
    35             <param-value>utf-8</param-value>
    36         </init-param>
    37         
    38     </filter>
    39     <!-- 要过滤那些请求 -->
    40     <filter-mapping>
    41         <filter-name>encoding</filter-name>
    42         <!-- 过滤器配置为/* -->
    43         <url-pattern>/*</url-pattern>
    44     </filter-mapping>
    45 </web-app>
    web.xml

    2.配置SpringMVC的配置文件springmvc.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:mvc="http://www.springframework.org/schema/mvc"
     5     xmlns:context="http://www.springframework.org/schema/context"
     6      xsi:schemaLocation="http://www.springframework.org/schema/beans
     7      http://www.springframework.org/schema/beans/spring-beans.xsd
     8      http://www.springframework.org/schema/context
     9      http://www.springframework.org/schema/context/spring-context.xsd
    10      http://www.springframework.org/schema/mvc
    11      http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    12     
    13     <!-- 扫描注解 -->
    14     <context:component-scan base-package="com.lmw.controller"></context:component-scan>
    15     <!-- 注解驱动 -->
    16     <!-- handlerMapping的注解方式实现方法 -->
    17     <!-- org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping -->
    18     <!-- handlerAdapter的注解方式实现方法 -->
    19     <!-- org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter -->
    20     <mvc:annotation-driven></mvc:annotation-driven>
    21     <!-- 不拦截静态资源请求  -->
    22     <!-- mapping里面填的是请求的URL以通配符的形式表示 -->
    23     <!-- Location里填的是请求的资源在项目里的位置,即要在哪里去寻找这个资源 -->
    24     <mvc:resources location="/WEB-INF/js/" mapping="/abc/**"></mvc:resources>
    25     <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
    26     <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
    27     <mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
    28 </beans>
    springmvc.xml

    3.编写People类

     1 package com.lmw.pojo;
     2 
     3 public class People {
     4     private String name;
     5     private int age;
     6     public String getName() {
     7         return name;
     8     }
     9     public void setName(String name) {
    10         this.name = name;
    11     }
    12     public int getAge() {
    13         return age;
    14     }
    15     public void setAge(int age) {
    16         this.age = age;
    17     }
    18     @Override
    19     public String toString() {
    20         return "People [name=" + name + ", age=" + age + "]";
    21     }
    22     
    23 }
    People类

    4.编写index.jsp页面(就是一个form表单)

    1 <body>
    2     <form action="#" method="post">
    3         <input type="text" name="name"/>
    4         <input type="text" name="age"/>
    5         <input type="submit" value="提交"/> 
    6     </form>
    7 </body>

    这里的action先空着,后面根据实际情况再填写对应的控制器

    一、基本数据类型参数的传递

    1.首先新建一个main.jsp页面

    1 <body>
    2     这里是main.jsp!
    3 </body>

    2.编写控制器DemoController

    package com.lmw.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    
    @Controller
    public class DemoController {
        /**
         * 基本数据类型的传递demo
         * @param name
         * @param age
         * @return
         */
        @RequestMapping("demo1")
        public String demo1(String name, int age){
            System.out.println("执行demo1"+" "+name+" "+age);
            return "main";
        }
    }

    在DemoController面里我们写了一个叫demo1的方法,这个方法有两个参数:String类型的name和int类型的age。SpringMVC会自动帮我们给这两个参数注入值,这里只需要我们的参数名称和index.jsp里面input的name相同即可。这样写好后,将index.jsp里的form表单的action值改为控制器的名字demo1就可以运行了 。

                                         图1 输入name和age

                                     图2 提交后跳转到了mian.jsp页面

                                                        图3 控制台输出

     二、对象类型参数的传递

    对象数据类型的参数传递包括普通对象、请求对象(request)、session对象等对象的传递。

    (一)普通对象类型参数的传递

    我们在上面的DemoController里再添加一个demo2方法,如下:

     1  2 /**
     3 * 对象数据类型的传递demo
     4 * @param name
     5 * @param age
     6 * @return
     7 */
     8 @RequestMapping("demo2")
     9 public String demo2(People people){
    10     System.out.println("执行demo2"+" "+people);
    11     return "main";
    12 }

    SpringMVC同样也可以对普通对象进行注入,前提条件是input的name要和对象的属性名称相同。将action的值改为demo2就可以了,结果图下面就不贴了。

    (二)request对象的传递

    首先,同样的,我们在DemoController里再添加一个demo3方法,如下:

     1 /**
     2 * 利用request对象传值
     3 * @param req
     4 * @return
     5 */
     6 @RequestMapping("demo3")
     7 public String demo3(HttpServletRequest req){
     8     req.setAttribute("req", "利用request对象传的值");
     9     return "main";
    10 }

    在mian.jsp里接收request对象传过来的值:

    1 <body>
    2     request:${request.req }
    3 </body>

    然后我们在浏览器里访问控制器demo3,在浏览器输入:http://localhost:8080/springmvc02/demo3,回车

    (三)session对象传值

    利用session向jsp页面传值和request对象传值类似,在DemoController里添加一个demo4方法,如下:

     1 /**
     2 * 利用session对象传值
     3 * @param session
     4 * @return
     5 */
     6 @RequestMapping("demo4")
     7 public String demo4(HttpSession session){
     8     session.setAttribute("session", "利用session传递了一个值");
     9     return "main";
    10 } 

    在mian.jsp里接收session对象传过来的值:

    1 <body>
    2     session:${sessionScope.session }
    3 </body>

    然后我们在浏览器里访问控制器demo4,在浏览器输入:http://localhost:8080/springmvc02/demo3,回车

     三、HandlerMethod参数的注解

    所谓的handlerMethod即是上面的这些demo方法,在编写这些handlerMethod时,我们可以给这些方法的参数添加注解,用以控制参数。

    (一)给参数取别名

    当控制器方法的参数名称和jsp页面的参数的名称不相同时,可以使用@RequestParam()注解来实现给控制器方法参数取别名。但实际上这个注解做的事情是将请求中的参数(name1和age1)绑定到控制器中的参数(name和age)里

    1.在方法对应的参数之前添加@RequestParam(value="参数名称")注解就可以实现给参数取别名

    2.注意,这里的value的值要和jsp页面的name相同

    3.当@RequestParam()注解括号里面只有value时,可以将注解简化为@RequestParam("参数名称")(示例里面的参数age)

    在DemoController里添加一个demo5方法,如下:

     1 /**
     2 * 参数注解1:给参数取别名
     3 * 例如:Controller的方法里面的参数名和jsp页面的参数名不一致时可以给参数取别名
     4 * @param name
     5 * @param age
     6 * @return
     7 */
     8 @RequestMapping("demo5")
     9 public String demo5(@RequestParam(value="name1")String name, @RequestParam("age1")int age){
    10     System.out.println("执行demo5"+" "+name+" "+age);
    11     return "main";
    12 }

    index.jsp如下:

    1 <body>
    2     <form action="demo5" method="post">
    3         <input type="text" name="name1"/>
    4         <input type="text" name="age1"/>
    5         <input type="submit" value="提交"/> 
    6     </form>
    7 </body>

    在浏览器里输入:http://localhost:8080/springmvc02/index.jsp,回车

    (二)给参数一个默认值

    当不管什么情况下,我们都需要给控制器里面的参数一个默认值时,这个时候就可以使用到注解@RequestParam()的另外一个属性:defaultValue属性。

    1.在参数前添加注解@RequestParam(defaultValue="参数的默认值")就可以给参数一个默认值,参数的默认值是defaultValue的值

    2.当我们不给出这个参数的值时,该参数就取默认值

    在DemoController里添加一个demo6方法,如下:

     1 /**
     2 * 参数注解2:给参数一个默认值
     3 * 如果不给出这个参数的值,该参数就取默认值
     4 * 例如:在分页功能的Controller里面给pageSize和pageNumber一个默认值既可以少写几个非空判断了
     5 * @param name
     6 * @param age
     7 * @return
     8 */
     9 @RequestMapping("demo6")
    10 public String demo6(@RequestParam(defaultValue="lmw")String name, @RequestParam(defaultValue="21")int age){
    11     System.out.println("执行demo6"+" "+name+" "+age);
    12     return "main";
    13 }

    index.jsp如下:

    1 <body>
    2     <form action="demo6" method="post">
    3         <input type="text" name="name"/>
    4         <input type="text" name="age"/>
    5         <input type="submit" value="提交"/> 
    6     </form>
    7 </body>

    在浏览器里输入:http://localhost:8080/springmvc02/index.jsp,回车

    (三)设置参数为必须值

    如果控制器方法里面的参数是必须给出的,这个时候就需要使用到@RequestParam()的第三个属性:required属性。required是boolen类型,默认为true,即必须要给出这个参数,否则就会报异常。

    1.在参数前添加注解@RequestParam(required=true)设置参数为必须值

    2.如果不给出这个参数就会报异常

    在DemoController里添加一个demo7方法,如下:

     1 /**
     2 * 参数注解3:设置参数为必须值
     3 * 如果不给出这个参数就会报异常
     4 * 例如:name作为SQL查询语句的条件这种情况,我们把name设置为必须值
     5 * @param name
     6 * @param age
     7 * @return
     8 */
     9 @RequestMapping("demo7")
    10 public String demo7(@RequestParam(required=true)String name, @RequestParam(required=true)int age){
    11     System.out.println("执行demo7"+" "+name+" "+age);
    12     return "main";
    13 }

    index.jsp页面将from表单里面的action的值改为demo7,其他不变,在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车

    四、复杂参数的传递

    (一)传递多个同名参数的值

    除了上面的基本数据类型的参数和对象类型的参数传递,那么当表单里有复选框的时候,我们要怎么将勾选中的复选框的值传到控制器里面呢?也就是说当请求的参数中包含多个同名参数的时候,我们要如何实现这些参数的传递呢?

    那么首先就要思考一个问题,我们要将这些同名参数存储在一个什么样容器里面呢?一个很简单的方式,我们可以使用一个List来存储这些同名参数的值。那么是不是同之前一样,只要我们将List的对象名改为input的name就可以了呢?答案是否定的,即使你这样做SpringMVC也无法对List容器进行注入的,因为我们还没有将这些参数与List进行绑定,所以需要使用到注解@RequestParam()来将请求中的参数与List进行绑定。给出一个示例如下:

    在DemoController里添加一个demo8方法,如下。

     1 /**
     2 * 当请求参数中包含多个同名参数的情况,如复选框传递的参数
     3 * @param name
     4 * @param age
     5 * @param hobbyList 
     6 * @return
     7 */
     8 @RequestMapping("demo8")
     9 public String demo8(String name, int age, @RequestParam("hobby")List<String> hobbyList){
    10     System.out.println("执行demo8"+" "+name+" "+age+" "+hobbyList.toString());
    11     return "main";
    12 }

    index.jsp页面如下:

     1 <body>
     2     <form action="demo8" method="post">
     3         <input type="text" name="name"/>
     4         <input type="text" name="age"/>
     5         <input type="checkbox" name="hobby" value="健身"/>
     6         <input type="checkbox" name="hobby" value="游泳"/>
     7         <input type="checkbox" name="hobby" value="读书"/>
     8         <input type="checkbox" name="hobby" value="玩游戏"/>
     9         <input type="submit" value="提交"/> 
    10     </form>
    11 </body>

    在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车

    (二)请求参数名为对象名.属性名的格式

    显然,针对这种特殊的情况,使用普通对象类型参数的传递方式无法实现要求。那么此时我们就需要对这个"."前面的对象进行一个封装了,采取的方法是将这个对象封装在另外一个类里面,使其成为该类的一个属性。给出一个示例如下:

    index.jsp如下:

    1 <body>
    2     <form action="demo9" method="post">
    3         <input type="text" name="peo.name"/>
    4         <input type="text" name="peo.age"/>
    5         <input type="submit" value="提交"/> 
    6     </form>
    7 </body>

    根据上面name的值,我们对People类进行封装,示例如下:

     1 package com.lmw.pojo;
     2 
     3 public class Peo {
     4     private People peo;
     5 
     6     public People getPeo() {
     7         return peo;
     8     }
     9 
    10     public void setPeo(People peo) {
    11         this.peo = peo;
    12     }
    13 
    14     @Override
    15     public String toString() {
    16         return "Peo [peo=" + peo + "]";
    17     }
    18 }

    在DemoController里添加一个demo9方法,如下:

     1 Peo example = new Peo();
     2 /**
     3 * 请求参数名为对象名.属性名的格式的情况
     4 * 请求参数为集合对象类型
     5 * @param example
     6 * @return
     7 */
     8 @RequestMapping("demo9")
     9 public String demo9(Peo example){
    10     System.out.println("执行demo9"+" "+example);
    11     return "main";
    12 }

    在浏览器里输入:http://localhost:8080/springmvc02/index.jsp回车

    类似的,当请求参数名为如下这种格式时,我们也可以采取相同的做法。

    1 <body>
    2     <form action="demo9" method="post">
    3         <input type="text" name="peo[0].name"/>
    4         <input type="text" name="peo[0].age"/>
    5         <input type="text" name="peo[1].name"/>
    6         <input type="text" name="peo[1].age"/>
    7         <input type="submit" value="提交"/> 
    8     </form>
    9 </body>

    这种情况做法和上面类似,同样是将对象进行封装,具体如何实现大家可以自己去试一试。

    (三)restful风格传值方式

    所谓REST是REpresentational State Transfer的缩写(一般中文翻译为表述性状态转移),REST 是一种体系结构,具体可自行百度。使用这种风格开发最显而易见的就是传递参数的时候不再是url?paramname1=paramvalue1&paramname2=paramvalue2这种格式,而是变成了https://www.jianshu.com/p/91600da4df95这种格式,每个"/"后面的紧跟着的是参数。那么在SpringMVC中如何实现这种方式传递参数呢?

    在DemoController里添加一个demo10方法,示例代码如下:

     1 /**
     2 * restful传值方式
     3 * @param name
     4 * @param age
     5 * @return
     6 */
     7 @RequestMapping("demo10/{name}/{age1}")
     8 public String demo10(@PathVariable String name, @PathVariable(value="age1")int age){
     9     System.out.println(name+" "+age);
    10     return "main";
    11 }

    注意:

    1.需要使用到请求映射注解——@RequestMapping,这个注解会将 HTTP 请求映射到SpringMVC控制器的处理方法上。你只需要像这样配置这个注解:@RequestMapping("控制器名称/{XXX}/{XXX}")。其中,每一个{XXX}表示URL请求中的参数的占位符。

    2.在每个参数之前需要添加注解@PathVariable。这个注解可以将请求的URL中的参数映射到控制器处理方法的参数上

    3.如果请求中的参数名和注解里面的参数名不一致,需要给注解@PathVariable一个value,这个value的值要和请求的参数名相同(上面的参数age,在注解里面的名称是age1,类似于给控制器里面的参数取一个别名)

    在浏览器里输入:http://localhost:8080/springmvc02/demo10/lmw/21回车即可在控制台看到效果

     未完待续。。

  • 相关阅读:
    iOS开发allocWithZone介绍
    如何快速的查看一段代码的执行时间
    iOS关于setContentOffset的一些细节问题
    iOS开发libz.dylib介绍
    C#窗体无法接受Keydown事件
    visual studio 2010 C#编程时 没有.NET framework 2.0目标框架的解决办法
    StringBuilder类与String类的区别
    Refresh和Invalidate的比较
    正则表达式
    Queue 先进先出队列的操作
  • 原文地址:https://www.cnblogs.com/lmw97/p/10257316.html
Copyright © 2011-2022 走看看