zoukankan      html  css  js  c++  java
  • SpringMVC视图及REST风格

    点击进入第二章:SpringMVC基础配置

    什么是视图解析器?

    springMVC用于处理视图最重要的两个接口是ViewResolver和View。

    ViewResolver的主要作用是把一个逻辑上的视图名称解析成一个真的的视图,而SpringMVC中用于把View对象呈现给客户端的是View对象本身,而ViewResolver只是把逻辑视图名称解析为对象的View对象。

    View接口的主要作用是用来处理视图,返给给客户端。

     

    视图解析器的执行流程:

    请求方法执行完成后,最终返回一个ModelAndView对象,对于那些返回String,View,ModelMap等类型SpingMVC最终会在内部给他们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。StringMVC借助视图解析器得到最终的视图对象,最终的视图可以是JSP,也可能是其他的文件形式的视图。对于最终采取那一种方式渲染处理器并不关心,处理器重点焦距在生产模型数据的工作上,从来实现了MVC充分的解耦。

    视图:

    视图的作用是渲染模型数据,将模型里面的数据以某种形式呈现给用户。为了实现视图模型和具体实现技术的解耦,Sping定义了一个View接口。视图对象由视图解析器负责实例化,由于视图是无状态的,所以它们不会有线程安全问题。

    常用的视图实现类:

    InternalResourceView:将JSP资源封装成一个视图,是springmvc默认使用的视图解析器。

    JstlView:在JSP项目中引入jstl包springmvc会自动使用该解析器

    MapingJackJsonView:将模型通过Jackson开源框架的ObjectMapper以Json方式输出。

    AbstractExcelView:Excel文档视图的抽象类,该视图基于POI构造Excel文档

    AbstractPdfVIew:PDF文档视图的抽象类,该视图基于iText构建Pdf文档

    BeanNameViewResolver:将逻辑视图名解析为一个Bean,Bean的id等于逻辑视图名。

    视图解析器的作用比较单一,将逻辑视图解析为一个具体的视图对象,所有的视图解析器必须实现ViewResolver接口。

    JSP是最常用的视图技术,可以使用InternalResourceView作为视图解析器

    项目中只要引入了JSTL标签则springmvc会自动把视图有InternalResourceView转换成JstlView,JstlView是它的子类。

    每一个视图解析器都实现了Ordered接口并开发出一个order属性,可以通过它设置解析器的优先级,order越小优先级越高。Spring MVC会按视图解析器顺序的优先级对逻辑视图名进行解析,直到解析成功并返回视图对象,否则会抛出ServletException异常

    自定义视图:

    @Component
    public class MyView implements View {
    
        @Override
        public String getContentType() {
            return "text/html";
        }
    
        @Override
        public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
                response.getWriter().println("<h1>Spring MVC Custom view</h1>");
        }
    
    }

    我们需要将这个自定义的视图实现View接口然后重写接口中的两个方法。然后我们把这个类声明成Bean交给spring管理。在这里我们配置一个beanName解析器。

    <!-- 配置BeanName解析器 -->
        <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
            <property name="order" value="1"/>
        </bean>

    然后写一个请求,这个请求返回Bean的名字,默认是首字母小写以驼峰式展现。

    @RequestMapping("myView")
        public String myView(){
            System.out.println("myView load ...");
            return "myView";
        }

    这样就可以完成我们的自定以视图。

    关与重定向:

    如果返回字符串中带有”redirect:“或"forward:",SpringMvc会将其做特殊的处理。

    如果我们需要直接访问视图可以这样配置

    <!– 直接配置对应的视图访问路径 -->
    <mvc:view-controller path="/hello" view-name="hello.jsp" />
    
    <!-- 如果配置了mvc-controller会导致其它页面没法正常访问,还需要添加一个标签 -->
    <mvc:annotation-driven />

    REST章节

    REST(Representational State Transfer):即(资源)表现层状态传递。
    资源(Resources):网络上的一个实体,或者说网络上的一段信息。它可以是一段文本,一段歌曲,一张图片等等,可以用一个URL指向它,每个资源都有一个特定的,独一无二的URL,要访问这个资源,直接访问这个URI即可。
    表现层(Representation):将资源呈现出来的形式。
    状态转化(State Transfer):每发出一个请求,就代表客户端和服务器一次交互。HTTP协议是一个无状态的协议,即所有的状态都保存在服务器端。客户端想要操作服务器,必须通过某些手段,让服务器发生状态转化,而这种转化是建立在表现层之上的,所以就是表现层状态转化。

    在我们的SpringMVC之中支持HTTP四种请求状态,REST规定的HTTP协议中四种表示操作方式的动词

    GET请求:获取资源

    POST请求:新建资源

    PUT:更新资源

    DELETE:删除资源

    我们需要在WEB.xml中配置实现PUT,DELETE请求方式,大家都知道在我们传统的HTML中只有GET,POST两种请求方式。

    <!-- 配置HiddenHttpMethodFilter过滤器实现PUT,DELETE请求 -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.HiddenHttpMethodFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    GET请求

    GET请求:
    <a href="rest/testRest/10">test RestGet请求</a><br><br>
    
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)
    public String testRestGet(@PathVariable Integer id){
        System.out.println("GET请求,获取id为:" + id + "的对象!");
        return SUCCESS;
    }

    Post请求

    POST请求:
    <form action="rest/testRest" method="post">
        <input type="submit" value="post请求" />
    </form>
    
    @RequestMapping(value="/testRest",method=RequestMethod.POST)
    public String testRestPost(){
        System.out.println("POST请求,添加新的对象!");
        return SUCCESS;
    }

    PUT和DELETE请求想要使用必须添加上面的过滤器,并且在Post请求中加上隐藏域name="_method",value="PUT/DELETE"。

    PUT,请求其实是由POST请求转换而来的。

    PUT请求:
    <form action="rest/testRest" method="post">
        <!-- 添加隐藏域,名称为_method,value为请求方式 -->
        <input type="hidden" name="_method" value="PUT" />
        <input type="submit" value="put请求" />
    </form>
    
    @RequestMapping(value="/testRest",method=RequestMethod.PUT)
    public String testRestPut(){
        System.out.println("PUT请求,更新操作!");
        return SUCCESS;
    }

    DELETE请求

    DELETE请求:
    <form action="rest/testRest/10000" method="post">
        <!-- 添加隐藏域,名称为_method,value为请求方式 -->
        <input type="hidden" name="_method" value="DELETE" />
        <input type="submit" value="delete请求" />
    </form>
    
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)
    public String testRestDelete(@PathVariable Integer id){
        System.out.println("DELETE请求,删除操作!" + id);
        return SUCCESS;
    }

    重复一次第一章的内容在我们springmvc拦截所有请求会导致css,js,图片等不能引入我们可以这样解决:

    <!--将非mapping配置下的请求交给默认的Servlet来处理-->
    <mvc:default-servlet-handler/>
    <!--如果添加了默认servlet,mvc请求将无效,需要添加annotation-driven-->
    <mvc:annotation-driven></mvc:annotation-driven>
  • 相关阅读:
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 获取指定进程的输入命令行
    dotnet 获取指定进程的输入命令行
    PHP sqrt() 函数
    PHP sinh() 函数
    PHP sin() 函数
    PHP round() 函数
  • 原文地址:https://www.cnblogs.com/SimpleWu/p/9702984.html
Copyright © 2011-2022 走看看