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。
如果登陸失敗怎麼辦呢?,將錯誤資訊返回至前臺進行提示就可以噠。 大概就是,讓他回到原頁面,然後將錯誤提示資訊,儲存在request中,返回給頁面,再通過el表示式顯示出來即可 ${xxx}。也可以儲存在session當中,同樣在頁面通過el表示式顯示出來就可以了。 ${sessionScope.xxx}<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>
處理情況二:通過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物件,此時驅動控制層的容器主執行緒,可以處理更多的請求。