spring mvc 请求处理方式...

标题实在不知应该如何定义,略处尴尬。

相信有很多刚接触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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值