springmvc

springmvc 动态修改返回值类型,实现方法既能被ajax调用,又能被同步请求调用

点点圈 提交于 2020-05-08 21:11:56
spingmvc 的requestmappling方法如何动态修改返回值类型 业务场景: 客户端请求服务端(两个公司的不同系统之间的请求,类似于http接口),请求中参数异常就直接给客户端提示,请求正常,服务端控制跳转到自己系统的页面,执行剩余逻辑。 springmvc 的requestmapping 方法,分两种,一种是带有responsebody注解的(ajax操作),一种是没有(做请求跳转) springmvc 提供了一个 标签( <mvc:annotation-driven><mvc:return-value-handlers><bean/></mvc:return-value-handlers></mvc:annotation-driven> ),用来注册返回值类型的,我们可以自己定义返回值类型(例如:定义User), 接下来可以了解下生命周期,启动的时候把把自定义的方法返回值类型注册,然后放到一个list里面, requestmapping方法被调用的时候,先执行方法体,然后会根据方法的实际返回类型,到list中去找, 如果这个返回值类型没有,并且是responsebody方法则转换成json,返回页面,如果不是responsebody则抛出返回类型不支持的异常,要实现我们的需求,就要从这里侵入源码, 前面定义user 假设有两个属性,一个url(地址挑转)

Spring resultFUL编程

自作多情 提交于 2020-05-08 21:11:17
主题:spring mvc RESTful风格开发配置: 第一步: <!-- spring mvc RESTful风格的web.xml配置 --> <servlet> <servlet-name>spingmvc_RESTful</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- spring mvc的配置文件路径 --> <param-value>classpath:conf/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spingmvc_RESTful</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 第二步: <!-- spring mvc 配置文件对静态资源的解析 --> <!-- 配置注解驱动 --> <mvc:annotation

springMVC笔记系列(20)——控制器实现详解(下)

夙愿已清 提交于 2020-04-20 10:18:51
这次接着上次的博客继续将springMVC控制器的东西说完。本篇主要说说控制器处理带属性参数的url请求的三种方式:参数风格、rest风格、传统的HttpServlet风格。 参数风格 其实,上篇博客已经在示例当中将参数风格的实现方式给出了,不过没有详细说明。 所谓参数风格,就是讲url的请求参数按照url请求参数的格式予以呈现,咳咳,似乎有点废话,不过这种方式应该是最一般的方式,也是过去一直用的。 比如,请求 http://localhost:8080/mvc/courses/view?courseId=123 控制器写法:(完整写法借鉴上一篇博客,或者在本文最后一并给出新的) //提供完成一个业务的方法:根据课程ID查询课程内容。 //本方法将处理 /courses/view?courseId=123 形式的URL @RequestMapping(value="/view", method= RequestMethod.GET) public String viewCourse(@RequestParam("courseId") Integer courseId, Model model) { //日志输出,查看请求的courseId是不是我们的courseId log.info("In viewCourse, courseId = {}", courseId); Course

@Controller和@RestController的区别

放肆的年华 提交于 2020-04-14 23:48:33
【推荐阅读】微服务还能火多久?>>> 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解。4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet。 使用这个特性,我们可以开发REST服务的时候不需要使用@Controller而使用专门的@RestController。 当你实现一个RESTful web services的时候,response将一直通过response body(即字符串)发送。为了简化开发,Spring 4.0提供了一个专门版本的controller。 官方文档解释: @RestController is a stereotype annotation that combines @ResponseBody and @Controller. 意思是: @RestController注解相当于@ResponseBody + @Controller合在一起的作用。 1) 如果只是使用@RestController,则方法无法返回jsp页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容,一般为JSON。 例如:本来应该到success.jsp页面的,则返回的就是“success”字符串了. 2)

springmvc学习笔记(10)-springmvc注解开发之商品修改功能

僤鯓⒐⒋嵵緔 提交于 2020-04-09 09:41:17
springmvc学习笔记(10)-springmvc注解开发之商品修改功能 标签: springmvc [TOC] 本文以商品修改为例,记录springmvc的注解开发,包括mapper,service,controller,@RequestMapping,controller方法的返回值等 需求 操作流程: 1.进入商品查询列表页面 2.点击修改,进入商品修改页面,页面中显示了要修改的商品。要修改的商品从数据库查询,根据商品id(主键)查询商品信息 3.在商品修改页面,修改商品信息,修改后,点击提交 开发mapper mapper: 根据id查询商品信息 根据id更新Items表的数据 不用开发了,使用逆向工程生成的代码。 开发service 在 com.iot.learnssm.firstssm.service.ItemsService 中添加两个接口 //根据id查询商品信息 /** * * <p>Title: findItemsById</p> * <p>Description: </p> * @param id 查询商品的id * @return * @throws Exception */ ItemsCustom findItemsById(Integer id) throws Exception; //修改商品信息 /** * * <p>Title:

Java序列化JSON时long型数值不准确

送分小仙女□ 提交于 2020-04-07 12:28:40
现象 项目中用到了唯一ID生成器.生成出的ID时long型的(比如说4616189619433466044). 通过某个rest接口中返回json数据后,发现浏览器解析完变成了4616189619433466000 原因 大致描述:java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值). 详情参考这里 http://stackoverflow.com/questions/17320706/javascript-long-integer rest接口返回的json字符串中,数值还是对的.当js对json进行解析并转成js object的时候,出现了问题. 解决方法 方法就是不用number来保存long值,而是使用string.可以在客户端js修改,也可以在服务端序列化的时候修改. 此处给出sprign mvc 使用 jackson时的解决方案. [@Override](https://my.oschina.net/u/1162528) public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter =

SpringMVC 4.0常用注解

我的梦境 提交于 2020-03-01 20:46:31
注解的出现终结了使用XML配置文件的年代,它让程序拥有更高的可读性,可配置性与灵活性。上一篇介绍的SpringMVC 2.5版本的注解使用已经发布了很多年了,如今项目中使用的4.0版本发生了很大的变化。今天我们就一起来看看SpringMVC 4.0中那些常用的注解。 1.Controller Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用户。SpringMVC 使用Controller注解定义控制器,它还允许自动检测定义在类路径下的组件并自动注册。如想自动检测生效,需在XML头文件下引入 spring-context: <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" xsi:schemaLocation="http://www.springframework.org/schema/beans

Http中的重定向和请求转发

99封情书 提交于 2020-03-01 09:43:22
1.重定向和请求转发区别 本质区别 例子1. 假设你去办理护照 重定向: 你先去了A局, A局的人说: "这个事情不归我们管的,你去B局吧", 然后你就从A局退了出来, 去了B局 转发: 你先去了A局, A局看了以后知道这个事情其实应该由B局来管的, 但是没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B局的人,让他们办好之后给送了回来 总结: 请求转发是服务器的行为,重定向是客户端的行为 请求转发的流程是 :客户端浏览器发送请求->web服务器接受->调用内部的方法容器内部完成请求处理和转发动作-> 将目标资源发送给客户 在客户浏览器路径下显示的是第一次访问的路径,也就是说客户端感觉不到服务器端做了转发,转发行为是浏览器只做了一次访问的 重定向的流程是 :客户端浏览器发送请求->web服务器接受后发送302状态码响应->客户端发现是302响应,则自动发送一个新的请求->服务器根据此请求寻找资源发送给客户 在客户端浏览器路径栏显示的是其重定向的路径,客户可以观察地址的变化,重定向的行为是浏览器做了至少两次访问 在重定向的过程中,传输的信息会被丢失 2.springmvc中请求转发和重定向 请求转发 (1)返回ModelAndView @RequestMapping(value="/forward",method=RequestMethod.GET) public

springboot开发简单的web应用前篇

牧云@^-^@ 提交于 2020-02-29 14:55:32
你已经会spring了,也非常熟悉springmvc的开发,平时你搭建个web应用简单吗?好像也不难!那么今天我来试试用springboot来开发个简单的web应用来试试。 在正式讲解springboot开发web应用之前有些问题还得讨论下,比如…… 为什么需要springboot 那么让我来举个例子,假设作为程序员的你要找个女朋友,现在有两个女朋友可以选: 第一个女孩的名字叫spring 第二个女孩的名字叫springboot 先来说第一种情况,你找的女朋友是spring 你:亲爱的,我饿了,我想吃土豆烧肉 Spring:好啊,那么哈尼,请先把土豆切好,肉切好行吗 你:好,(然后你就在屁颠屁颠的切肉、切土豆) Spring:真好,土豆切好了,肉了切好了,请问哈尼,你要放多少油呢,多少盐呢?肉要几分熟? 你:……(一口血吐地上) 上面这种情况你肯定不陌生,用spring伴随着大量的配置比如: web.xml application-service.xml application-trans.xml application-db.xml servlet-web.xml 任何一个配置文件出差错,那么做出来的菜就惨不忍睹。 对了,你还得部署到tomcat等web容器中去 再来说第二种情况,你找的女朋友是springboot. 你:亲爱的,我饿了,我想吃土豆烧肉 Springboot:好啊

项目问题总结一、全局变量引起的并发问题

空扰寡人 提交于 2020-02-28 23:26:32
最近刚完成了一个短彩信群发平台的开发工作,系统采用springmvc+hibernate+jdbctemplate+mysql架构。其中遇见许多问题,闲暇之余记录下来以避免在后续项目中再犯同样的错误。 先看下面小段代码,一个controller,一个service。 controller.java代码: ........ @Autowired private XXXService xxxService; ........ @RequestMapping("/doXXX.do") public void doXXX(){ ..... xxxService.saveXXX(String content,....); ..... } XXXService.java代码: private String content; ...... private void init(){//清空请求参数 content = null; ...... } public boolean saveXXX(String content, ......){ this.init(content, ...); this.content = content; //业务逻辑处理 } 以上这段代码在访问量不构成并发时不会出现什么问题。 但当一个请求还未完成,另一个请求已经开始执行的情况下就会出现问题(并发):