spring mvc 请求处理方式...
2016-06-16 15:47
447 查看
标题实在不知应该如何定义,略处尴尬。
相信有很多刚接触Spring mvc的小伙伴跟我一样都有个小疑问。如何正确根据场景需要来处理请求,举个栗子吧~~~
拿login作为栗子,账号密码输入完毕 -》 登陆按钮 -》 Controller -》账户正确 -》 主页.jsp (完)。 但在这个过程中,如果账户输入错误呢?如何将错误信息反馈至前台中,有一定springMVC经验的人来说是一个常识基础,所以本文仅属个人笔记范畴。
本人把与后台的请求交互分以下几种情况:1.成功。直接跳转页面 2.失败。返回原页面并提示 3.通过ajax与后台交互。
忽略业务逻辑,直接上主题,如何跳转至前端页面
如:我的是在 “test/main.jsp” 那我只要在方法中返回 test/main即可。
代码简单粗暴,
至于为何直接返回test/main即可而不用加上.jsp后缀是因为在springMVC有所配置。这样的话返回时框架就会自动在末尾加上.jsp,如 reutrn “aaaa” 那么就会自动跳转aaa.jsp至这个页面,如aaa.jsp在项目根部不存在则会报404。
如果登陆失败怎么办呢?,将错误信息返回至前台进行提示就可以哒。
大概就是,让他回到原页面,然后将错误提示信息,存储在request中,返回给页面,再通过el表达式显示出来即可 ${xxx}。也可以保存在session当中,同样在页面通过el表达式显示出来就可以了。 ${sessionScope.xxx}
以上均是通过Servlet来完成页面跳转,但有一点已,提交跳转的情况下,不能够再次转向。否则会报”Cannot
forward after response has been committed“异常。
通过网上资料可知其常用方式有一下两种:
1.通过PrintWriter对象将json数据利用out.write(json);返回 2.通过@ResponseBody 直接返回。
在spring-mvc配置文件中加入以下代码
接着之前上面的代码服务端代码如下,
结果:
另外如果需要返回比较复杂的json格式数据怎么办? 接着上面的方法改直接上代码
其实也简单,设置返回值为String,在返回前自行转换好json格式即可,应该能看懂的吧?
结果:
如返回中文乱码,注解@RequestMapping中加上“produces = "text/html;charset=UTF-8" 如以下:
好了,最后附上本屌的JSON格式转化class
注:java在进行json格式转化时需要jar的支持,如果不懂的JSON格式如何转化,请看这里http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html。
相信有很多刚接触Spring mvc的小伙伴跟我一样都有个小疑问。如何正确根据场景需要来处理请求,举个栗子吧~~~
拿login作为栗子,账号密码输入完毕 -》 登陆按钮 -》 Controller -》账户正确 -》 主页.jsp (完)。 但在这个过程中,如果账户输入错误呢?如何将错误信息反馈至前台中,有一定springMVC经验的人来说是一个常识基础,所以本文仅属个人笔记范畴。
本人把与后台的请求交互分以下几种情况:1.成功。直接跳转页面 2.失败。返回原页面并提示 3.通过ajax与后台交互。
1.直接访问后台,得到结果后跳转页面
这个简单,就是通过Controller中跳转到了另外一个页面而已。login.jsp 页面效果忽略业务逻辑,直接上主题,如何跳转至前端页面
处理情况一:通过控制器返回跳转页面
如:我的是在 “test/main.jsp” 那我只要在方法中返回 test/main即可。
代码简单粗暴,
@RequestMapping(value="/userLogin") public String userLogin(HttpServletRequest req,HttpServletResponse resp,HttpSession session){ String userid = req.getParameter("userid"); String pwd = req.getParameter("pwd"); try { if(userService.userExis(userid)==0){ req.setAttribute("msg","对不起用户不存在!"); return "/login"; } User user = userService.userLogin(userid, pwd); if(user==null){ req.setAttribute("msg","用户名或密码错误!"); return "/login"; } session.setAttribute("userinfo",user); } catch (Exception e) { e.printStackTrace(); } return "test/main"; }
至于为何直接返回test/main即可而不用加上.jsp后缀是因为在springMVC有所配置。这样的话返回时框架就会自动在末尾加上.jsp,如 reutrn “aaaa” 那么就会自动跳转aaa.jsp至这个页面,如aaa.jsp在项目根部不存在则会报404。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <!-- 配置的是前缀 --> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
如果登陆失败怎么办呢?,将错误信息返回至前台进行提示就可以哒。
大概就是,让他回到原页面,然后将错误提示信息,存储在request中,返回给页面,再通过el表达式显示出来即可 ${xxx}。也可以保存在session当中,同样在页面通过el表达式显示出来就可以了。 ${sessionScope.xxx}
处理情况二:通过servlet原始方式转发/重定向
可以使用我们早就熟悉的servlet进行转发与重定向来达到页面跳转目的。@RequestMapping(value="/test") public void test(HttpServletResponse ponse,HttpServletRequest req){ try { //重定向至主页 if(true){ ponse.sendRedirect("test/main.jsp"); } req.getRequestDispatcher("test/login.jsp").forward(req,ponse); } catch (Exception e) { e.printStackTrace(); } }另外应该还可以是用PrintWriter来完成跳转页面。
@RequestMapping(value="/test") public void test(HttpServletResponse ponse,HttpServletRequest req){ try { PrintWriter out = ponse.getWriter(); out.print("<script>alert('登录成功!');window.location.href='test/main.jsp'</script>"); //重定向至主页 /* if(true){ ponse.sendRedirect("test/main.jsp"); } req.getRequestDispatcher("test/login.jsp").forward(req,ponse);*/ } catch (Exception e) { e.printStackTrace(); } }
以上均是通过Servlet来完成页面跳转,但有一点已,提交跳转的情况下,不能够再次转向。否则会报”Cannot
forward after response has been committed“异常。
2.通过ajax
在开发时,我们经常会使用到ajax进行开发,那么在springMVC中如如何使用ajax并返回json格式数据呢,通过网上资料可知其常用方式有一下两种:
1.通过PrintWriter对象将json数据利用out.write(json);返回 2.通过@ResponseBody 直接返回。
处理情况一:通过PrintWriter
这里引用一下其他博客中的原文,首先需要引入一个json-lib-2.2.2-jdk15.jar的支持包,然后此处直接上代码/** * 用于转换成json格式 */ public static void toJSON(Object object, HttpServletResponse resp) { resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); PrintWriter out = null; try { out = resp.getWriter(); String json = JSON.toJSONString(object); System.out.println(json); // 输出json格式 out.write(json); } catch (IOException e) { e.printStackTrace(); } finally { out.flush(); out.close(); } }至于是什么原理,表示不清楚,此方式比较简单一般复制粘贴即可使用,此处用了一个自己封装的方法,应该可以直接看懂理解的吧??
处理情况二:通过Spring内置的支持(@ResponseBody)
首先需要jackson-mapper-asl-1.8.5.jar和jackson-core-asl-1.8.5.jar两个jar作为支持。在spring-mvc配置文件中加入以下代码
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> </list> </property> </bean>如存在 <mvc:annotation-driven/>此段代码,以上则可省略忽略。
接着之前上面的代码服务端代码如下,
@RequestMapping(value="/test") @ResponseBody public Map<String, String> test(HttpServletResponse ponse,HttpServletRequest req){ Map<String, String> map = null; try { /*PrintWriter out = ponse.getWriter(); out.print("<script>alert('登录成功!');window.location.href='test/main.jsp'</script>");*/ //重定向至主页 /* if(true){ ponse.sendRedirect("test/main.jsp"); } req.getRequestDispatcher("test/login.jsp").forward(req,ponse);*/ map = new HashMap<String, String>(); map.put("key","数据值"); } catch (Exception e) { e.printStackTrace(); } return map; }
结果:
另外如果需要返回比较复杂的json格式数据怎么办? 接着上面的方法改直接上代码
@RequestMapping(value="/test") @ResponseBody public String test(HttpServletResponse ponse,HttpServletRequest req){ String result =null; try { /*PrintWriter out = ponse.getWriter(); out.print("<script>alert('登录成功!');window.location.href='test/main.jsp'</script>");*/ //重定向至主页 /* if(true){ ponse.sendRedirect("test/main.jsp"); } req.getRequestDispatcher("test/login.jsp").forward(req,ponse);*/ List<ProductType> list = productTypeService.queryProductTypeList(); JsonConfig config = JSONFormatter.getJsonCofig(); JSONArray jsonarr = JSONArray.fromObject(list, config); JSONObject jsresu= JSONFormatter.returnJSON(jsonarr,null); result = jsresu.toString(); } catch (Exception e) { e.printStackTrace(); } return result; }
其实也简单,设置返回值为String,在返回前自行转换好json格式即可,应该能看懂的吧?
结果:
如返回中文乱码,注解@RequestMapping中加上“produces = "text/html;charset=UTF-8" 如以下:
@Controller @RequestMapping(value="userController",produces = "text/html;charset=UTF-8")
好了,最后附上本屌的JSON格式转化class
import java.util.Date; import java.util.Iterator; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.util.PropertyFilter; import cn.thinknet.utils.others.AKPagination; public class JSONFormatter { public static JsonConfig getJsonCofig() { JsonConfig config = new JsonConfig(); config.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss")); config.setJsonPropertyFilter(new PropertyFilter() { public boolean apply(Object source, String name, Object value) { return value == null; } }); return config; } public static JSONObject returnJSON(JSONArray ja,Integer TotalRecordCount) { JSONObject jso = new JSONObject(); jso.put("total",TotalRecordCount); jso.put("rows", ja); return jso; } public static JSONObject returnJSONForSavaEmpCommunity(JSONArray ja,AKPagination page,List<String> communityList) { JSONObject jso = new JSONObject(); jso.put("total", page.getTotalRecordCount()); for (Iterator iter = ja.iterator(); iter.hasNext();) { JSONObject obj = (JSONObject) iter.next(); if (communityList.contains(obj.getString("communityId"))) { obj.put("forchecked", "yes"); } } jso.put("rows", ja); return jso; } }
注:java在进行json格式转化时需要jar的支持,如果不懂的JSON格式如何转化,请看这里http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html。
相关文章推荐
- 使用Shiro 集合Spring来实现权限控制
- 深入SpringBoot:自定义PropertySourceLoader
- JAVA环境变量的配置
- MyBatis进阶(三)—与Spring整合
- 【转载】SpringMVC中使用Interceptor拦截器
- 普通类获取spring上下文
- java读XML到实体bean中
- java多态中向上转型+重写的奥秘
- Ehcache学习(二)ehcache与spring注解实例
- java线程:Atomic(原子的)
- JAVA设计模式之状态模式
- Eclipse导出可执行Java工程/可执行Jar文件(包含第三方Jar包)
- ECMAScript 6
- java中使用FTPClient类进行FTP上传下载大文件,导致假死现象
- eclipse(adt-bundle)的Android SDK Manager下载不了谷歌的东西怎么办?
- Spring Cache
- 关于使用eclipse创建一个servlet工程
- 对Promise的一些理解
- java生成XML文档操作
- Spring MVC应用原理,读完本文,你理解了吗?