zoukankan      html  css  js  c++  java
  • Spring MVC 知识总结

    参考文章:http://www.oschina.net/question/84460_9608

                     孔浩视频

    1. 几个关键类:

        RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 替代 DefaultAnnoationHandlerMapping 和 AnnotationMethodHandlerAdapter

        DispatcherServlet , InternalResourceViewResolver

    2. 默认配置文件名称:

        *-servlet.xml

    3. 可以使用<init-param>元素,手动指定配置文件的路径;

    4. 基本配置

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

    5. 传入参数的方式:

        1). (@RequestParam("username") String username) // @RequestParam("username")中的参数会被认为是地址的一部分,如果不传此值,会报错

        2). (String username) 

        3). (User user) // 页面以spring的form表单提交 

        4). (@ModelAttribute("user")User user) // 等于将user放到model中,可以处理页面跳转到添加页面时,无值可取的错误 

        5). @RequestMapping(value = "/{uniqueId:^\d+$}",method = RequestMethod.GET)

             public ModelAndView edit(@PathVariable("uniqueId") String uniqueId,        

             @RequestMapping(value="/{username}/update",method=RequestMethod.GET)

             (@PathVariable String username,Model model) {

        6). public String testParam(HttpServletRequest request, HttpServletResponse response, HttpSession session)

            可以传入HttpServletRequest、HttpServletResponse、HttpSession,值得注意的是,如果第一次访问页面,HttpSession没被创建,可能会出错;

        将值传递给页面:

        1). 参数中加map(Map<String,Obect)),map中添加要传递给页面的参数。取值方式:${key}

        2). Model model ,model.addAttribute("username",username)

        3). public String testParam(PrintWriter out, @RequestParam("username") String username) { //out直接输出

    6. Controller中方法的返回值:

        void:多数用于使用PrintWriter输出响应数据;

        String 类型:返回该String对应的View Name;

        任意类型对象:

        返回ModelAndView:

    7. 拦截器:

        preHandle:拦截器的前端,执行控制器之前所要处理的方法,通常用于权限控制、日志,其中,Object o表示下一个拦截器;

        postHandle:控制器的方法已经执行完毕,转换成视图之前的处理;

        afterCompletion:视图已处理完后执行的方法,通常用于释放资源;

        在MVC的配置文件中,配置拦截器与需要拦截的URL:

            <mvc:interceptors>
                <mvc:interceptor>
                        <mvc:mapping path="/index.htm" />
                                <bean class="com.minx.crm.web.interceptor.MyInterceptor" />
                </mvc:interceptor>
            </mvc:interceptors>

    8. Spring标签:

        <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>,使用<spring:message code="key" />调用

        Spring form标签:<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>,使用方式如下:   

    <form:form method="post" modelAttribute="user" enctype="multipart/form-data">
                      Username:<form:input path="username"/><form:errors path="username"/><br/>
                      Password:<form:password path="password"/><form:errors path="password"/><br/>
                      Attach:<input type="file" name="attachs"/><br/>    <input type="file" name="attachs"/><br/>    <input type="file" name="attachs"/><br/> 
                     <input type="submit" value="添加用户"/>
    </form:form>

    9. 国际化:

        在MVC配置文件中,配置国际化属性文件:   

    <bean id="messageSource"
          class="org.springframework.context.support.ResourceBundleMessageSource"    p:basename="message">
    </bean>

         那么,Spring就会在项目中搜索相关的国际化属性文件,如:message.properties、message_zh_CN.properties

    10. 自定义视图(JstlView,ExcelView)

          启用jstl支持, 在InternalResourceViewResolver中加入,貌似新版可以不加,默认启用:      

     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

    11. 异常:

           局部异常处理,举例如下:       

                 @ExceptionHandler(value={UserException.class})
                 public String handlerException(UserException e,HttpServletRequest req) {
                              req.setAttribute("e",e);
                              return "error";
                  }

           全局异常处理:

                 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
                               <property name="exceptionMappings">
                                       <props>                     
                                                  <!-- UserException异常由error处理-->
                                                  <prop key="zttc.itat.model.UserException">error</prop>                 
                                        </props>
                                </property>
                  </bean>

           页面获取异常:

      发现错误:<h1>${exception.message}</h1>

    12. 返回json数据:

         需要jackson的jar包,url以params="json"中的json结尾: 

      @RequestMapping(value="/{username}",method=RequestMethod.GET,params="json")
    @ResponseBody public User show(@PathVariable String username) {
    return users.get(username);
    }

    13. 静态资源处理:

          方法一:

           <!-- 将静态文件指定到某个特殊的文件夹中统一处理,/resources/以/结尾 -->
           <mvc:resources location="/resources/" mapping="/resources/**"/>

          方法二: 

                      <mvc:default-servlet-handler>:当在web.xml 中DispatcherServlet使用<url-pattern>/</url-pattern> 映射时,能映射静态资源(当Spring Web MVC框架

                      没有处理请求对应的控制器时(如一些静态资源),转交给默认的Servlet来响应静态文件,否则报404找不到资源错误,)

    14. 验证:

               @Validated User user,BindingResult br ;两个必须放在一起,将验证结果放到br中
    public String add(@Validated User user,BindingResult br,@RequestParam("attachs")MultipartFile[] attachs,HttpServletRequest req) throws IOException { if(br.hasErrors()) { //如果有错误直接跳转到add视图 return "user/add"; } } 页面显示错误信息的代码:
    <form:errors path="username"/>

    15 返回页面的两种方式:

           return "user/show";

           return "redirect:/user/users";

    16. map集合取值

        (map.put("users",users),users为也是个map):    

       <c:forEach items="${users }" var="um">
    
          ${um.value.username }
    
           ----<a href="${um.value.username }">${um.value.nickname }</a>
    
           ----${um.value.password }
    
           ----${um.value.email }--<a href="${um.value.username }/update">修改</a>
    
           <a href="${um.value.username }/delete">删除</a><br/>
    
       </c:forEach>

     17.  字符编码处理:    

          <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>
          </filter>
          <filter-mapping>
                      <filter-name>CharacterFilter</filter-name>
                      <url-pattern>/*</url-pattern>
          </filter-mapping>

     19. 文件上传

          页面要求:POST请求;enctype="multipart/form-data":      

          只上传一个文件:
    
          jsp页面:<input type="file" name="attach"/>
    
          类:@RequestParam("attachs")MultipartFile attach
    
          上传多个文件:
    
           jsp页面:Attach:<input type="file" name="attachs"/><br/>    <input type="file" name="attachs"/><br/>    <input type="file" name="attachs"/><br/> 
    
           类:
    
           //在具体添加用户时,是post请求,就访问以下代码
    
           @RequestMapping(value="/add",method=RequestMethod.POST)
    
           //一定要紧跟Validate之后写验证结果类
    
           public String add(@Validated User user,BindingResult br,@RequestParam("attachs")MultipartFile[] attachs,HttpServletRequest req) throws IOException {
    
                 if(br.hasErrors()) {
    
                        //如果有错误直接跳转到add视图
    
                        return "user/add";
                 }
    
                 String realpath = req.getSession().getServletContext().getRealPath("/resources/upload");
    
                System.out.println(realpath);
    
                for(MultipartFile attach:attachs) {
    
                        if(attach.isEmpty()) continue;
    
                        File f = new File(realpath+"/"+attach.getOriginalFilename());
    
                        FileUtils.copyInputStreamToFile(attach.getInputStream(),f);
    
                 }
    
                 users.put(user.getUsername(), user);
    
                 return "redirect:/user/users";
    
           }
    
           @RequestParam("attachs")MultipartFile[] attachs 数组的时候不会自动赋值,不可以使用MultipartFile[] attachs

     

    20. 返回json数据

          需要jackson的jar包,url以params="json"中的json结尾:      

          @RequestMapping(value="/{username}",method=RequestMethod.GET,params="json")
    
          @ResponseBody
    
          public User show(@PathVariable String username) {
    
                return users.get(username);
    
          }

     

  • 相关阅读:
    React 组件之间如何交流
    VMC INJECTION(开源JAVA模板框架)
    <th><td>表单用法
    弹性盒子
    骰子的布局(flex)
    javascript中的作用域
    js引用类型和基本类型、隐式类型转换以及强制类型转换面试题
    css的content属性,以及如何通过css content属性实现css计数器?
    CSS实现:一个矩形内容,有投影,有圆角,hover状态慢慢变透明
    百度元宵节动画
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/4524624.html
Copyright © 2011-2022 走看看