zoukankan      html  css  js  c++  java
  • 抛开深层次底层,快速入门SpringMVC

    SpringMVC主要有三个核心部分组成,DispatcherServlet、Controller、ViewResolver。
        
         DispatcherServlet:
         请求输入时:类似于一个带分配功能的Filter,其直接与前端交互,并截所有符合 url-pattern 的请求,并根据Mapping路径分发给处理对应请求的Controller。
         请求处理完毕时:将ViewResolver渲染好的视图回传给前端。
        
         Controller:
         处理Http传来的请求,通常调用Service,再在Service中调用Dao持久层进行完整的数据处理,并将处理完毕的数据返回,返回以ModelAndView的形式,Model,通俗来讲,就是承载数据的一个HashMap,而View则是数据要发送的逻辑视图名,如果View缺省,默认是转发到HTTP发起的页面。
        
         ViewResolver:
         根据Controller处理好的数据,对指定目录下的文件进行渲染解析,完毕后将视图(不一定为页面、可能是Joson、Map各种数据类型,这根据Controller回传的数据决定)返回给DispatcherServlet。


    DispatcherServlet配置

      在web/web-inf/web.xml中配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        
        <!--配置contextLoaderListener以及文件地址,默认为web/web-inf/applicationContext.xml -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        
        <!--配置DispatcherServlet servlet-name可自取 -->
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置文件地址,默认为web/web-inf/ {servlet-name}-servlet.xml -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:dispatcher-servlet.xml</param-value>
            </init-param>
            <!--自启动-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        
            <!--配置拦截路径,此处为"/",可以改为其他 -->
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>

    dispatcher-servlet.xml

    配置开启注释、Json处理、视图解析器。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:beans="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    
            <!--配合@ReponseBody使用,开启Jackson的转换-->
        <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <!--json处理-->
                <bean
                        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list>
                            <value>application/json;charset=UTF-8</value>
                            <value>text/html;charset=UTF-8</value>
                        </list>
                    </property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
    
        <!--开启注解,base-package指向扫描的包地址,此处为Controller-->
        <context:component-scan base-package="Controller" use-default-filters="false">
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
            <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
        </context:component-scan>
    
        <!--Spring3.1开始的注解 HandlerMapping -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
        <!--Spring3.1开始的注解 HandlerAdapter -->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    
    
        <!--配置视图解析器-->
        <bean
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/" />
            <property name="suffix" value=".jsp" />
        </bean>
    </beans>

    Controller

      通过@Controller来定义一个Class为Controller。

      通过@RequestMapping的Value值来定义访问路径,method来定义访问方式。

    @Controller
    @RequestMapping(value="/login")
    public class LoginController {
    
        @RequestMapping(value = "/getDatas")
        public ModelAndView login( String username){
            try {
                    ……
            }catch (Exception e){
               
            }
        }
    }

      例如如上定义,想要访问login方法,如果在本地则为:localhost:8888/login/getDatas

      Controller 返回值的类型多种多样,可以为map、List、String等,当然最通用的例子还是ModelAndView。


      ModelAndView,其实际用途可以看成是Model 和 View两部分数据的返回,Model是数据部分,View是视图部分。数据最终传递到对应的视图上。

      其更多是作为  处理一个校验,并完成转发的  用途,例如访问主页时需要检查用户权限,则可先访问Controller,在Controller校验完毕后,再重定向(当然也可以含参)到不同的逻辑页面(View)。

      下面我们举一个含参的例子,跳转到succ.jsp或者error.jsp

    @RequestMapping(value = "/getDatas")
        public ModelAndView login(){
            ModelAndView modelAndView=new ModelAndView();
    
            try {
                /*为modelAndView添加数据*/
                modelAndView.addObject("TestData","1");
                modelAndView.addObject("TestData1","2");
                /*设置view的逻辑名称,SpringMVC会在视图解析器配置的目录下寻找该逻辑名称*/
                modelAndView.setViewName("succ");
            }catch (Exception e){
                modelAndView.addObject("mesg","error");
                modelAndView.setViewName("error");
            }
            return modelAndView;
        }

      我们可以通过再succ.jsp使用el表达式直接获取传递过来的值。

      


      但其实很多时候我们接收到的都是AJAX传递过来的Json对象,完整解析后再给前端传出Json串,供前端使用JS进行渲染,这个时候我们的返回值就可以为Map、List、String类型的值。但是为了我们传出的值为Json,我们必须使用另一个标签@ResponseBody。

      该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

      我们将上面的方法加上@ResposeBody的标签,并使返回值为一个map

        @ResponseBody
        @RequestMapping(value = "/getDatas")
        public Map login(){
            Map<String,Object> map=new HashMap<>();
            try {
                map.put("mesg","接口调用成功");
                map.put("name","接口名称为login()");
            }catch (Exception e){
                map.put("mesg","error");
            }
            return map;
        }

         我们调用该接口可以看到其返回的使一个map的json串,并且也证明了在视图缺省的情况下,默认转发到请求的HTTP。

      

     如果返回值为String,并添加了注释@ResponseBody,其返回的类型则为一个String,这一点需要注意(例:我们return "succ")

      


     对于String返回类型还有一点特殊,即如果没有注释@ResponseBody,则SpringMVC默认其为一个逻辑视图名,以上面的 return "succ" 为例,我们将会跳转到SUCC页面

      @RequestMapping(value = "/getDatas")
        public String login(){
            String path="";
            try {
                path="succ";
            }catch (Exception e){
                path="error";
            }
            return path;
        }

    我在视图解析器路径下建立了一个succ.jsp,并写了一个标题“SUCC PAGE”,可以已经完成了跳转。

    这里的String就已经被SpringMVC默认为为View进行了命名的工作,类似于Struts2的Action。当然这样的跳转也可以像ModelAndView一样带参传递。

    将Model置入Controller进行装载数据即可,见下:

     @RequestMapping(value = "/getDatas")
        public String login(Model model){
            String path="";
            try {
                model.addAttribute("TestData","1");
                model.addAttribute("TestData1","2");
                path="succ";
            }catch (Exception e){
                path="error";
            }
            return path;
        }

    这样我们再次访问,就会发现两个EL表达式也取到了值。

    String类型的返回值还有一个用于重定向的前缀"redirect:",当控制器方法返回的String值以“redirect:”开头的话,那么这个String不是用来查找视图的,而是用来知道浏览器进行重定向的路径。

    例: return "redirect:succ.jsp"


    前面我们讲述了一些Controller返回值类型的内容,现在我们来尝试为Controller传入一些参数。

    Controller支持从表单直接拿值并自动匹配装配数据,这一点和Struts相同,例如表单两个输入一个username,一个password,直接post到Controller。

    可见实体类以及字符串都可以拿到值。

    更多的情况我们需要拿AJAX发送给我们的Json串,这个时候我们需要用到另一个注释@RequestBody来格式化取值,如下:

    @RequestMapping(value = "/getDatas")
        public String login(@RequestBody user user,Model model){
            //后方代码无用,打断点看值
            String path="";
            try {
                model.addAttribute("TestData","1");
                model.addAttribute("TestData1","2");
                path="login/edit";
            }catch (Exception e){
                path="error";
            }
            return path;
        }

    我们使用Soup UI直接进行端口测试,传送Json串

    {
        "username":"adim",
        "password":"12345"
    }

    这样便可以拿到传进来的Json值了

    注:@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType:
    "json",contentType:"application/json"
    这样就可以轻易的将一个对象传到Java端,使用@RequestBody即可绑定对象


    另:

    此处本人在开发过程中遇到了如果只有单个参数

    如 public String login( String loginname) {}时,如果我传入

    {“loginname”:"adim"}

    Controller并取不到值,所以导致了单个参数也要封装的尴尬现象,还希望大佬们多多指点。


    层面的注释

    @Service

      用于标注业务层组件

    @Repository

      用于标注数据访问组件,即DAO组件

    @Controller

      用于标注控制层组件(如struts中的action)

      在Controller中调用ServiceImpl时,可直接使用@Autowire以及@Qualifier("xxx")在申明时进行注入。


    其他常用的注释,来源:http://www.cnblogs.com/leskang/p/5445698.html

    @ModelAttribute和 @SessionAttributes

    代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

     @SessionAttributes即将值放到session作用域中,写在class上面。

    具体示例参见下面:使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据

    @PathVariable

    用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:

    复制代码
    @Controller  
    public class TestController {  
         @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)  
         public String getLogin(@PathVariable("userId") String userId,  
             @PathVariable("roleId") String roleId){  
             System.out.println("User Id : " + userId);  
             System.out.println("Role Id : " + roleId);  
             return "hello";  
         }  
         @RequestMapping(value="/product/{productId}",method = RequestMethod.GET)  
         public String getProduct(@PathVariable("productId") String productId){  
               System.out.println("Product Id : " + productId);  
               return "hello";  
         }  
         @RequestMapping(value="/javabeat/{regexp1:[a-z-]+}",  
               method = RequestMethod.GET)  
         public String getRegExp(@PathVariable("regexp1") String regexp1){  
               System.out.println("URI Part 1 : " + regexp1);  
               return "hello";  
         }  
    }
    复制代码

    @requestParam

    @requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

      

      

  • 相关阅读:
    UV动画
    使用RampTexture实现BRDF效果
    使用RampTexture来控制diffuse shading
    Half Lambert
    Lamber算法 & SurfaceShader自定义光照
    What is _MainTex_ST ?
    C# Enum,Int,String的互相转换
    Plugins in Unity
    Mono在Full AOT模式下的限制
    雾化
  • 原文地址:https://www.cnblogs.com/rekent/p/7424683.html
Copyright © 2011-2022 走看看