• SpringMVC的特性及应用


    Spring MVC特点

    • 清晰地角色划分
    •  灵活的配置功能
    •  提供了大量的控制器接口和实现类
    •  真正的View层实现无关(JSP、Velocity、Xslt等)
    •  国际化支持
    •  面向接口编程
    • Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起

    视图解析器

    •   将逻辑视图的名字与JSP等视图技术进行匹配
    •   InternalResourceViewResolver
    •   在Web应用程序的WAR文件中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定
    •   prefix
    •   suffix

    REST风格

    •   Representational State Transfer表述性状态转移
    •   传统的查、改、删的URL与REST风格的增删改URL对比
    1.   /userview.action?id=12    VS    /user/12
    2.   /userdelete.action?id=12   VS    /user/12/delete
    3.   /userupdate.action?id=12  VS    /user/12/update
    •   请求方式
    1.  GET
    2.  POST
    3.  DELETE
    4.  PUT
    •   他强调的是一个资源可以对应多种视图

    配置步骤:

      1.导入spring-web类库,

      2.配置web.xml:

               <servlet>

                         <!--注意这里的名字会被spring.xml文件名引用(springMVC-servlet.xml)-->

                         <servlet-name>springMVC</servlet-name>

                         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

               </servlet>

               <servlet-mapping>

                         <servlet-name>springMVC</servlet-name>

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

               </servlet-mapping>

      乱码处理:

        <filter>

            <filter-name>encodingFilter</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>encodingFilter</filter-name>

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

         </filter-mapping>

      3.配置<springMVC>-servlet.xml,放在和web.xml同目录

             方式一:BeanNameUrlHandlerMapping方式:

               <!-- 控制器bean,name为访问此控制器用的url,class为继承AbstractController的控制器类 -->

              <bean name="/index.html" class="com.zhp.controller.HelloController"></bean>

               <!-- 视图解析器 -->

               <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                         <property name="prefix" value="/WEB-INF/jsp/"></property>

                         <property name="suffix" value=".jsp"></property>

                </bean>

            方式二:DefaultAnnotationHandlerMapping注解方式:

              <context:component-scan base-package="com.zhp.*"/>   

            <mvc:annotation-driven/>

                    视图解析器如上相同

          4.跳转:

                   方式一:ModelAndView mav = new ModelAndView("hello");//hello会结合试图解析器的前缀和后缀来确定url

                   方式二:注解时,直接return "hello";即可

          5.接收参数:

                   login(String uname)可以直接通过uname=zhang来传参

                   reg(@ModelAttribute Usertbl user)通过注解也可自动封装对象

             Rest风格:

                  @RequestMapping("/update/{username}")

                  public String update(@PathVariable String username)//注意注解@PathVariable

           6.转发数据:

                方式一:通过方法中参数Model:

                     public String login(Model model){

                             model.addAttribute("uname","zhang");//页面通过${requestScope.uname}取出

                      }

                方式二:session对象的获取:自动注入session对象

                      public String login(@ModelAttribute Usertbl user,Model model,HttpSession session){}

              注意:页面传递参数:

                      1.Model----model.addAttribute("upass",upass);

                      2.Map<String,Object>---------map.put("user", user);

                      3.HttpSession----session.setAttribute("name", uname);

               注意:如果指定了提交方式method=RequestMethod.GET/method=RequestMethod.POST时,springMVC会根据页面的提交方式判断提交的;

           7.数据校验

                 JSR-303 是Java EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator。

                 此实现与Hibernate ORM 没有任何关系。JSR 303 用于对Java Bean 中的字段的值进行验证。

                 spring MVC 3.x之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。

            8.异常处理

                 a.局部处理:

                 //运行时异常处理

            @ExceptionHandler(value=RuntimeException.class)

                 public String doException(RuntimeException e){

                                       System.out.println("---RuntimeException---异常了-----"+e.getMessage());

                                        return "error";

                             }

                            // 非运行时异常处理

                            @ExceptionHandler(value=Exception.class)

                             public String doException(Exception e){

                                     System.out.println("---Exception---异常了-----"+e.getMessage());

                                     return "error";

                              }

                   b.全局处理:

                             <!-- 异常解析器 -->

                             <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

                                   <property name="exceptionMappings">

                                       <props>

                                              <prop key="java.lang.Exception">error</prop>

                                       </props>

                                   </property>

                              </bean>

           9.静态资源处理:

                      将静态文件指定到某个特殊的文件夹中统一处理

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

                      注意:mapping="/resources/**":表示映射路径,在页面应用resources映射名 

                                location="/resources/":表示文件存放的真实路径

            10.文件上传

                    a.导入文件上传夹包:commons-fileupload-1.2.2.jar、commons-io-2.4.jar

                    b.配置文件:<!-- 配置MultipartResolver,用于上传文件,使用spring的CommonsMultipartResolver --> 

                                 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

                                          <property name="maxUploadSize" value="5000000"/>

                                          <property name="defaultEncoding" value="UTF-8"/>

                                </bean>

                     c.编写页面:<form action="upload" method="post" enctype="multipart/form-data">

                                         <input type="submit" value="上传">

                     d.编写控制器类:

                                       @Controller

                                        public class ProductAction {

                                                     @RequestMapping("/upload")

                                                       public String upload(Product product,@RequestParam MultipartFile pic,HttpSession session){

                                                                 System.out.println(pic.getOriginalFilename()+"------upload-----"+product);

                                                                 //获取工程路径

                                                                 String savePath=session.getServletContext().getRealPath("resources/upload");

                                                                  //获取上传文件名称

                                                                  String fileName=pic.getOriginalFilename();

                                                                   File saveFile=new File(savePath, fileName);

                                                                   //封装到对象

                                                                  product.setImgSrc(fileName);

                                                                  try {//实现上传,以拷贝输入流的方式实现

                                                                          FileUtils.copyInputStreamToFile(pic.getInputStream(), saveFile);

                                                                   } catch (IOException e) {  e.printStackTrace(); }

                                                                   return "index";

                                                            }

                                                  // 多文件上传

                                                 @RequestMapping("/uploads")

                                                  public String uploads(Product product,@RequestParam MultipartFile[] pic,HttpSession session){

                                                    //获取工程路径

                                                    String savePath=session.getServletContext().getRealPath("resources/upload");

                                                    for (int i = 0; i < pic.length; i++) {

                                                       //获取上传文件名称

                                                      String fileName=pic[i].getOriginalFilename();

                                                      File saveFile=new File(savePath, fileName);

                                                      try { //springMVC提供文件拷贝

                                                                 pic[i].transferTo(saveFile);

                                                      } catch (IOException e) { e.printStackTrace();}

                                                }

                                          return "index";

                                                }

                                      }

     

           11.SpringMVC中的JSON

                     @Controller

          public class ProductController {

                 @Resource(name="service")

                 private ProductService service;

                 @RequestMapping(value="/query/{id}",method=RequestMethod.GET)

                 @ResponseBody

                 public Product query(@PathVariable int id){

                           Product prod=service.getProductById(id);

                                return prod;

           }

         }

         对应前台js:

          <script type="text/javascript" src="resources/js/jquery-1.9.1.js"></script>

             <script type="text/javascript">

                     $(document).ready(function(){

                               $(":button").click(function(){

                                        var id=$("[name=pid]").val();

                                        $.getJSON("query/"+id,"",function(data){

                                                      if(data!=null && data!=""){

                                                               $("#show").html("商品编号:"+data.pid+"<br>商品名称:"+data.pname+"<br>商品价格:"+data.price);

                                                       }

                                          });

                                });

                      });

               </script>

     

     

  • 相关阅读:
    Cobar-Client 实现策略总结
    xsltproc docbook 转 html
    一个使用高并发高线程数 Server 使用异步数据库客户端造成的超时问题
    Hessian 初探
    关于 tomcat nio connector, servlet 3.0 async, spring mvc async 的关系
    Two-Phase Commit (两阶段提交)
    HashedWheelTimer 原理
    Photoshop 使用曲线
    Photoshop 使用可选颜色
    MySQL Batch 与 Transaction
  • 原文地址:https://www.cnblogs.com/typ1805/p/7780815.html
Copyright © 2020-2023  润新知