Spring系列文章
Spring框架-1(基礎)
Spring框架-2(IOC上)
Spring框架-3(IOC下)
Spring框架-4(AOP)
Spring框架-5(JDBC模板&Spring事務管理)
Spring框架-6(SpringMvc)
Spring框架-7(搭建SSM)
Spring框架-8(SpringMVC2)
@RequestMapping注解的使用
URL路徑映射
@RequestMapping(value="/item")或@RequestMapping("/item)
value的值是數組,可以將多個url映射到同一個方法
窄化請求映射
在class上添加@RequestMapping(url)指定通用請求前綴, 限制此類下的所有方法請求url必須以請求前綴開頭,通過此方法對url進行分類管理。
如下:
@RequestMapping放在類名上邊,設置請求前綴
@Controller
@RequestMapping("/item")
方法名上邊設置請求映射url:
@RequestMapping放在方法名上邊,如下:
@RequestMapping("/queryItem ")
訪問地址為:/item/queryItem
請求方法限定
限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通過Post訪問則報錯:
HTTP Status 405 - Request method 'POST' not supported
例如:
@RequestMapping(value="/editItem",method=RequestMethod.GET)
限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通過Post訪問則報錯:
HTTP Status 405 - Request method 'GET' not supported
GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
Controller方法返回值
返回ModelAndView
controller方法中定義ModelAndView對象并返回,對象中可添加model數據、指定view。
@RequestMapping("/list")
public ModelAndView itemsList() throws Exception {
List<Items> list = itmesService.list();
ModelAndView modelAndView = new ModelAndView();
//傳數據
modelAndView.addObject("itemList", list);
//指定頁面
modelAndView.setViewName("itemList");
return modelAndView;
}
返回void
在controller方法形參上可以定義request和response,使用request或response指定響應結果:
使用request轉向頁面,如下:
request.getRequestDispatcher("頁面路徑").forward(request, response);也可以通過response頁面重定向:
response.sendRedirect("url")也可以通過response指定響應結果,例如響應json數據如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
返回字符串
邏輯視圖名
controller方法返回字符串可以指定邏輯視圖名,通過視圖解析器解析為物理視圖地址。
//指定邏輯視圖名,經過視圖解析器解析為jsp物理路徑:/WEB-INF/jsp/item/editItem.jsp
return "item/editItem";
Redirect重定向
Contrller方法返回結果重定向到一個url地址,如下商品修改提交后重定向到商品查詢方法,參數無法帶到商品查詢方法中。
重定向到queryItem.action地址,request無法帶過去
return "redirect:queryItem.action";
redirect方式相當于“response.sendRedirect()”,轉發后瀏覽器的地址欄變為轉發后的地址,因為轉發即執行了一個新的request和response。
由于新發起一個request原來的參數在轉發時就不能傳遞到下一個url,如果要傳參數可以/item/queryItem.action后邊加參數,如下:
/item/queryItem?...&…..
forward轉發
controller方法執行后繼續執行另一個controller方法,如下商品修改提交后轉向到商品修改頁面,修改商品的id參數可以帶到商品修改方法中。
//結果轉發到editItem.action,request可以帶過去
return "forward:editItem.action";
forward方式相當于“request.getRequestDispatcher().forward(request,response)”,轉發后瀏覽器地址欄還是原來的地址。轉發并沒有執行新的request和response,而是和轉發前的請求共用一個request和response。所以轉發前請求的參數在轉發后仍然可以讀取到。
圖片上傳處理
配置Tomcat虛擬目錄
IDEA中配置
tomcat路徑中配置
在tomcat上配置圖片虛擬目錄,在tomcat下conf/server.xml中添加:
<Context docBase="C:\Users\Administrator\Desktop\upload" path="/upload" reloadable="false"/>
訪問http://localhost:8080/upload即可訪問C:\Users\Administrator\Desktop\upload下的圖片。
jar包
CommonsMultipartResolver解析器依賴commons-fileupload和commons-io,加入如下jar包:
配置解析器
<!-- 文件上傳 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 設置上傳文件的最大尺寸為5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
圖片上傳
編寫controller
@RequestMapping("/updateitem")
public String update(MultipartFile pictureFile, Items items) throws Exception {
//1. 獲取圖片完整名稱
String fileStr = pictureFile.getOriginalFilename();
//2. 使用隨機生成的字符串+源圖片擴展名組成新的圖片名稱,防止圖片重名
String newfileName = UUID.randomUUID().toString() + fileStr.substring(fileStr.lastIndexOf("."));
//3. 將圖片保存到硬盤
pictureFile.transferTo(new File("C:\\Users\\Administrator\\Desktop\\upload\\" + newfileName));
//4.將圖片名稱保存到數據庫
items.setPic(newfileName);
itmesService.updateItems(items);
return "redirect:list.action";
}
編寫jsp
<!-- 上傳圖片是需要指定屬性 enctype="multipart/form-data" -->
<form id="itemForm" action="${pageContext.request.contextPath }/updateitem.action"
method="post" enctype="multipart/form-data">
<%-- <form id="itemForm" action="${pageContext.request.contextPath }/items/updateitem.action" method="post"> --%>
<input type="hidden" name="id" value="${item.id }"/> 修改商品信息:
<table width="100%" border=1>
<tr>
<td>商品名稱</td>
<td><input type="text" name="name" value="${item.name }"/></td>
</tr>
<tr>
<td>商品價格</td>
<td><input type="text" name="price" value="${item.price }"/></td>
</tr>
<tr>
<td>商品生產日期</td>
<td><input type="text" name="createtime"
value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
</tr>
<tr>
<td>商品圖片</td>
<td>
<c:if test="${item.pic !=null}">

<br/>
</c:if>
<input type="file" name="pictureFile"/>
</td>
</tr>
<tr>
<td>商品簡介</td>
<td><textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交"/>
</td>
</tr>
</table>
</form>
Json數據交互
@RequestBody
作用:
@RequestBody注解用于讀取http請求的內容(字符串),通過springmvc提供的HttpMessageConverter接口將讀到的內容轉換為json、xml等格式的數據并綁定到controller方法的參數上。
List.action?id=1&name=zhangsan&age=12
@ResponseBody
作用:
該注解用于將Controller的方法返回的對象,通過HttpMessageConverter接口轉換為指定格式的數據如:json,xml等,通過Response響應給客戶端
請求json,響應json實現
導入jar包
Springmvc默認用MappingJacksonHttpMessageConverter對json數據進行轉換,需要加入jackson的包,如下:
配置json轉換器
在注解適配器中加入messageConverters
<!--注解適配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
注意:如果使用<mvc:annotation-driven /> 則不用定義上邊的內容。
controller編寫
// 商品修改提交json信息,響應json信息
@RequestMapping("/editItemSubmit_RequestJson")
public @ResponseBody Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {
System.out.println(items);
//itemService.saveItem(items);
return items;
}
頁面js方法編寫
引入js:
//請求json響應json
function request_json(){
$.ajax({
type:"post",
url:"${pageContext.request.contextPath }/item/editItemSubmit_RequestJson.action",
contentType:"application/json;charset=utf-8",
data:'{"name":"測試商品","price":99.9}',
success:function(data){
alert(data);
}
});
}
Springmvc實現Restful
什么是restful?
Restful就是一個資源定位及資源操作的風格。不是標準也不是協議,只是一種風格,是對http協議的詮釋。
資源定位:互聯網所有的事物都是資源,要求url中沒有動詞,只有名詞。沒有參數
Url格式:http://blog.csdn.net/beat_the_world/article/details/45621673
資源操作:使用put、delete、post、get,使用不同方法對資源進行操作。分別對應添加、刪除、修改、查詢。一般使用時還是post和get。Put和Delete幾乎不使用。
配置restful
添加DispatcherServlet的rest配置
<servlet>
<servlet-name>springmvc-servlet-rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-servlet-rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
URL 模板模式映射
@RequestMapping(value="/ viewItems/{id}"):{×××}占位符,請求的URL可以是“/viewItems/1”或“/viewItems/2”,通過在方法中使用@PathVariable獲取{×××}中的×××變量。
@PathVariable用于將請求URL中的模板變量映射到功能處理方法的參數上。
@RequestMapping("/viewItems/{id}")
public String viewItems(@PathVariable("id") String id,Model model) throws Exception{
//方法中使用@PathVariable獲取useried的值,使用model傳回頁面
//調用 service查詢商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(id);
return "";
}
如果RequestMapping中表示為"/viewItems/{id}",id和形參名稱一致,@PathVariable不用指定名稱。
攔截器
定義
Spring Web MVC 的處理器攔截器類似于Servlet 開發中的過濾器Filter,用于對處理器進行預處理和后處理。
攔截器配置
實現HandlerInterceptor接口,如下:
Public class HandlerInterceptor1 implements HandlerInterceptor{
/**
* controller執行前調用此方法
* 返回true表示繼續執行,返回false中止執行
* 這里可以加入登錄校驗、權限攔截等
*/
@Override
Public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
Return false;
}
/**
* controller執行后但未返回視圖前調用此方法
* 這里可在返回用戶前對模型數據進行加工處理,比如這里加入公用信息以便頁面顯示
*/
@Override
Public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* controller執行后且視圖返回后調用此方法
* 這里可得到執行controller時的異常信息
* 這里可記錄操作日志,資源清理等
*/
@Override
Public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
針對某種mapping配置攔截器
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>
針對所有mapping配置全局攔截器
<!--攔截器 -->
<mvc:interceptors>
<!--多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.springmvc.filter.HandlerInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>