@Controller和@RestControllervisa和银联的区别别

trackbacks-0
/blog/<span style="color: # HTTP GET =&  得到id = 1的blog/blog/<span style="color: # HTTP DELETE =& 删除 id = 1的blog/blog/<span style="color: # HTTP PUT =&  更新id = 1的blog/blog   HTTP POST =&  新增BLOG
&&&&以下详细解一下spring rest使用.
&&&&首先,我们带着如下两个问题查看本文。
&&&&&&&&1.如何在java构造没有扩展名的RESTful url,如 /forms/1,而不是 /forms/1.do
&&&&&&&&2.浏览器的form标签不支持提交delete,put请求,如何曲线解决
&&&&springmvc rest 实现
&&&&springmvc的resturl是通过&#64;RequestMapping 及&#64;PathVariable annotation提供的,&&&&通过如&#64;RequestMapping(value="/blog /{id}",method=RequestMethod.DELETE)即可处理/blog/1 的delete请求.
<span style="color: #&#64;RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)<span style="color: #public ModelAndView delete(&#64;PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {<span style="color: # &blogManager.removeById(id);<span style="color: # &return new ModelAndView(LIST_ACTION);<span style="color: #}
&&&&&#64;RequestMapping &#64;PathVariable如果URL中带参数,则配合使用,如
<span style="color: #&#64;RequestMapping(value="/blog/{blogId}/message/{msgId}",method=RequestMethod.DELETE)<span style="color: #public ModelAndView delete(&#64;PathVariable("blogId") Long blogId,&#64;PathVariable("msgId") Long msgId,HttpServletRequest request,HttpServletResponse response) {<span style="color: #}
&&&&1.springmvc web.xml配置
&1&!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css --&&2 &&servlet-mapping&&3 &&servlet-name&default&/servlet-name&&4 &&url-pattern&/static/*&/url-pattern&&5 &&/servlet-mapping&&6 &&servlet&&7   &&servlet-name&springmvc&/servlet-name&&8   &&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&&9   &&load-on-startup&<span style="color: #&/load-on-startup&<span style="color: # &&/servlet&<span style="color: #<span style="color: # &&!-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css --&<span style="color: # &&filter&<span style="color: # &&filter-name&UrlRewriteFilter&/filter-name&<span style="color: # &&filter-class&org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&/filter-class&<span style="color: # &&init-param&<span style="color: #    &&param-name&confReloadCheckInterval&/param-name&<span style="color: #    &&param-value&<span style="color: #&/param-value&<span style="color: #   &&/init-param&<span style="color: # &&init-param&<span style="color: #       &&param-name&logLevel&/param-name&<span style="color: #       &&param-value&DEBUG&/param-value&<span style="color: #     &&/init-param&<span style="color: # &&/filter&<span style="color: # &&filter-mapping&<span style="color: # &&filter-name&UrlRewriteFilter&/filter-name&<span style="color: # &&url-pattern&/*&/url-pattern&<span style="color: # &&/filter-mapping&<span style="color: #<span style="color: # &&!-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 --&<span style="color: # &&servlet-mapping&<span style="color: #   &&servlet-name&springmvc&/servlet-name&<span style="color: #   &&url-pattern&/&/url-pattern&<span style="color: # &&/servlet-mapping&<span style="color: #<span style="color: # &&!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 --&<span style="color: # &&filter&<span style="color: # &&filter-name&HiddenHttpMethodFilter&/filter-name&<span style="color: # &&filter-class&org.springframework.web.filter.HiddenHttpMethodFilter&/filter-class&<span style="color: # &&/filter&<span style="color: #<span style="color: # &&filter-mapping&<span style="color: # &&filter-name&HiddenHttpMethodFilter&/filter-name&<span style="color: # &&servlet-name&springmvc&/servlet-name&<span style="color: # &&/filter-mapping&
&&&&2.webapp/WEB-INF/springmvc-servlet.xml配置,使用如下两个class激活&#64;RequestMapping annotation
<span style="color: #&bean&class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/&&&&<span style="color: #&bean&class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/&&&<span style="color: #
&&&&3.Controller编写
&1/**&*//**&2 &* &#64;RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级&#64;RequestMapping之一,&3 &* 如下面示例, 访问方法级别的&#64;RequestMapping("/new"),则URL为 /userinfo/new&4 &*/&5&#64;Controller&6&#64;RequestMapping("/userinfo")&7public class UserInfoController extends BaseSpringController{&8 &//默认多列排序,example: username desc,createTime asc&9 &protected static final String DEFAULT_SORT_COLUMNS = null;<span style="color: #<span style="color: # &private UserInfoManager userInfoM<span style="color: #<span style="color: # &private final String LIST_ACTION = "redirect:/userinfo";<span style="color: #<span style="color: # &/**&*//**<span style="color: # &* 通过spring自动注入<span style="color: # &**/<span style="color: # &public void setUserInfoManager(UserInfoManager manager) {<span style="color: # &this.userInfoManager = <span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 列表 */<span style="color: # &&#64;RequestMapping<span style="color: # &public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) {<span style="color: # &PageRequest&Map& pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);<span style="color: # &//pageRequest.getFilters(); //add custom filters <span style="color: #<span style="color: # &Page page = this.userInfoManager.findByPageRequest(pageRequest);<span style="color: # &savePage(page,pageRequest,request);<span style="color: # &return new ModelAndView("/userinfo/list","userInfo",userInfo);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 进入新增 */<span style="color: # &&#64;RequestMapping(value="/new")<span style="color: # &public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {<span style="color: # &return new ModelAndView("/userinfo/new","userInfo",userInfo);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 显示 */<span style="color: # &&#64;RequestMapping(value="/{id}")<span style="color: # &public ModelAndView show(&#64;PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {<span style="color: # &UserInfo userInfo = (UserInfo)userInfoManager.getById(id);<span style="color: # &return new ModelAndView("/userinfo/show","userInfo",userInfo);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 编辑 */<span style="color: # &&#64;RequestMapping(value="/{id}/edit")<span style="color: # &public ModelAndView edit(&#64;PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {<span style="color: # &UserInfo userInfo = (UserInfo)userInfoManager.getById(id);<span style="color: # &return new ModelAndView("/userinfo/edit","userInfo",userInfo);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 保存新增 */<span style="color: # &&#64;RequestMapping(method=RequestMethod.POST)<span style="color: # &public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception {<span style="color: # &userInfoManager.save(userInfo);<span style="color: # &return new ModelAndView(LIST_ACTION);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 保存更新 */<span style="color: # &&#64;RequestMapping(value="/{id}",method=RequestMethod.PUT)<span style="color: # &public ModelAndView update(&#64;PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception {<span style="color: # &UserInfo userInfo = (UserInfo)userInfoManager.getById(id);<span style="color: # &bind(request,userInfo);<span style="color: # &userInfoManager.update(userInfo);<span style="color: # &return new ModelAndView(LIST_ACTION);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 删除 */<span style="color: # &&#64;RequestMapping(value="/{id}",method=RequestMethod.DELETE)<span style="color: # &public ModelAndView delete(&#64;PathVariable Long id,HttpServletRequest request,HttpServletResponse response) {<span style="color: # &userInfoManager.removeById(id);<span style="color: # &return new ModelAndView(LIST_ACTION);<span style="color: # &}<span style="color: #<span style="color: # &/**&*//** 批量删除 */<span style="color: # &&#64;RequestMapping(method=RequestMethod.DELETE)<span style="color: # &public ModelAndView batchDelete(HttpServletRequest request,HttpServletResponse response) {<span style="color: # &String[] items = request.getParameterValues("items");<span style="color: # &for(int i = <span style="color: #; i & items. i++) {<span style="color: #  &java.lang.Long id = new java.lang.Long(items[i]);<span style="color: #  &userInfoManager.removeById(id);<span style="color: # &}<span style="color: # &return new ModelAndView(LIST_ACTION);<span style="color: # &}<span style="color: #<span style="color: #}<span style="color: #
<span style="color: #/userinfo  =& index()<span style="color: # &/userinfo/new =& _new()<span style="color: # &/userinfo/{id} =& show()<span style="color: # &/userinfo/{id}/edit  =& edit()<span style="color: # &/userinfo POST =& create()<span style="color: # &/userinfo/{id} PUT =& update()<span style="color: # &/userinfo/{id} DELETE =& delete()<span style="color: # &/userinfo DELETE =& batchDelete()<span style="color: #
&&&&&&&&注(不使用 /userinfo/add  =& add() 方法是由于add这个方法会被maxthon浏览器当做广告链接过滤掉,因为包含ad字符)
&&&&4.jsp 编写
<span style="color: #&form:form action="${ctx}/userinfo${userInfo.userId}" method="put"&<span style="color: #&/form:form&
&&&&生成的html内容如下, 生成一个hidden的_method=put,并于web.xml中的HiddenHttpMethodFilter配合使用,在服务端将post请求改为put请求
<span style="color: #&form id="userInfo" action="/springmvc_rest_demo/userinfo/2" method="post"&<span style="color: # &&input type="hidden" name="_method" value="put"/&<span style="color: #&/form&
&&&&另外一种方法是你可以使用ajax发送put,delete请求.
&&&&5.静态资源的URL重写
&&&&&&&&如上我们描述,现因为将default servlet映射至/static/的子目录,现我们访问静态资源将会带一个/static/前缀.
&&&&&&&&如 /foo.gif, 现在访问该文件将是 /static/foo.gif.
&&&&&&&&那如何避免这个前缀呢,那就是应用URL rewrite,现我们使用 , 重写规则如下
<span style="color: #&urlrewrite&<span style="color: #  &&!-- 访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 /foo.gif =& /static/foo.gif --&<span style="color: #  &&rule&<span style="color: #   &&condition operator="notequal" next="and" type="request-uri"&.*.jsp&/condition&<span style="color: #   &&condition operator="notequal" next="and" type="request-uri"&.*.jspx&/condition&<span style="color: #    &&from&^(/.*\..*)$&/from&<span style="color: #    &&to&/static$1&/to&<span style="color: #  &&/rule&<span style="color: #&/urlrewrite&
阅读(149780)
阅读排行榜
评论排行榜在这篇文章中,我们将通过开发使用&Spring4&@RestController&注解来开发基于Spring&MVC4的REST风格的JSON服务。我们将扩展这个例子通过简单的注释与JAXB标注域类支持XML输出和JSON输出。在这个示例中,我们需要URL的后缀为 .xml 或 .json 以获得所需的输出。
使用以下技术:
Spring 4.0.6.RELEASE
jackson-mapper-asl 1.9.13
Tomcat 7.0.54
Eclipse JUNO Service Release 2
让我们现在开始!
第1步:创建目录结构
之前的文章包含了一步一步的指导,使用&Eclipse&来创建一个Maven项目(Spring4MVCRestServiceDemo)。
下面是最终的项目目录结构:
我们将使用 Spring&Java配置而不使用XML。现在,让我们来添加/更新上述项目结构中提到的内容。
第2步:使用&pom.xml&更新所需的依赖
&?xml version="1.0"?&
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.yiibai.springmvc&/groupId&
&artifactId&Spring4MVCRestServiceDemo&/artifactId&
&packaging&war&/packaging&
&version&1.0.0&/version&
&name&Spring4MVCRestServiceDemo Maven Webapp&/name&
&properties&
&springframework.version&4.0.6.RELEASE&/springframework.version&
&/properties&
&dependencies&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&javax.servlet-api&/artifactId&
&version&3.1.0&/version&
&/dependency&
&dependency&
&groupId&javax.servlet.jsp.jstl&/groupId&
&artifactId&jstl-api&/artifactId&
&version&1.2&/version&
&/dependency&
&dependency&
&groupId&javax.servlet.jsp&/groupId&
&artifactId&javax.servlet.jsp-api&/artifactId&
&version&2.3.1&/version&
&/dependency&
&dependency&
&groupId&org.codehaus.jackson&/groupId&
&artifactId&jackson-mapper-asl&/artifactId&
&version&1.9.13&/version&
&/dependency&
&/dependencies&
&pluginManagement&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-war-plugin&/artifactId&
&version&2.4&/version&
&configuration&
&warSourceDirectory&src/main/webapp&/warSourceDirectory&
&warName&Spring4MVCRestServiceDemo&/warName&
&failOnMissingWebXml&false&/failOnMissingWebXml&
&/configuration&
&/plugins&
&/pluginManagement&
&finalName&Spring4MVCRestServiceDemo&/finalName&
&/project&&
上面的 pom.xml 与以前的教程中定义的相同。有一个显着的区别:&我们已经包括一个依赖于Jackson&库(jackson-mapper-asl),其将用于所述响应数据转换成JSON字符串。
对于Spring&4.1.x&和以上,&jackson-databind&2.3或以上是推荐使用的,以避免转换问题。
安全的选择,你可以包括&jackson-databind&最新版本。
&dependency&
&groupId&com.fasterxml.jackson.core&/groupId&
&artifactId&jackson-databind&/artifactId&
&version&2.5.3&/version&
&/dependency&
第3步:添加一个POJO/域对象
package com.yiibai.springmvc.
public class Message {
public Message(String name, String text) {
this.name =
this.text =
public String getName() {
public String getText() {
上述对象将从控制器返回&Jackson&转换成&JSON&的格式。
第4步:添加控制器
在&src/main/java&包下添加控制器类,如下图所示。
package com.yiibai.springmvc.
import org.springframework.web.bind.annotation.PathV
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RestC
import com.yiibai.springmvc.domain.M
@RestController
public class HelloWorldRestController {
@RequestMapping("/hello/{player}")
public Message message(@PathVariable String player) {
Message msg = new Message(player, "Hello " + player);
@PathVariable表示参数将被绑定到变量 URI 模板。更有趣的事情,这里要注意的是,这里我们使用的是 @RestController 注解,这标志着这个类作为控制器,每一个方法返回域对象/pojo代替一个视图。这意味着我们不再使用视图解析器,我们不再直接发送响应的HTML,我们只发送的域对象转换成格式。在我们的例子中,由于&jackson&包含在类路径中,消息对象将转换成JSON格式。
第5步:添加配置类
package com.yiibai.springmvc.
import org.springframework.ponentS
import org.springframework.context.annotation.C
import org.springframework.web.servlet.config.annotation.EnableWebM
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.yiibai.springmvc")
public class HelloWorldConfiguration {
在这里,这个类是主要提供组件,扫描和注释支持。需要注意的是,我们没有任何视图解析器配置,因为我们在Rest案例并不需要。
第6步:添加初始化类
添加一个初始化类实现WebApplicationInitializer在src/main/java,使用如下图所示指定包(在这种情况下,替代在web.xml中定义的任何spring的配置)。在Servlet&3.0容器启动时,这个类会被加载并实例,它是在启动时方法将通过servlet容器调用。
package com.yiibai.springmvc.
import javax.servlet.ServletC
import javax.servlet.ServletE
import javax.servlet.ServletR
import org.springframework.web.WebApplicationI
import org.springframework.web.context.support.AnnotationConfigWebApplicationC
import org.springframework.web.servlet.DispatcherS
public class HelloWorldInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(HelloWorldConfiguration.class);
ctx.setServletContext(container);
ServletRegistration.Dynamic servlet = container.addServlet(
"dispatcher", new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
更新:请注意,上面的类可以写成更加简洁[和它的首选方式],通过扩展&AbstractAnnotationConfigDispatcherServletInitializer&基类,如下所示:
package com.yiibai.springmvc.
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletI
public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class&?&[] getRootConfigClasses() {
return new Class[] { HelloWorldConfiguration.class };
protected Class&?&[] getServletConfigClasses() {
protected String[] getServletMappings() {
return new String[] { "/" };
第7步:构建和部署应用程序
现在构建&war(在&Eclipse中)或通过&Maven&命令行(&mvn&clean&install)。&部署&war&文件到Servlet3.0容器。
运行它。访问:&&,您将看到 JSON 输出,如下图所示:
就这样,所有输出如上所示。
适应XML输出
现在,如上面提到的,只是通过增加模型类(Message)JAXB注释,我们可以让XML输出支持以及JSON输出。下面是相同的演示:
package com.yiibai.springmvc.
import javax.xml.bind.annotation.XmlE
import javax.xml.bind.annotation.XmlRootE
@XmlRootElement(name = "pizza")
public class Message {
public Message(){
public Message(String name, String text) {
this.name =
this.text =
@XmlElement
public String getName() {
@XmlElement
public String getText() {
编译,部署并再次运行它,会看到下面的输出(注意URL后缀),访问URL:
再次访问:
如果没有任何后缀,默认格式是XML:
到这里,全部完成!
代码下载:
加QQ群啦!
JAVA技术QQ群:
MySQL/SQL语句QQ群:
Python QQ群:
大数据开发技术:
易百教程移动端:请扫描本页面底部(右侧)二维码关注微信公众号,或直接手机访问:
上一篇:下一篇:Spring Framework: @RestController vs @Controller - Genuitec1. Controller, RestController的共同点
&&&& 都是用来表示Spring某个类的是否可以接收HTTP请求
2.& Controller, RestController的不同点
&&&& @Controller标识一个Spring类是Spring MVC controller处理器
&&&& @RestController:& a convenience annotation that does nothing more than adding the@Controller&and@ResponseBody&annotations。& @RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
阅读(...) 评论()@RestController 和 @Controller的区别 - sdmjhca的专栏 - CSDN博客
@RestController 和 @Controller的区别
1. Controller, RestController的共同点
&&&& 都是用来表示某个类的是否可以接收HTTP请求
2.& Controller, RestController的不同点
&&&& @Controller标识一个Spring类是Spring MVC controller处理器
&&&& @RestController:& a convenience annotation that does nothing more than adding the@Controller&and@ResponseBody&annotations。& @RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。
restcontroller与controller
假定一个user对象,对象有很多属性(name,sex,age,birth,address,tel)&
在我的了解中,这二者的区分为:@restcontroller为@controller和@responsebody的结合&
在@controller注解中,返回的是字符串,或者是字符串匹配的模板名称,即直接渲染视图,与html页面配合使用的,
在这种情况下,前后端的配合要求比较高,java后端的代码要结合html的情况进行渲染,使用model对象(或者modelandview)的数据将填充user视图中的相关属性,然后展示到浏览器,这个过程也可以称为渲染;&
java示例代码如下:
@Controller
@RequestMapping(method = RequestMethod.GET, value = &/&)
public String getuser(Model model) throws IOException {
model.addAttribute(&name&,bob);
model.addAttribute(&sex&,boy);
return &user&;//user是模板名
}对应视图user.jsp中的html代码:
而在@restcontroller中,返回的应该是一个对象,即return一个user对象,这时,在没有页面的情况下,也能看到返回的是一个user对象对应的json字符串,而前端的作用是利用返回的json进行解析渲染页面,java后端的代码比较自由。&
java端代码:
@RestController
@RequestMapping(method = RequestMethod.GET, value = &/&)
public User getuser( ) throws IOException {
User bob=new User();
bob.setName(&bob&);
bob.setSex(&boy&);
访问网址得到的是json字符串{“name”:”bob”,”sex”:”boy”},前端页面只需要处理这个字符串即可
我的热门文章

我要回帖

更多关于 同比和环比的区别 的文章

 

随机推荐