1. 程式人生 > >spring mvc 請求處理方式...

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。

相關推薦

spring mvc 請求處理方式...

標題實在不知應該如何定義,略處尷尬。 相信有很多剛接觸Spring mvc的小夥伴跟我一樣都有個小疑問。如何正確根據場景需要來處理請求,舉個栗子吧~~~   拿login作為栗子,賬號密碼輸入完畢 -》 登陸按鈕 -》 Controller -》賬戶正確 -》 主頁.jsp

Spring MVC請求處理流程及架構

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; H

Spring mvc請求處理流程詳解(一)之檢視解析

前言   Spring mvc框架相信很多人都很熟悉了,關於這方面的資料也是一搜一大把。但是感覺講的都不是很細緻,讓很多初學者都雲裡霧裡的。本人也是這樣,之前研究過,但是後面一段時間不用發現又忘記了。所以決定寫下來,以備後用。   本系列文基於spring-

Spring mvc 請求處理

轉自:http://www.cnblogs.com/dreamworlds/p/5396112.html 轉自:http://www.jianshu.com/p/baa3a05cd271 轉自:http://blog.csdn.net/binglumeng/

Spring MVC請求處理流程

從web.xml中 servlet的配置開始, 根據servlet攔截的url-parttern,來進行請求轉發 Spring MVC工作流程圖 圖一 圖二  Spring工作流程描述       1. 使用者向伺服器傳送請求,請求被Spring 前端控制Servelt Di

spring mvc請求處理流程/原理

1.spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責負責對請求進行真正的處理工作。2.DispatcherServlet查詢一個或多個Handl

Spring MVC請求處理具體流程

// 前端控制器分派方法 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { Htt

Spring MVC請求處理流程分析

一、簡介 Spring MVC框架在工作中經常用到,配置簡單,使用起來也很方便,很多書籍和部落格都有介紹其處理流程,但是,對於

spring mvc請求controller訪問方式

1.一個Controller裡含有不同的請求url @Controller //類似Struts的Action public class TestController { @RequestMapping("test/login.do") // 請求url地址對

jquery 跨域 非同步請求 自定義頭部 預檢請求 spring mvc攔截處理 實現token單點登入

被跨域搞死了,各種奇葩問題。 問題描述:跨域登入,生成token並儲存到redis中,然後返回給客戶端,客戶端每次請求需要將token放到請求頭中傳給服務端,服務端使用過濾器處理跨域攔截,使用攔截器判斷token有效性。問題來了,發來的請求總是獲取不到頭部資訊,也就是取不到

Spring MVC異常處理實例

bsp ips etag label 視圖 uri _id integer ive 以下內容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-examp

spring mvc請求過程

logs ont com 邏輯 src resolv 發送 pre mage 1. 請求會首先發送到DispatchServlet,這是spring的前置Servlet,它會接收請求並轉發給spring的MVC controller,也就是業務controller 2. D

Spring MVC異常處理SimpleMappingExceptionResolver

bean pri 分享圖片 ESS bsh trace 內部實現 ont per Spring MVC異常處理SimpleMappingExceptionResolver【轉】 (2012-12-07 13:45:33) 轉載▼ 標簽: 雜談 分類: 技術

Spring MVC 異常處理 - ResponseStatusExceptionResolver

執行 代碼 pin ces val col resolv use turn 作用在類和方法上面 更改返回的代碼和錯誤消息 類上 通過throw new UserName***Exception()拋出 @ResponseStatus(value=HttpStatus.FO

Spring系列(七) Spring MVC 異常處理

nco 部分 給定 uri too ebo intended 路徑 onf Servlet傳統異常處理 Servlet規範規定了當web應用發生異常時必須能夠指明, 並確定了該如何處理, 規定了錯誤信息應該包含的內容和展示頁面的方式.(詳細可以參考servlet規範文檔)

spring mvc 請求引數String 轉date

以spring boot為背景 1 實現org.springframework.core.convert.converter.Converter介面生成一個自定義Converter。 public class DateConverter implements Converter&l

spring mvc(4)處理模型資料

處理模型資料 Spring MVC 提供了以下幾種途徑輸出模型資料: – ModelAndView: 處理方法返回值型別為 ModelAndView時, 方法體即可通過該物件新增   模型資料 – Map 及 Model: 入參為org.springframework.ui.Mo

簡單讀!spring-mvc請求的來龍去脈

  相信spring-mvc這種被玩壞了的架構理念,大家都爛熟於胸了,不過還是想來扒一扒他的細節。   一個http請求,怎麼樣被 spring 接收,又怎樣做出響應呢? 一般地,我們會配置一個 web.xml,然後開始程式碼之旅。    在 web.xml 中配置 servlet-mapping, 將

spring MVC提交處理帶檔案和非檔案表單

<form action="" method="post" enctype="multipart-form-date"> <input type="file" name="file"/> <input type="user.userName"/&g

Spring MVC非同步處理-DeferedResult使用

DeferedResult處理流程 Spring mvc的控制層接收使用者的請求之後,如果要採用非同步處理,那麼就要返回DeferedResult<>泛型物件。在呼叫完控制層之後,立即回返回DeferedResult物件,此時驅動控制層的容器主執行緒,可以處理更多的請求。