springMVC的高級數據綁定,以及json交互,全局異常配置,

一.窄化請求映射javascript

 

1.在class上添加@RequestMapping(url)指定通用請求前綴, 限制此類下的全部方法請求url必須以請求前綴開頭,經過此方法對url進行分類管理。html

以下:前端

 

@Controllerjava

 

@RequestMapping("/item")   //放在類名上邊,設置請求前綴,必須帶前綴才能訪問git

2.請求方法限定web

 

若是沒有限定請求的方法,默認是支持全部的方法(get,post,put,deleteajax

 

u限定GET方法spring

 

@RequestMapping(method = RequestMethod.GET)  加在方法上,表示只能用get方式請求;apache

若是用post請求擇報錯:  HTTP Status 405 - Request method 'POST' not supportedjson

method能夠是一個數組配置多個

GETPOST均可以

@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的返回值能夠有三種

第一種:

返回ModelAndView

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;
    }

}

第二種

返回void

controller方法形參上能夠定義requestresponse,使用requestresponse指定響應結果:

 

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()」,轉發後瀏覽器的地址欄變爲轉發後的地址,由於轉發即執行了一個新的requestresponse

2.forward方式至關於「request.getRequestDispatcher().forward(request,response)」,轉發後瀏覽器地址欄仍是原來的地址。轉發並無執行新的requestresponse,而是和轉發前的請求共用一個requestresponse。因此轉發前請求的參數在轉發後仍然能夠讀取到

 

 

@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>

第二步:

添加jar

CommonsMultipartResolver解析器依賴commons-fileuploadcommons-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>

在導入json須要的jar包

 

配置文件:若是配置了<mvc:annotation-driven/>就不用管

若是沒配這個須要配上下面的

<!--配置式處理器映射器,對類中標記@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

做用:

@RequestBody註解用於讀取http請求的內容(字符串),經過springmvc提供的HttpMessageConverter接口將讀到的內容轉換爲jsonxml等格式的數據並綁定到controller方法的參數上。

 

本例子應用:

@RequestBody註解實現接收http請求的json數據,json數據轉換爲java對象

 

 @ResponseBody

做用:

該註解用於將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>
相關文章
相關標籤/搜索