本篇文章给大家带来的内容是关于springmvc视图及rest风格的详细分析(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
什么是视图解析器?
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异常
自定义视图:
@componentpublic 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>
以上就是springmvc视图及rest风格的详细分析(附代码)的详细内容。