SpringMVC视图及REST风格

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

什么是视图解析器?html

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

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

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

 

视图解析器的执行流程:安全

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

视图:网络

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

经常使用的视图实现类:app

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>
相关文章
相关标签/搜索