返回ModelAndView
- 以forword轉(zhuǎn)發(fā)的方式,有數(shù)據(jù)和視圖
返回String
- 處理器方法返回字符串可以指定邏輯視圖,通過視圖解析器解析可以將其轉(zhuǎn)換成物理視圖地址
- 必須要視圖解析器在springmvc.xml下配置
- 以forword的轉(zhuǎn)發(fā)方式
@RequestMapping("string.do")
public String stringTest(HttpServletRequest request){
request.setAttribute("msg", "haha");
request.setAttribute("fun", "haha");
return "show";
}
- 如果使用完整路徑,就不能使用視圖解析器了
@RequestMapping("string.do")
public String stringTest(HttpServletRequest request){
request.setAttribute("msg", "haha");
request.setAttribute("fun", "haha");
return "/WEB-INF/view/show.jsp";
}
void:不能顯示數(shù)據(jù)鹃两,也不能表示視圖
- 在處理ajax的時候瘫辩,可以使用void返回值。通過HttpServletResponse輸出數(shù)據(jù)遍膜。響應(yīng)ajax請求捷雕。
- ajax請求服務(wù)器返回的就是數(shù)據(jù)叁鉴,和視圖無關(guān)途样。
- jackson 依賴
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
- jquery請求ajax并傳入數(shù)據(jù)
$(function () {
$("#btn").click(function () {
$.ajax({
url: "void.do",
data: {
name : "zhangsan",
age : 20
},
type: "post",
dataType: "json",
success : function (res) {
alert("name:" + res.name + "\n"+ "age:" + res.age);
}
})
}
)
})
- java響應(yīng)ajax返回json數(shù)據(jù)
通過手工實(shí)現(xiàn)轉(zhuǎn)json有很多重復(fù)江醇,所以json可以交給框架做
@RequestMapping("void.do")
public void voidTest(HttpServletResponse resp, String name, Integer age) {
Student student = new Student();
student.setAge(age);
student.setName(name);
String json = "";
// 把結(jié)果轉(zhuǎn)換為json格式數(shù)據(jù)
if(student != null){
ObjectMapper mapper = new ObjectMapper();
try{
json = mapper.writeValueAsString(student);
// 響應(yīng)ajax請求, 返回json數(shù)據(jù)
resp.setContentType("application/json;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println(json);
writer.flush();
writer.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
返回值Object (返回值是一個對象)
- 對象有屬性,所以O(shè)bject只返回數(shù)據(jù)何暇,和視圖無關(guān)陶夜。
- 現(xiàn)在做ajax,主要使用json的數(shù)據(jù)格式裆站。實(shí)現(xiàn)步驟:
- 加入json庫的依賴条辟, springmvc默認(rèn)使用的jackson
- 在springmvc配置文件中加入<mvc:annotation-driven>注解驅(qū)動
- 在方法上面加ResponseBody():其實(shí)是將java對象轉(zhuǎn)為json格式的數(shù)據(jù)黔夭。
mvc:annotation-driven的作用
Spring 3.0.x中使用了mvc:annotation-driven后,默認(rèn)會幫我們注冊默認(rèn)處理請求捂贿,參數(shù)和返回值的類纠修,其中最主要的兩個類:DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter ,分別為HandlerMapping的實(shí)現(xiàn)類和HandlerAdapter的實(shí)現(xiàn)類厂僧,從3.1.x版本開始對應(yīng)實(shí)現(xiàn)類改為了RequestMappingHandlerMapping和RequestMappingHandlerAdapter。HandlerMapping的實(shí)現(xiàn)類的作用
實(shí)現(xiàn)類RequestMappingHandlerMapping了牛,它會處理@RequestMapping 注解颜屠,并將其注冊到請求映射表中。HandlerAdapter的實(shí)現(xiàn)類的作用
實(shí)現(xiàn)類RequestMappingHandlerAdapter鹰祸,則是處理請求的適配器甫窟,確定調(diào)用哪個類的哪個方法,并且構(gòu)造方法參數(shù)蛙婴,返回值粗井。
當(dāng)配置了mvc:annotation-driven/后,Spring就知道了我們啟用注解驅(qū)動街图。然后Spring通過context:component-scan/標(biāo)簽的配置浇衬,會自動為我們將掃描到的@Component,@Controller餐济,@Service耘擂,@Repository等注解標(biāo)記的組件注冊到工廠中,來處理我們的請求絮姆。
springmvc處理器方法返回Object醉冤,可以轉(zhuǎn)為json輸出瀏覽器,響應(yīng)ajax的內(nèi)部原理
<mvc:annotation-driven> 注解驅(qū)動實(shí)現(xiàn)的功能是 完成java對象到j(luò)son篙悯,xml蚁阳,text,二進(jìn)制等數(shù)據(jù)格式的轉(zhuǎn)換鸽照。
HttpMessageConveter接口:消息轉(zhuǎn)換器螺捐。
功能:定義了java轉(zhuǎn)為json.xml等數(shù)據(jù)格式的方法。這個接口有很多的實(shí)現(xiàn)類移宅。
這些類完成了java對象到j(luò)son归粉,xml,二進(jìn)制的轉(zhuǎn)換漏峰。會創(chuàng)建7個類糠悼,其中包括:MappingJackson2HttpMessageConverter(使用jackson工具庫中的ObjectMapper轉(zhuǎn)為json字符串)
下面兩個方法是控制器類把結(jié)果輸出給瀏覽器使用的。
boolean canRead(Class<?> var1, @Nullable MediaType var2); boolean canWrite(Class<?> var1, @Nullable MediaType var2);
1.canWrite:作用檢查處理器方法的返回值浅乔,能不能轉(zhuǎn)為var2表示的數(shù)據(jù)格式倔喂。如果能轉(zhuǎn)為json就返回true铝条。
2.write:把處理器方法的返回值對象調(diào)用jackson中的ObjectMapper轉(zhuǎn)為json字符串。
- @ResponseBody注解
放在處理器方法上面席噩,通過HttpServletResponse輸出數(shù)據(jù)班缰,響應(yīng)ajax請求的。 - java實(shí)現(xiàn)
返回對象Student類型悼枢,
1.調(diào)用框架中的ArrayList<HttpMessageConverter>中每個類的canWrite()方法埠忘,檢查那個HttpMessageConverter接口實(shí)現(xiàn)類型處理Student類型的數(shù)據(jù)---- MappingJackson2HttpMessage
2.框架會調(diào)用實(shí)現(xiàn)類的MappingJackson2HttpMessageConverter的write方法
把李四同學(xué)的student對象轉(zhuǎn)為json,調(diào)用Jackson的OjectMapper實(shí)現(xiàn)轉(zhuǎn)為json馒索。
3.框架會調(diào)@ResponseBody把2的結(jié)果數(shù)據(jù)輸出到瀏覽器莹妒,ajax請求處理完成。
@RequestMapping(value = "/void.do")
@ResponseBody
public Object voidTest(String name, int age){
// 調(diào)用service绰上,獲取請求結(jié)果旨怠,Student為結(jié)果對象
Student student = new Student();
student.setName(name);
student.setAge(age);
// 返回json對象
return student;
}
返回JsonList
很多情況我們返回是很多個對象,所以我們要返回個
- 也可以返回Map<key, value>對象
@RequestMapping("/void.do")
@ResponseBody
public Object objectTest(String name, int age){
Student student = new Student();
student.setName(name);
student.setAge(age);
List<Object> list = new ArrayList<>();
list.add(student);
return list;
}
- js
@RequestMapping("/void.do")
@ResponseBody
public List<Object> objectTest(String name, int age){
Student student = new Student();
student.setName(name);
student.setAge(age);
List<Object> list = new ArrayList<>();
list.add(student);
return list;
}
- 返回字符串
加上@ResponseBody時 返回字符串蜈块。
@RequestMapping(value = "/void.do",produces = "text/plain;charset=utf-8")
@ResponseBody
public String stringTest2(String name, int age){
return "haha 1231";
}
靜態(tài)資源相關(guān)
- url-pattern
用/的弊端
<url-pattern>/</url-pattern>
不能訪問靜態(tài)資源鉴腻。
*.do
可以訪問靜態(tài)資源
tomcat本身可以處理靜態(tài)資源,因?yàn)閠omcat的web.xml文件中有一個servlet名稱是default百揭, 在服務(wù)器啟動時創(chuàng)建的爽哎。而使用/會替代defaultServlet,導(dǎo)致所有資源都給了DispatcherServlet處理信峻,默認(rèn)情況下DispatcherServlet沒有處理靜態(tài)資源的能力倦青。
1.處理靜態(tài)資源
2.處理未映射到其他servlet的請求
- 解決使用/ 無法處理靜態(tài)資源問題
在springmvc中加入
<mvc:default-servlet-handler/>
框架會創(chuàng)建控制器對象 defaultServletHandler,最后交給tomcat處理
它和 @RequestMapping有沖突 盹舞,需要加入<mvc:annotation-driven/>解決問題
- 第二種訪問靜態(tài)資源處理方式
加入<mvc:resources> 框架創(chuàng)建ResourceHttpRequestHandler产镐,框架自己處理不交給tomcat。
mapping屬性:訪問靜態(tài)資源的uri地址踢步,可以使用通配符/*
例如:<mvc:resources mapping="images/" location="/images/"/> image/ 可以標(biāo)識多級目錄或單級
可以寫多個
- 解決和RequestMapping還是有沖突 加注解驅(qū)動解決
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
- 一條配置處理所有資源
把所有靜態(tài)資源都放到static目錄下
<mvc:resources mapping="/static/**" location="/static/"/>
路徑
在jsp癣亚,html中使用的地址,都是在前端頁面中的地址获印,都是相對地址
地址分類:
- 絕對地址述雾, 帶有協(xié)議名稱的是絕對地址, http://www.baidu.com , ftp://202.122.23.1
- 相對地址兼丰, 沒有協(xié)議開頭的玻孟,例如 user/some.do , /user/some.do
參考地址+ 相對地址才能指定資源。 - 參考地址鳍征,在頁面中訪問地址不加"/"訪問的是http://localhost:8080/ch06-path(項(xiàng)目地址) 黍翎, 加/訪問的參考地址是http://localhost:8080
- 解決方案 在jsp中加入${pageContext.request.contextPath}url 就可以解決。
沒/都是使用base中的地址
<head>
<base />
<base target="_blank" />
</head>
<body>
<img src="eg_smile.gif" />
<a >W3School</a>
</body>