- 控制器
作為控制器,大體的作用是作為V端的數據接收並且交給M層去處理,然后負責管理V的跳轉。SpringMVC的作用不外乎就是如此,主要分為:接收表單或者請求的值,定義過濾器,跳轉頁面;其實就是servlet的替代品。
- append
Spring MVC在Web應用中扮演V的角色,負責處理HTTP請求並返回相應的資源,它在用的時候要配置一個核心的Dispatcher負責檢查資源,請求過來的時候會查找是否有相應的Handler,有就會把請求交給Controller,一般使用注解來配置暴露給用戶端進行調用。
@RequestMapping(value="/JSON",produces="text/html;charset=UTF-8")
value就是對外暴露的接口地址。
說到控制器,我們會想到熟悉的Struts2,它可以輕松的調用Request和Response來操作請求響應,如果要在Spring MVC里調用請求響應的話,則需要附帶在方法參數上。
//Request Response @RequestMapping(value="/ReqAndRep",produces="text/html;charset=UTF-8") public void reqAndrep(HttpServletRequest request,HttpServletResponse response){}</span></pre>
這樣就可以控制這個Http請求並且往響應體里寫東西了。
- 傳值方式
- append
管中窺豹,只見一斑;一葉障目,不見泰山。在前后端交互的過程中,首先要知道都是什么數據類型並且對不同的類型看看Spring MVC會提供怎樣的編程方式。
前后端的數據無非是:變量,對象,數組,JSON;他們有可能會有迭代的行為,把基本的搞懂就不怕他們的二次型了。
springmvc最方便的一點就是可以通過注釋方式來定義它的url。
@Controller public class formMVC { @RequestMapping("/hello") public void login(){}</span></pre>
如上面這種方式,在項目名下跟着hello就能訪問這個方法了,相較struts2的xml配置加大了開發效率,並且是以方法為級別的開發。
接收表單數據只需要在方法的參數加入響應的字段,對應表單input的name屬性,因為是通過反射技術實現的所以字段要完全相同
。
變量
@RequestMapping("/login") public String login(String username,String password){ System.out.println(username+" "+password); return "form.jsp"; }
- append
變量一般是在表單中指定的name對應的形參,也可以在形參中使用別名。
//傳入一般參數 @RequestMapping(value="/Normal",produces="text/html;charset=UTF-8") public String normal(HttpServletRequest request,@RequestParam("username") String username,@RequestParam("password") String password){ System.out.println("username:"+username+" password:"+password); request.setAttribute("info", "Normal server recv:"+username+" "+password); return "testPage.jsp"; }
前端數據頁面,寫一個Form,input對應別名就好。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>測試數據交互</title> </head> <body> <form action="/Shop/Array" method="post"> <table> <tr> <td>用戶名:</td> <td><input name="username" size="15"></td> </tr> <tr> <td>密碼:</td> <td><input name="password" size="15"></td> </tr> <tr> <td><button type="submit">提交</button></td> <td><button type="reset">重置</button></td> </tr> </table> </form> <span>服務器信息:${info}</span> </body> </html>
如上面這種方式,表單提交之后就會獲得值。跳轉方式就是使用返回的字符串,springmvc的DispatcherServlet會跳轉到字符串的頁面。你也可以配置它的前綴后綴。在它的配置文件中配置下面屬性,就是在這個return的字符串的前面和后面加入你配置的前綴后綴。比如你return一個index.jsp,配置了前綴就可能是demo/index.jsp這樣的demo包里面的index頁面。
<!-- configure the InternalResourceViewResolver --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前綴 --> <property name="prefix" value="" /> <!-- 后綴 --> <property name="suffix" value="" /> </bean>
對象
- append
傳遞對象這回事,說實在的和Struts2沒什么區別,Struts2使用ModelDriven或者直接在控制器里新建一個對象,提交Http請求的時候name需要寫成:對象名.字段名,這樣的形式。但是Spring MVC只要你和字段名(類屬性名)相同就行了。
//傳入對象
@RequestMapping(value="/Object",produces="text/html;charset=UTF-8")
public String objTransaction(HttpServletRequest request,@ModelAttribute Demo d){
System.out.println("username:"+d.getUsername()+" password:"+d.getPassword());
request.setAttribute("info", "objTransaction server recv:"+d.getUsername()+" "+d.getPassword());
return "testPage.jsp";
}
前台仍然是上個頁面,改一些Action就行。
另外,Spring MVC可以使用bean來接收參數,因為是反射技術,所以屬性字段依然要保持完全一樣。
public class user { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
@RequestMapping(value="/Model",method=RequestMethod.POST) public String loginModel(user u){ System.out.println(u.getUsername()+" "+u.getPassword()); return "form.jsp"; }
- append
數組
表單提交肯定會有批量提交的需求,批量提交雖然不一定經常能見到,但是學習一定要學全。批量提交就是name共用一個name,一般都是框架給你處理好拿到手上的,所以Spring MVC在方法形參中寫List就可以接收批量提交同個變量了。
//傳入數組 @RequestMapping(value="/Array",produces="text/html;charset=UTF-8") public String arrayTransaction(HttpServletRequest request,@RequestParam("username") String[] usernames){ if(usernames != null) { for(int i=0;i<usernames.length;i++) System.out.println("username:"+usernames[i]); } request.setAttribute("info", "arrayTransaction server recv"); return "testPage.jsp"; }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>測試數據交互</title> </head> <body> <form action="/Shop/Array" method="post"> <table> <tr> <td>用戶名:</td> <td><input name="username" size="15"></td> </tr> <tr> <td>用戶名:</td> <td><input name="username" size="15"></td> </tr> <tr> <td><button type="submit">提交</button></td> <td><button type="reset">重置</button></td> </tr> </table> </form> <span>服務器信息:${info}</span> </body> </html>
JSON
- append
Spring MVC提供了自動序列化JSON數據的注解,在前端提供JSON數據的時候,可以十分方便的轉換。JSON為何如此重要,因為在Restful風格的架構中,傳遞數據使用JSON差不多可以算是一種標准了,即使是微服務架構,每個服務之間也普遍見到設計成Restful風格的接口,設計Restful風格Spring MVC有着天然的支持,只需要使用它的注解就好了,而返回的字符串可以自己構造。
package Common.Controller; import org.springframework.stereotype.Controller;import net.sf.json.JSONObject;
/**
- 接口輸出JSON形式
- restful
- {"status":"0|1|2","info":message,"result":result}
- status:0.失敗;1.成功;2.(未定);
- info:返回服務器信息
- result:返回查詢結果
- @author ctk
*/
@Controller
public class OutputStringController {
//返回成功信息
public String success(String info){
JSONObject result = new JSONObject();
result.put("status", 1);
if(info == null)
result.put("info", "");
else
result.put("info", info);
result.put("result", "");
return result.toString();
}
//返回失敗信息
public String failure(String info){
JSONObject result = new JSONObject();
result.put("status",0);
if(info == null)
result.put("info", "");
else
result.put("info", info);
result.put("result", "");
return result.toString();
}
//返回供前端使用的result-成功
public String resultSuccess(String info,String resultStr){
JSONObject result = new JSONObject();
result.put("status",1);
if(info == null)
result.put("info", "");
else
result.put("info", info);
if(resultStr == null)
result.put("result", "");
else
result.put("result", resultStr);
return result.toString();
}
//返回供前端使用的result-失敗
public String resultFailure(String info,String resultStr){
JSONObject result = new JSONObject();
result.put("status",0);
if(info == null)
result.put("info", "");
else
result.put("info", info);
if(resultStr == null)
result.put("result", "");
else
result.put("result", resultStr);
return result.toString();
}
}
定義了頂層類之后,編寫接口就繼承。接口風格如下。
//restful接口 @RequestMapping(value = "/start/{name}", produces = "text/html;charset=UTF-8") @ResponseBody public String start2(@PathVariable("name") String name1) { System.out.println(name1); return "start"; }
回歸正題,要傳遞JSON,它的過程是前台等待用戶輸入,用戶輸入完畢之后把數據構造成JSON Data,然后訪問接口。前台的代碼我是這樣寫。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script src="../js/jquery/jquery.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSON數據提交</title> </head> <body> <table> <tr> <td>用戶名:</td> <td><input id="username"></td> </tr> <tr> <td>密碼:</td> <td><input id="password"></td> </tr> <tr> <td>姓名:</td> <td><input id="name"></td> </tr> <tr> <td>郵箱:</td> <td><input id="email"></td> </tr> </table> <button id="submitForm">提交</button><script type="text/javascript">
$(document).ready(function(){
$('#submitForm').click(function(){
var formData = new Object;
formData.username = $('#username').val();
formData.password = $('#password').val();
formData.name = $('#name').val();
formData.email = $('#email').val();
var JsonData = JSON.stringify(formData);
console.log(JsonData);
$.ajax({
type : "POST",
url : "/Shop/JSON",
dataType : 'text',
contentType: "application/json",
data : JsonData,
success : function(data) {
alert(data);
}
});
});
});
</script>
</body>
</html>
注意dataType如果使用json那服務器返回什么都會往error走,我初步理解它為返回數據類型。
Spring MVC解包需要jackson這個東西,筆者踩過了坑,沒加jar包一直訪問返回415,不支持此類媒介。筆者使用的是2.5版本的,Spring是4.0的。
將其導入到工程中,然后配置applicationContext.xml,就是Spring的配置文件。
<!--json轉換器--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list > <ref bean="mappingJacksonHttpMessageConverter" /> </list> </property> </bean> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean>
然后后台接口如下。
//傳入JSON @RequestMapping(value="/JSON",produces="text/html;charset=UTF-8") @ResponseBody public String jsonTransaction(HttpServletRequest request,@RequestBody Demo ds){ System.out.println("username:"+ds.getUsername()+" password:"+ds.getPassword()+" name:"+ds.getName()+" email:"+ds.getEmail()); request.setAttribute("info", "JSON server recv"); return "success"; }
@ResponseBody是返回值寫到響應體中,@RequestBody是把請求主體信息中的內容轉換成Demo類。
最后,前端發過來的數據是經過json包裝的,依然可以在后端使用bean來接收。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="jquery.min.js"></script> <title>登錄表單</title> </head> <script type="text/javascript"> $(document).ready(function(){ $("#button_submit").click(function(){ //序列化表單元素,返回json數據 var params = $("#userForm").serializeArray(); console.log(params); //也可以把表單之外的元素按照name value的格式存進來 //params.push({name:"hello",value:"man"}); $.ajax({ type:"post", url:"Model", data:params }); }); }); </script> <body> <form id="userForm"> <input name="username" type="text"/> <br/> <input name="password" type="password"/> <br/> </form> <button id="button_submit">提交</button> <button type="reset" >重置</button> </body> </html>
最后還有一個未解之謎,對象數組提交該怎么去做,資料還未查到,先不干這個了。
原文地址:https://www.cnblogs.com/chentingk/p/6073963.html