一.窄化請求映射javascript
1.在class上添加@RequestMapping(url)指定通用請求前綴, 限制此類下的全部方法請求url必須以請求前綴開頭,經過此方法對url進行分類管理。html
以下:前端
@Controllerjava
@RequestMapping("/item") //放在類名上邊,設置請求前綴,必須帶前綴才能訪問git
2.請求方法限定web
若是沒有限定請求的方法,默認是支持全部的方法(get,post,put,delete)ajax
u限定GET方法spring
@RequestMapping(method = RequestMethod.GET) 加在方法上,表示只能用get方式請求;apache
若是用post請求擇報錯: HTTP Status 405 - Request method 'POST' not supportedjson
method能夠是一個數組配置多個
GET和POST均可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
package com.ssm.controller;
import java.io.File;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.ssm.pojo.Item;
import com.ssm.pojo.QueryVo;
import com.ssm.service.IItemService;
import com.ssm.utils.MD5Utils;
import com.ssm.utils.UploadUtils;
@Controller
@RequestMapping("/item") 表示必須在/item下才能訪問到,如http://localhost:8080/item/list.action
public class ItemController {
@Resource
private IItemService itemService;
//查詢全部商品 @RequestMapping(value="/list.action",method={RequestMethod.GET,RequestMethod.POST}) public ModelAndView findItemByAll() throws Exception{ ModelAndView modelAndView = new ModelAndView(); List<Item> list = itemService.findItemByAll(); modelAndView.addObject("itemList", list); modelAndView.setViewName("itemList"); return modelAndView; }
}
controller的返回值能夠有三種
第一種:
package com.ssm.controller; import java.io.File; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import com.ssm.pojo.Item; import com.ssm.pojo.QueryVo; import com.ssm.service.IItemService; import com.ssm.utils.MD5Utils; import com.ssm.utils.UploadUtils; @Controller //@RequestMapping("/item") 表示必須在/item下才能訪問到,如http://localhost:8080/item/list.action public class ItemController { @Resource private IItemService itemService; //查詢全部商品 @RequestMapping(value="/list.action",method={RequestMethod.GET,RequestMethod.POST}) public ModelAndView findItemByAll() throws Exception{ ModelAndView modelAndView = new ModelAndView(); List<Item> list = itemService.findItemByAll(); modelAndView.addObject("itemList", list); modelAndView.setViewName("itemList"); return modelAndView; } }
第二種
在controller方法形參上能夠定義request和response,使用request或response指定響應結果:
1、使用request轉向頁面,以下:
request.getRequestDispatcher("頁面路徑").forward(request, response);
@RequestMapping("/itemEdit")
public void findItemById(HttpServletRequest request,HttpServletResponse response,Integer id){
try {
Item item = itemService.findItemById(id);
request.setAttribute("item", item);
request.getRequestDispatcher("/WEB-INF/jsp/itemEdit.jsp").forward(request, response);
} catch (ServletException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2、也能夠經過response頁面重定向:
response.sendRedirect("url")
@RequestMapping("/itemEdit") public void findItemById(HttpServletRequest request,HttpServletResponse response,Integer id){ try { response.sendRedirect(request.getContextPath()+"/list.action"); } catch (Exception e) { e.printStackTrace(); } }
3、也能夠經過response指定響應結果,例如響應json數據以下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write(json對象);
@RequestMapping("/itemEdit")
public void findItemById(HttpServletRequest request,HttpServletResponse response,Integer id){
try {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json");
} catch (Exception e) {
e.printStackTrace();
}
}
第三中方式:
1.redirect方式至關於「response.sendRedirect()」,轉發後瀏覽器的地址欄變爲轉發後的地址,由於轉發即執行了一個新的request和response。
2.forward方式至關於「request.getRequestDispatcher().forward(request,response)」,轉發後瀏覽器地址欄仍是原來的地址。轉發並無執行新的request和response,而是和轉發前的請求共用一個request和response。因此轉發前請求的參數在轉發後仍然能夠讀取到
@RequestMapping("/batchEdit") public String bachEdit(QueryVo vo){ if(vo!=null){ itemService.updateBatch(vo); } // 轉發 // return "forward:/list.action"; return "redirect:list.action"; }
springMVC的全局異常處理,就是當前端控制器收到異常時,咱們要判斷是語氣異常仍是運行異常,而後作出處理
1.預期異常,通常跳轉到一個頁面,給用戶提示響應的信息
2:運行異常: A:先打印到日誌文件中 B:發短信或者郵件告訴維護文員 C: 給用戶友好提示
第一步:先定義一個本身的異常類,全部的預期異常都由這個類或子類拋出
package com.ssm.exception; /** * 自定義異常給客戶友好提示 * @author Administrator * */ public class CustomerException extends Exception { private String message; public CustomerException(String message) { super(); this.message = message; } public CustomerException() { super(); } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
第二部自定義異常處理器
package com.ssm.exception; import java.util.Properties; import javax.mail.Session; import javax.management.loading.PrivateClassLoader; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.aspectj.weaver.patterns.ThisOrTargetAnnotationPointcut; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import com.ssm.utils.MailUtils; /** * 自定義異常處理器 * @author Administrator * */ public class CustomerExceptionResolver implements HandlerExceptionResolver { private final Logger logger=Logger.getLogger(this.getClass()); @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { CustomerException customerException=null; //若是拋出的是自定義的異常就強轉爲自定義的異常 if(ex instanceof CustomerException){ //強轉爲自定義的異常 customerException=(CustomerException) ex; }else{ //若是不是自定義的異常就給用戶友好提示 //打印日誌 logger.error(ex.getMessage(), ex); //給開發人員發短信或郵件 //郵箱屬性 final Properties mailProps = new Properties(); //smtp服務器 mailProps.put("mail.smtp.host", "smtp.126.com"); mailProps.put("mail.smtp.auth", "true"); //郵箱用戶名 mailProps.put("mail.username", "helloword110110@126.com"); //受權碼 mailProps.put("mail.password", "hello110"); Session mailSession=MailUtils.getMailSession(mailProps); String sendMessage=this.getClass().getName()+"有異常須要處理"; //郵箱標題 // 郵箱會話 //郵箱屬性 //須要發送的信息 //發送的郵箱地址 MailUtils.sendMail("有異常趕忙解決", mailSession, mailProps, sendMessage,"jiangxiangit@163.com"); //而後給出友好提示 customerException = new CustomerException("您的網絡出現了故障,請稍後再試"); } ModelAndView mv = new ModelAndView(); mv.addObject("exceptionMessage",customerException.getMessage()); mv.setViewName("error"); return mv; } }
發送郵件的工具類
package com.ssm.utils; import java.io.Serializable; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.Message.RecipientType; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * 發送郵件工具類 */ public class MailUtils implements Serializable { /** * 獲取郵箱會話 */ public static Session getMailSession(final Properties mailProps){ try { /*final Properties mailProps = new Properties(); mailProps.put("mail.smtp.host", this.getSmtpServer()); mailProps.put("mail.smtp.auth", "true"); mailProps.put("mail.username", this.getUsername()); mailProps.put("mail.password", this.getPassword());*/ // 構建受權信息,用於進行SMTP進行身份驗證 Authenticator authenticator = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { // 用戶名、密碼 String userName = mailProps.getProperty("mail.username"); String password = mailProps.getProperty("mail.password"); return new PasswordAuthentication(userName, password); } }; // 使用環境屬性和受權信息,建立郵件會話 Session mailSession = Session.getInstance(mailProps, authenticator); System.out.println("郵箱登陸成功"); return mailSession; } catch (Exception ex) { ex.printStackTrace(); return null; } } /** * 發送郵件 * @param title 郵件標題 * @param mailSession 郵箱會話 * @param mailProps 郵箱屬性 * @param sendMessage 須要發送的信息 * @param toAddress 發送的郵箱地址 */ public static void sendMail(String title,Session mailSession,Properties mailProps,String sendMessage, String toAddress) { System.out.println("要發郵件了。。。"); try { // 建立郵件消息 MimeMessage message = new MimeMessage(mailSession); // 設置發件人 InternetAddress from = new InternetAddress(mailProps.getProperty("mail.username")); message.setFrom(from); // 設置收件人 InternetAddress to = new InternetAddress(toAddress); message.setRecipient(RecipientType.TO, to); // 設置郵件標題 message.setSubject(title); // 設置郵件的內容體 message.setContent(sendMessage, "text/html;charset=UTF-8"); // 發送郵件 Transport.send(message); } catch (Exception ex) { ex.printStackTrace(); } } }
第三部:配置到配置前端異常請求頁面
<%@ 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>Insert title here</title> </head> <body> ${exceptionMessage } </body> </html>
第四部:配置配置文件 springmvc.xml
<!--配置異常處理器 handlerExceptionResolver 必須是這個 -->
<bean id="handlerExceptionResolver" class="com.ssm.exception.CustomerExceptionResolver"></bean>
springmvc的文件上傳:
首先是前臺頁面:form表單中必須配置enctype="multipart/form-data",而且name="pictureFile" 的那麼值必須與後提的形式參數變量名一致
<form id="itemForm" action="${pageContext.request.contextPath }/updateItem.action" method="post" enctype="multipart/form-data">
<tr>
<td> <c:if test="${item.pic !=null}"> <img src="/pic${item.pic}" width=100 height=100/> <br/> </c:if> <input type="file" name="pictureFile"/> </td></tr> <tr> <td colspan="2" align="center"><input type="submit" value="提交" /> </td> </tr> </table> </form>
第二步:
CommonsMultipartResolver解析器依賴commons-fileupload和commons-io,
第三步:在springmvc.xml配置文件上傳解析器
<!--配置文件上傳的解析器 ,id必須寫這個-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 設置上傳文件最大爲5MB,支持用1024*1024*5的方式 -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
<!--設置默認編碼 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
第四步業務代碼:
//更新時修改圖片
@RequestMapping("/updateItem") //前端頁面傳遞的name必須和變量名如:pictureFile一致 public String updateItem(Item item,MultipartFile pictureFile){ //獲取文件原始名 String pictureName = pictureFile.getOriginalFilename(); //獲取文件的後綴 String nameSuffix = pictureName.substring(pictureName.lastIndexOf(".")); try { //獲取文件的md5值 String fileMD5 = MD5Utils.getFileMD5(pictureFile); //經過md5的值獲取文件應該保存的路徑 String filDir = UploadUtils.getDir(fileMD5); //新的文件路徑名以及文件名如 0/2/5/a.jpg String newName=filDir+"/"+fileMD5+nameSuffix; //須要上傳的文件 File uploadFile = new File("E:/upload/picture"+newName); //若是不存在這個文件,就寫到磁盤 if(!uploadFile.exists()){ //建立文件 uploadFile.mkdirs(); //向磁盤寫文件 pictureFile.transferTo(uploadFile); } item.setPic(newName); } catch (Exception e) { e.printStackTrace(); } itemService.updateItem(item); return "redirect:list.action"; }
下面是幾個工具類的
1.md5
package com.ssm.utils; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.math.BigInteger; import java.security.MessageDigest; import org.springframework.web.multipart.MultipartFile; /** * 獲取文件的md5值,從而比對兩個文件是否相等 * @Description: TODO * @author jixiang * @date 2015年6月1日 上午9:34:15 * @version V1.0 */ public class MD5Utils { //根據文件路徑獲取md5值 public static String getFileMD5(String filePath) throws Exception{ File file = new File(filePath); InputStream in = new FileInputStream(file); try { MessageDigest digest = MessageDigest.getInstance("MD5"); ; byte buffer[] = new byte[8192]; int len; while((len = in.read(buffer))!=-1){ digest.update(buffer, 0, len); } BigInteger bigInt = new BigInteger(1, digest.digest()); return bigInt.toString(16).toUpperCase(); } catch (Exception e) { e.printStackTrace(); } finally{ in.close(); } return null; } //根據上傳文件獲取md5的值 public static String getFileMD5(MultipartFile uploadFile) throws Exception{ byte[] uploadFileBytes = uploadFile.getBytes(); MessageDigest digest = MessageDigest.getInstance("MD5"); ; BigInteger bigInt = new BigInteger(1, digest.digest(uploadFileBytes)); return bigInt.toString(16).toUpperCase(); } public static void main(String[] args) throws Throwable{ String f1 = getFileMD5("E:\\upload\\8\\0\\e0207632-77f5-4dd1-8085-31c228627357 - 副本.png"); String f2 = getFileMD5("E:\\upload\\8\\0\\e0207632-77f5-4dd1-8085-31c228627357.png"); System.out.println(f1.equals(f2)+"=="+f1); } }
2是因爲可能會有不少的圖片都放在一個文件夾中,查找慢,而且,不便於管理,建立目錄的工具類
package com.ssm.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.tomcat.util.http.fileupload.FileItem; import org.apache.tomcat.util.http.fileupload.FileItemFactory; import org.apache.tomcat.util.http.fileupload.FileUploadException; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.springframework.beans.BeanUtils; public class UploadUtils { /** * 獲取隨機名稱 * @param realName 真實名稱 * @return uuid */ public static String getUUIDName(String realName){ //realname 多是 1.jpg 也多是 1 //獲取後綴名 int index = realName.lastIndexOf("."); if(index==-1){ return UUID.randomUUID().toString().replace("-", "").toUpperCase(); }else{ return UUIDUtils.getId()+realName.substring(index); } } /** * 11.bmp * 獲取文件真實名稱 * @param name * @return */ public static String getRealName(String name){ // c:/upload/11.bmp 1.jpg //獲取最後一個"/" int index = name.lastIndexOf("\\"); return name.substring(index+1); } /** * 獲取文件目錄 * @param name 文件名稱 * @return 目錄 */ public static String getDir(String name){ int i = name.hashCode(); String hex = Integer.toHexString(i); int j=hex.length(); for(int k=0;k<8-j;k++){ hex="0"+hex; } return "/"+hex.charAt(0)+"/"+hex.charAt(1)+"/"+hex.charAt(2)+"/"+hex.charAt(3)+"/"+hex.charAt(4)+"/"+hex.charAt(5)+"/"+hex.charAt(6)+"/"+hex.charAt(7); } @SuppressWarnings("unused") public static void main(String[] args) { //String path=getDir("1432142142142.bmp"); //System.out.println(path); //String val=getUUIDName("11.bmp"); //System.out.println(val); String val=getRealName("c:\\1\\2\\1.bmp"); System.out.println(val); } }
3.uuid轉換爲大寫的字符串
package com.ssm.utils; import java.util.UUID; public class UUIDUtils { public static String getId(){ return UUID.randomUUID().toString().replaceAll("-", "").trim().toUpperCase(); } }
json數據的交互
1前端頁面代碼,最好用ajax進行請求,由於$.ajax能夠設置contentType:"application/json;charset=utf-8",由於(默認: "application/x-www-form-urlencoded") 這種格式發送信息至服務器時內容編碼類型,若是直接用post或者get,有可能傳過去不是application.json的格式,而你若是加了@RequestBody的註解就會報錯
<script type="text/javascript"> function sendJson(){ var url= $.ajax({ type:'post', url:"${pageContext.request.contextPath }/sendJson.action", data:'{"name":"張三","price":18}', contentType:"application/json;charset=utf-8", success:function(data){ alert("a") alert(data) } }); } </script> <body> <input type="button" value="發送json" onclick="sendJson()"/> </body>
若是沒配這個須要配上下面的
<!--配置式處理器映射器,對類中標記@ResquestMapping的方法進行映射, 根據ResquestMapping定義的url匹配ResquestMapping標記的方法 ,匹配成功返回HandlerMethod對象給前端控制器,HandlerMethod對象中封裝url對應的方法Method。 不配置的會用默認的org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 可是從spring3.1版本開始已經被廢除了,官方推薦使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- 註解式處理器適配器,對標記@ResquestMapping的方法進行適配。 不配置會用默認的org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; 從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用, 推薦使用RequestMappingHandlerAdapter完成註解式處理器適配。 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 配置json轉換器,在註解適配器中加入messageConverters, <propertyname="messageConverters"> <list> <beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> </list> </property> </bean>
做用:
@RequestBody註解用於讀取http請求的內容(字符串),經過springmvc提供的HttpMessageConverter接口將讀到的內容轉換爲json、xml等格式的數據並綁定到controller方法的參數上。
本例子應用:
@RequestBody註解實現接收http請求的json數據,將json數據轉換爲java對象
做用:
該註解用於將Controller的方法返回的對象,經過HttpMessageConverter接口轉換爲指定格式的數據如:json,xml等,經過Response響應給客戶端
//json交互 @RequestMapping("/sendJson") //@ResponseBody表示將java對象轉成json對象 //@RequsetBody表示將json對象轉java成對象 public @ResponseBody Item sendJson(HttpServletResponse response,@RequestBody Item item,HttpServletRequest request){ return item; }
springmvc 的Restful風格
Restful就是一個資源定位及資源操做的風格。不是標準也不是協議,只是一種風格,是對http協議的詮釋。
第一步,將<url-pattern>*.action</url-pattern>改成<url-pattern>/</url-pattern>攔截除了jsp頁面的全部
<servlet> <servlet-name>springmvc</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-name>
<--<url-pattern>*.action</url-pattern>--> <url-pattern>/</url-pattern> </servlet-mapping>
第二步在springmvc.xml的配置文件中配置不攔截靜態資源
<!-- 配置不攔截靜態資源 location="/js/":表示js下路徑的不攔截,/js/**,表示包及其子包下面的都不攔截 --> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
第三步將請求的參數方式改變
<--<td><a href="${pageContext.request.contextPath }/itemEdit?id=${item.id}">修改</a></td>-->
<--改爲-->
<td><a href="${pageContext.request.contextPath }/itemEdit/${item.id}">修改</a></td>
第四部修改代碼
//根據Id查詢商品 :第四種方式:經過model或者modelMap,返回值就能夠撒設成String,返回的是視圖的名稱
//{}表示佔位符大括號內的值要和參數名子一致才能取到,而且這裏的有幾個參數,頁面要傳幾個參數才能訪問,如如今必須傳兩個
//@PathVariable註解 表示這個值是大括號嫩的值 @RequestMapping("/itemEdit/{id}/{name}") public String findItemById(@PathVariable Integer id,@PathVariable String name,Model model,ModelMap modelMap){ Item item = itemService.findItemById(id); modelMap.addAttribute("item", item); return "itemEdit"; }
springmvc的攔截器配置
自定義一個攔截器實現handlerInterceptor 接口
package com.ssm.hindlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; /** * 模擬未登陸攔截 * @author Administrator * */ public class LoginHindlerInterceptor implements HandlerInterceptor{ /** * 在controller執行後,且已經返回視圖後執行此方法 * 這裏可獲得執行controller時的異常信息 * 這裏可記錄操做日誌,資源清理等 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3) throws Exception { } /** * 在controller執行後,但未返回視圖前調用此方法 * 這裏可在返回用戶前對模型數據進行加工處理,好比這裏加入公用信息以便頁面顯示u */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { } /** * controller執行前調用此方法 * 返回true表示繼續執行,返回false停止執行 * 這裏能夠加入登陸校驗、權限攔截等 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //首先從當前的url中獲取訪問的路徑,若是/user/showLogin 和/user/Login (不須要攔截) String pathrequest = request.getRequestURL().toString(); if(pathrequest.contains("login")){ return true; } if(request.getSession().getAttribute("user")==null){ response.sendRedirect(request.getContextPath()+"/showlogin"); return false; } return true; } }
配置配置文件
<!--配置攔截器 --> <mvc:interceptors> <mvc:interceptor> <!--path="/**" 表示攔截全部 --> <mvc:mapping path="/**" /> <bean class="com.ssm.hindlerInterceptor.MyHindlerInterceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.ssm.hindlerInterceptor.MyHindlerInterceptor2"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.ssm.hindlerInterceptor.LoginHindlerInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
攔截器的執行順序
HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..
HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..
HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion.
prehandle方法是順序,先配置(在springmvc.xml上面些的)的先執行;
postHandle和afterCompletion是倒序,先配置的後執行
登錄攔截的模擬實現controller代碼
@RequestMapping("/login") public String Login(String username,String password,HttpSession session){ if(username.equalsIgnoreCase("admin")&&password.equals("admin")){ session.setAttribute("user","user"); } return "redirect:list"; } @RequestMapping("/showlogin") public String showlogin(){ return "login"; }
前端頁面
<%@ 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>Insert title here</title> </head> <body> <a href="http://localhost:8080/spring_ssm_second/list">查看全部訂單</a> <form action="${pageContext.request.contextPath }/login" method="post"> 用戶名:<input type="text" name="username"/> 密 碼:<input type="text" name="password"/> <input type="submit" value="登錄"/> </form> </body> </html>