SpringMVC 相关参数

1.@RequestMapping注解请求的相关参数

       1.设定url

            @RequestMapping(value="/getUserByName")

       2.窄化请求映射

            在Controller上面在添加一道@RequestMapping(value="/User"),实现对于请求需求的分类分组,达到转化请求映射的功能。

       3.限制请求方式

            @RequestMapping(value="/getUserById", method= {RequestMethod.GET,RequestMethod.POST})设置method,限制请求的方式

      4.Controller方法的返回值
                        1.ModelAndView  (将Model和View放在一个独享里面返回)
                        2.string  (返回视图页面的逻辑视图名)   真正视图(jsp)=(视图解析器)前缀+string+(视图解析器)后缀
                                在这种方式中可以在方法参数中设置Model model,用于待会儿将model传递到页面使用

    <!-- 配置jsp视图解析器,"javax.servlet.jsp.jstl.core.Config"默认支持jstl -->
	<bean id="ViewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!--配置视图页面的前缀和后缀,方便开发 -->
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<property name="suffix" value=".jsp"/>
	</bean>


                                例子: 这种方式URL不会变化
                                  public string getOne(Model model) {
                                      model.addAttribute("User",user);
                                      return "UserDetails";
                                  }
        -------------------------------------------------------------------------------------------------------------              
                                 1.重定向 redirect (url地址栏会发生变化)  (request中的数据丢失,因为request无法共享)
                                     例子: 
                                     public string saveAndView(Model model) {
                                         model.addAttribute("User",user);
                                         return "redirect:/UserDetails";
                                     }  

 

 前提,这种方式相当于将请求依旧转发给系统自己另外的handler进行执行

所以这种方式执行成功的前提是定义了统一的执行handler

 @RequestMapping(value = "/{param}") //这种使用restful风格
            public String allCanDo(@PathVariable("param") String param) {
                     return param;
             }                 

                                  2.转发请求 forward (url地址栏不会发生变化)     (request可以共享) 

                   forward()方法只能重定向到同一个Web应用程序中的某个资源
                                      例子:
                                      public string saveAndView(Model model) {
                                           model.addAttribute("User",user);
                                           return "forward:/UserDetails";
                                      }                 
                                  3.void    
                                      在controller方法形参上可以定义request和response,使用request或response响应结果
                                           1.使用requset转发页面
                                                 request.getRequestDispatcher("/index.jsp").forward(request, response);
                                           2.通过response重定向页面
                                                response.sendRedirect("http://localhost:8090/SSMXML/");
                                          3.也可以通过response指定响应结果,例如响应json数据
                                                 response.setCharacterEncoding("utf-8");
                                                 response.setContentType("application/json;charset=utf-8");
                                                 response.getWriter().write("jsonc串");
    

2.SpringMVC参数绑定
            1.spring默认支持的参数绑定类型
                  1.HttpServletRequest
                  2.HttpServletResponse
                  3.HttpSession
                  4.Model/ModelMap
                  实现对简单类型的绑定   (整型,字符串,日期...) 
                  
            2.注解参数绑定
                  1.@RequestParam实现对简单类型的绑定
                         如果不使用@RequestParam,则要求request传入参数名称和controller方法参数形参名称一致,方可绑定成功。
                         如果使用@RequestParam,则要求request传入参数名称和controller方法参数形参名称可以不一致
                     @RequestParam(value="id",required=true,defaultValue="1") Integer item_id
                              value:和形参(item_id)进行绑定
                              required:指定参数是否必须传入
                              defaultValue:在未传入参数的情况下,指定形参(item_id)参数默认值
                              
            3.pojo参数绑定
                  1.直接使用pojo作为controller方法的形参就可以直接绑定,但是前提是页面中input标签参数名必须和controller形参中的pojo的属性一致层,才能绑定
                       问题:在发生get或post请求时,参数传递过程中发生了乱码的情况。
                           get乱码: 原因Tomcat默认编码为ISO8859-1
                                 解决方案: 
                                   1.在tomcat的配置文件中添加uri编码参数
                                       <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8090" protocol="HTTP/1.1" redirectPort="8443"/>

                                   2.在接收参数的方法内,对参数进行重新编码
                                       String param=new String(request.getParameter("username").getBytes("ISO8859-1","utf-8"))                                   
                           post乱码: 
                                 解决方案:
                                    1.在web.xml中配置post请求乱码过滤器
                                        <!--post请求乱码过滤器 -->
                                        <filter>
                                            <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
                                            <url-pattern>/*</url-pattern>
                                        </filter-mapping>

                                    
            4.自定义参数绑定
                   1.加入controller层现在有一个前端传过来的string型的日期,我们需要将其填充pojo中,但是我们发现我们在pojo中设置的参数类型为Date,很显然如果我们直接绑定就会出现参数绑定异常。
                           解决:我们自定义参数绑定的转换器,将String型日志转换为Date型
                                  1.在SpringMVC配置文件中添加转换服务配置,springMVC.xml设置转换服务属性
                                          内部操作为将转换服务配置到了处理器适配器实例里面(HandlerAdapter),所以我们使用原始的HandlerAdapter的话,我们就需要在HanlerAdapter里面添加参数配置
                                          <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
                                  2.定义一个转换服务的bean(实现类)
                                          <!--定义转换服务bean -->
                                          <bean id="conversionService"
                                              class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
                                              <!--引用自定义的转换器 -->
                                              <property name="converters">
                                                  <list>
                                                      <bean
                                                          class="com.ncs.controller.converter.customerDateConverter" />
                                                      <!--在这里还可以配置多个转换器,这里是一个list -->
                                                  </list>
                                              </property>
                                          </bean>    
                                  3.书写自定义的转换器
                                          public class customerDateConverter implements Converter<String, Date> {
                                              @Override
                                              public Date convert(String source) {
                                                  SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
                                                  try {
                                                      // 转换成功,直接返回
                                                      return format.parse(source);
                                                  } catch (ParseException e) {
                                                      e.printStackTrace();
                                                  }
                                                  // 转换失败,返回为空
                                                  return null;
                                              }
                                          }

SpringMVC参数绑定使用
            1.现在遇到一个问题,一个controller方法需要接受两个pojo,但是这两个pojo里面存在一个同样的属性name,而前端标签名与pojo属性名同名就可以实现参数绑定
              那么在遇到同名的情况,springMVC就无法为其进行参数绑定
                  解决方案:
                       定义一个PojoVO(扩展类),将那两个pojo都放在这个pojoVO(扩展类里面),然后前端传入参数时,我们就需要添加一层pojoVO属性名,这样便可解决同名传参的问题啦。

                       
            2.现在有一种情况,前端复选框实现批量删除,传入一个数组(内部包含,所有pojo的某一特性),SpringMVC可以直接接受这些参数吗?如果可以参数该如何绑定           
                   解决方案:
                        页面标签参数名必须和数组名一致,才能实现参数绑定
            3.现在有一种情况,前端复选框实现批量删除,传入一个list集合(内部包含,所有pojo),SpringMVC该如何接受这些参数?参数该如何实现绑定
                   解决方案:
                        可以和pojoVO(扩展类)结合使用,在扩展类里面添加一个pojo属性,和一个List<pojo>属性,这样我们就可以通过listName.pojoName.property在前端页面实现参数绑定

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值