一甫男、常用注解
1.@RequestParam
作用于參數(shù)上且改,用于提交參數(shù)與實(shí)際參數(shù)名稱不一致時(shí)候生效,即name為提交的時(shí)候的參數(shù)名字,但是綁定給了username板驳;
@RequestMapping("/anno")
public String action(@RequestParam(name="name") String username){
System.out.println(username);
return "success";
}
2.@RequestBody
作用于參數(shù)又跛,獲取POST提交參數(shù)的請(qǐng)求體
@RequestMapping("/anno")
public String action(@RequestBody String body){
System.out.println(body);
return "success";
}
3.@PathVariable
作用于參數(shù),restful風(fēng)格獲取參數(shù),將請(qǐng)求路徑中的{id}封裝到方法參數(shù)中
@RequestMapping("/path/{sid}")
public String path(@PathVariable(name="sid") String id){
System.out.println(id);
return "success";
}
請(qǐng)求路徑:http://localhost:8080/path/10
控制臺(tái)打印10若治;
4.@RequestHeader
作用于參數(shù)慨蓝,獲取請(qǐng)求頭參數(shù)
@RequestMapping("/anno/header")
public String header(@RequestHeader("Cookies") String cookies){
System.out.println(cookies);
return "success";
}
5.@CookieValue
作用于參數(shù),獲取Cookies端幼,根據(jù)鍵獲取值
獲取cookie中username的值
@RequestMapping("/anno/header")
public String header(@CookieValue("username") String username){
System.out.println(username);
return "success";
}
6.@ModelAttribute
作用于參數(shù)和方法菌仁,在方法上加上該注解澤優(yōu)先于請(qǐng)求的controller方法執(zhí)行
用處:在用戶提交參數(shù)不完整的情況下,可以使用該注解來(lái)添加提交參數(shù)
@RequestMapping("/anno/modelAttr")
public String modelAttr(@ModelAttribute("attr")User user){
System.out.println(user);
return "success";
}
@ModelAttribute
public void attrPre(Map<String,User> map){
User user=new User();
user.setUsername("222");
user.setPassword("123");
map.put("attr",user);
}
這樣即使即使沒(méi)有提交username静暂,password也會(huì)使用@modelAttribute方法中對(duì)應(yīng)的map的user值济丘;
7.@SessionAttributes
作用于類,用于向session域里存值
@Controller
@SessionAttributes("msg")
public class HelloController {
@RequestMapping("/anno/sessionAttr")
public String sessionAttr(ModelMap modelMap, SessionStatus sessionStatus){
//添加
modelMap.addAttribute("msg","hello sessionAttrbutes");
//獲取
modelMap.get("msg");
//刪除
sessionStatus.setComplete();
return "success";
}
}
二洽蛀、響應(yīng)數(shù)據(jù)和結(jié)果視圖
1.返回值分類
1.1 String類型
Controller方法返回字符串可以指定邏輯視圖的名稱摹迷,根據(jù)視圖解析器為物理視圖的地址。
@RequestMapping(value="/hello")
public String sayHello() {
System.out.println("Hello SpringMVC!!");
// 跳轉(zhuǎn)到XX頁(yè)面
return "success";
}
1.2 void類型
- 如果控制器的方法返回值編寫(xiě)成void郊供,執(zhí)行程序報(bào)404的異常峡碉,默認(rèn)查找JSP頁(yè)面沒(méi)有找到。在注解@RequestMapping(value="/hello") 下驮审,默認(rèn)會(huì)跳轉(zhuǎn)到hello的頁(yè)面鲫寄,相當(dāng)于返回string為hello。
- 可以使用請(qǐng)求轉(zhuǎn)發(fā)或者重定向跳轉(zhuǎn)到指定的頁(yè)面
@RequestMapping(value="/init")
public void initAdd(HttpServletRequest request,HttpServletResponse response) throws
Exception {
System.out.println("請(qǐng)求轉(zhuǎn)發(fā)或者重定向");
// 請(qǐng)求轉(zhuǎn)發(fā)
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,
response);
// 重定向
response.sendRedirect(request.getContextPath()+"/success.jsp");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 直接響應(yīng)數(shù)據(jù)
response.getWriter().print("hello mvc");
return;
}
3.ModelAndView類型
- ModelAndView對(duì)象是Spring提供的一個(gè)對(duì)象疯淫,可以用來(lái)調(diào)整具體的JSP視圖
- 具體的代碼如下
/**
* 返回ModelAndView對(duì)象
* 可以傳入視圖的名稱(即跳轉(zhuǎn)的頁(yè)面)地来,還可以傳入對(duì)象。
*/
@RequestMapping(value="/findAll")
public ModelAndView findAll() throws Exception {
ModelAndView mv = new ModelAndView();
// 跳轉(zhuǎn)到list.jsp的頁(yè)面
mv.setViewName("list");
// 模擬從數(shù)據(jù)庫(kù)中查詢所有的用戶信息
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setUsername("張三");
user1.setPassword("123");
User user2 = new User();
user2.setUsername("趙四");
user2.setPassword("456");
users.add(user1);
users.add(user2);
// 添加對(duì)象
mv.addObject("users", users);
return mv;
}
2.SpringMVC框架提供的轉(zhuǎn)發(fā)和重定向
controller方法返回String類型
2.1 forward轉(zhuǎn)發(fā)
public String testVoid() throws Exception {
return "forward:/WEB_INF/jsp/success.jsp";
}
2.2 redirect 重定向
public String testVoid() throws Exception {
return "redirect:/index.jsp";
}
3.ResponseBody響應(yīng)json數(shù)據(jù)
3.1. 配置靜態(tài)資源不攔截
DispatcherServlet會(huì)攔截到所有的資源熙掺,導(dǎo)致一個(gè)問(wèn)題就是靜態(tài)資源(img未斑、css、js)也會(huì)被攔截到币绩,從而
不能被使用蜡秽。解決問(wèn)題就是需要配置靜態(tài)資源不進(jìn)行攔截府阀,在springmvc.xml配置文件添加如下配置
- mvc:resources標(biāo)簽配置不過(guò)濾
- location元素表示webapp目錄下的包下的所有文件
- mapping元素表示以/static開(kāi)頭的所有請(qǐng)求路徑,如/static/a 或者/static/a/b
<!-- 設(shè)置靜態(tài)資源不過(guò)濾 -->
<mvc:resources location="/css/" mapping="/css/**"/> <!-- 樣式 -->
<mvc:resources location="/images/" mapping="/images/**"/> <!-- 圖片 -->
<mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
3.2.使用@RequestBody獲取請(qǐng)求體數(shù)據(jù),@ResponseBody將結(jié)果解析成json
3.2.1導(dǎo)入需要的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<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-annotations</artifactId>
<version>2.9.0</version>
</dependency>
3.2.2 controller類
控制太打印post請(qǐng)求提交的數(shù)據(jù)芽突,并且返回把User對(duì)象解析成json字符串返回
@RequestMapping("/testbody")
public @ResponseBody User testVoid(@RequestBody User body) throws Exception {
System.out.println(body);
return body;
}
3.2.3 ajax提交
$(function () {
$("#btn").click(function () {
$.ajax({
url:"/mvc/testbody",
contentType:"application/json;charset=utf8",
data:'{"username":"unclez","password":"zhg99524"}',
dataType:"json",
type:"post",
success:function (data) {
alert(data.username);
}
});
});
});
三试浙、文件上傳
1.傳統(tǒng)方式
1.1 controller方法
@RequestMapping("/file")
public String fileupload1(HttpServletRequest request) throws Exception {
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
// 判斷路徑是否存在,如果不存在寞蚌,創(chuàng)建該路徑
if(!file.exists()) {
file.mkdirs();
}
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload sf=new ServletFileUpload(factory);
List<FileItem> items = sf.parseRequest(request);
for(FileItem item:items){
if(!item.isFormField()){
String name=item.getName();
File f=new File(path,name);
item.write(f);
item.delete();
}
}
return "success";
}
1.2 表單
<form action="/mvc/file" method="post" enctype="multipart/form-data">
名稱:<input type="text" name="picname"/><br/>
圖片:<input type="file" name="upload"/><br/>
<input type="submit" value="上傳"/>
</form>
2.SpringMVC本服務(wù)器方式
2.1 配置文件解析器對(duì)象
<!-- 配置文件解析器對(duì)象田巴,要求id名稱必須是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
2.1 controller類
@RequestMapping("/file")
public String fileupload1(HttpServletRequest request,MultipartFile upload) throws Exception {
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
// 判斷路徑是否存在,如果不存在睬澡,創(chuàng)建該路徑
if(!file.exists()) {
file.mkdirs();
}
String filename = upload.getOriginalFilename();
filename=UUID.randomUUID()+"_"+filename;
upload.transferTo(new File(path,filename));
return "success";
}
3.SpringMVC分其他服務(wù)器上傳
3.1 jar包
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
3.2 控制器
@RequestMapping("/file2")
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception {
String server_path="遠(yuǎn)程服務(wù)器地址";
String filename = upload.getOriginalFilename();
Client client=Client.create();
WebResource resource = client.resource(server_path + filename);
resource.put(upload.getBytes());
return "success";
}
四、異常處理
1. 異常處理思路
Controller調(diào)用service眠蚂,service調(diào)用dao煞聪,異常都是向上拋出的,最終有DispatcherServlet找異常處理器進(jìn)行異常的處理逝慧。比如統(tǒng)一跳轉(zhuǎn)404.html之類的
2.自定義異常類
public class MyException extends Exception {
// 異常提示信息
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MyException(String message) {
this.message = message;
}
}
3.自定義異常處理器
public class MyExecptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv=new ModelAndView();
if (ex instanceof MyException)
{
mv.addObject("errorMsg",ex.getMessage());
}else {
//do something..
}
mv.setViewName("404");
return mv;
}
}
4.配置異常類
<bean id="myExecptionResolver" class="com.unclezs.resolver.MyExecptionResolver"/>
五昔脯、攔截器
1.概述
- SpringMVC框架中的攔截器用于對(duì)處理器進(jìn)行預(yù)處理和后處理的技術(shù)。
- 可以定義攔截器鏈笛臣,連接器鏈就是將攔截器按著一定的順序結(jié)成一條鏈云稚,在訪問(wèn)被攔截的方法時(shí),攔截器鏈中的攔截器會(huì)按著定義的順序執(zhí)行沈堡。
- 攔截器和過(guò)濾器的功能比較類似静陈,有區(qū)別
- 過(guò)濾器是Servlet規(guī)范的一部分,任何框架都可以使用過(guò)濾器技術(shù)诞丽。
- 攔截器是SpringMVC框架獨(dú)有的鲸拥。
- 過(guò)濾器配置了/*,可以攔截任何資源僧免。
- 攔截器只會(huì)對(duì)控制器中的方法進(jìn)行攔截刑赶。
- 攔截器也是AOP思想的一種實(shí)現(xiàn)方式
- 想要自定義攔截器,需要實(shí)現(xiàn)HandlerInterceptor接口懂衩。
2. 自定義攔截器步驟
創(chuàng)建類撞叨,實(shí)現(xiàn)HandlerInterceptor接口,重寫(xiě)需要的方法
3. HandlerInterceptor接口中的方法
- preHandle方法是controller方法執(zhí)行前攔截的方法
- 可以使用request或者response跳轉(zhuǎn)到指定的頁(yè)面
- return true放行浊洞,執(zhí)行下一個(gè)攔截器牵敷,如果沒(méi)有攔截器,執(zhí)行controller中的方法法希。
- return false不放行劣领,不會(huì)執(zhí)行controller中的方法。
- postHandle是controller方法執(zhí)行后執(zhí)行的方法铁材,在JSP視圖執(zhí)行前尖淘。
- 可以使用request或者response跳轉(zhuǎn)到指定的頁(yè)面
- 如果指定了跳轉(zhuǎn)的頁(yè)面奕锌,那么controller方法跳轉(zhuǎn)的頁(yè)面將不會(huì)顯示。
- afterHandle方法是在JSP執(zhí)行后執(zhí)行
- request或者response不能再跳轉(zhuǎn)頁(yè)面了
4.配置多個(gè)攔截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<!-- 哪些方法不進(jìn)行攔截 -->
<!--<mvc:exclude-mapping path="/user/*"/>-->
<bean class="com.unclezs.interceptor.MyInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<bean class="com.unclezs.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>