javaweb框架之springmvc第三天

1、攔截器

Interceptor,是springmvc使用java的動態代理實現的,能夠在攔截的Controller方法執行前後,附加其他功能。
主要用來進行,權限驗證,日誌記錄,是否登錄。

有兩種實現方式:
1、實現HandlerInterceptor

@Override
public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {
    System.out.println("在執行方法前執行...."); 

    String name = request.getParameter("name");
    String passwd = request.getParameter("passwd");
    if(!"zhangsan".equals(name) || !"123".equals(passwd)){
        response.sendRedirect("http://www.baidu.com");   
        return false;
    }
    else{
        return true;
    }
}

@Override
public void postHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
    System.out.println("在執行方法後執行....");

}

@Override
public void afterCompletion(HttpServletRequest request,
        HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    System.out.println("完成頁面渲染後執行...");

}

2、實現webRequestInterceptor

然後,需要在spring-mvc.xml進行配置:

<mvc:interceptors>
    <mvc:interceptor>
        <!-- 攔截那個請求 -->
        <mvc:mapping path="/user/*"/>
        <bean class="springmvc.MyInterceptor1"></bean>
    </mvc:interceptor>

</mvc:interceptors>

2、國際化

1、springmvc增加配置

<!-- 配置國際化文件 -->
<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <!-- 支持兩種配置方式,第一種只能使用message開頭的國際化文件,第二種可以配置多個國際化文件 -->
    <!-- 第一種:<property name="basenames" value="message" /> -->
    <!-- 第二種 -->
    <property name="basenames">
        <list>
            <value>message</value>
        </list>
    </property>
</bean>

2、增加配置文件
需要是unicode編碼(可用native2ascii或這eclipse插件編碼)

message_en_US.properties
message_zh_CN.properties

3、通過spring標籤獲取國際化內容

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> 


<!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>
<spring:message code="userName"/>:<input type="text" name="userName"> <spring:message code="userName"/>:<input type="text" name="passwd"> 
</body>
</html>

3、文件上傳下載

3.1普通上傳

1、需要第三方jar包支持

      <!--文件上傳-->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

2、編寫上傳頁面

<form action="${pageContext.request.contextPath }/uploadfile" method="post" enctype="multipart/form-data">

<!-- 
1、form的提交方式必須是post
2、form的enctype必須是"multipart/form-data"
3、上傳控件


 -->
<input type="file" name="fileupload">

<input type="submit" value="上傳">
</form>

3、編寫Controller實現上傳

@RequestMapping(value="/uploadfile", method=RequestMethod.POST)
public String upload(@RequestParam("fileupload") MultipartFile file,HttpServletRequest request){
    //怎麼獲取上傳的文件
    //獲取後文件放在哪兒
    //得到上傳文件的絕對路徑
    String uploadPath = request.getSession().getServletContext().getRealPath("upload");
    //然後設置文件名
    String destFile = uploadPath+File.separator+file.getOriginalFilename();
    try {
        file.transferTo(new File(destFile));
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "result";
}

3.2ajax上傳

1、需要導入jquery.js和jquery.form.js
2、編寫上傳頁面

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

<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery.form.min.js"></script>
<script type="text/javascript">

$(function(){
    $("#btn").click(function(){

        $("#form-upload").ajaxSubmit({
            type: 'post',
            url: "${pageContext.request.contextPath }/ajaxupload",
            success: function (data) {
                var d = eval("("+data+")");
                if (d.success) {
                    alert(d.msg);
                }else{
                    alert(d.msg);
                }
            }
        });



    });
});

</script>
<title>Insert title here</title>
</head>
<body>

<form id="form-upload" action="" method="post" enctype="multipart/form-data">

<!-- 
1、form的提交方式必須是post
2、form的enctype必須是"multipart/form-data"
3、上傳控件


 -->
<input type="file" name="fileupload">

<input type="button" id='btn' value="上傳">
</form>

</body>
</html>

3.編寫ajax實現文件上傳的Controller

@RequestMapping(value="/ajaxupload", method=RequestMethod.POST)
public void ajaxUpload(@RequestParam("fileupload") MultipartFile file,HttpServletRequest request, HttpServletResponse resp){
    //怎麼獲取上傳的文件
    //獲取後文件放在哪兒
    //得到上傳文件的絕對路徑
    String uploadPath = request.getSession().getServletContext().getRealPath("upload");
    String fileName = file.getOriginalFilename();
    //然後設置文件名
    String destFile = uploadPath+File.separator+file.getOriginalFilename();
    if(!StringUtils.endsWithIgnoreCase(fileName, ".doc") && !StringUtils.endsWithIgnoreCase(fileName, ".docx")){

        try {
            resp.getOutputStream().write("{'success':'false','msg':'只允許上傳doc和docx格式的文件!'}".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    else{
        try {
            file.transferTo(new File(destFile));
            resp.getOutputStream().write("{'success':'true','msg':'上傳成功!'}".getBytes());
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

4、數據轉換

1、需要實現Converter接口

public class DateConverter implements Converter<String, Date>{

    @Override
    public Date convert(String source) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return format.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;

    }
}

2、在springmvc配置文件配置

<mvc:annotation-driven conversion-service="conversionService" />

<!-- 我們使用spring提供的conversionService實現FormattingConversionServiceFactoryBean -->
<bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="springmvc.DateConverter" />
        </list>
    </property>
</bean>

5、格式化

能夠把日期,金額,數字進行有效格式化,springmvc常用的格式化類

  • DateFormatter
  • NumberFormatter
  • CurrencyFormatter
  • PercentFormatter

6、驗證

6.1通過自定義validator驗證

0、導入第三方的jar包

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.4.Final</version>
</dependency>

1、自定義校驗器

public class UserValidate implements Validator{

    @Override
    public boolean supports(Class<?> clazz) {
         //首先判斷需要檢驗的class是不是Student,如果是才進行校驗
         return User.class.equals(clazz); 

    }

    @Override
    public void validate(Object target, Errors errors) {
        //將傳入的target強制轉換成Student
        User u = (User) target;
        if(u.getName()==null || "".equals(u.getName())){
            errors.rejectValue("name", null, null,"請輸入用戶名!");
        }

        if(u.getAge()==null || "".equals(u.getAge())){
            errors.rejectValue("age", null, null,"請輸入年齡!");
        }
    }

}

2、註冊校驗器,在校驗的Controller類編寫

@InitBinder
public void initBinder(DataBinder binder){
    binder.replaceValidators(new UserValidate());
}

3、編寫驗證Controller,需要使用@valid驗證實體類,然後需要BindResult綁定錯誤信息,注意順序,BindResult一定要在@valid的後面

@RequestMapping(value="addUser", method=RequestMethod.POST)
//必須使用@Valid對Student進行檢驗,然後將校驗結果綁定到BindingResult,頁面才能展示
public String addUser(@Valid User user, BindingResult result){
    //如果說result裏面包含錯誤信息了,那麼將返回增加用戶頁面
    if (result.hasErrors()) {
         return "addUser";
    }
    else{
         return "...";
    }

}

4、展示錯誤信息,需要導入spring和jstl的標籤

    <%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 



    <spring:hasBindErrors name="user"> 
     <c:if test="${errors.fieldErrorCount > 0}"> 

     <c:forEach items="${errors.fieldErrors}" var="error"> 
     <spring:message var="message" code="${error.defaultMessage}" arguments="${error.arguments}" text="${error.defaultMessage}"/> 
     ${message}<br/> 
     </c:forEach> 
     </c:if> 

     <c:if test="${errors.globalErrorCount > 0}"> 
     <c:forEach items="${errors.globalErrors}" var="error"> 
     <spring:message var="message" code="${error.defaultMessage}" arguments="${error.arguments}" text="${error.defaultMessage}"/> 
     <c:if test="${not empty message}"> 
     ${message}<br/> 
     </c:if> 
     </c:forEach> 
     </c:if> 
     <br/>
    </spring:hasBindErrors> 

6.1通過jsr303註解驗證

jsr303是個驗證標準,然後HibernateValidator實現了這個標準

1、需要在驗證的實體類上進行註解校驗

public class User {

    @NotNull(message = "username.request") 
    @Length(min = 5, max = 20, message = "username.length")
    private String name;
    @NotNull(message = "age.request") 
    @Pattern(regexp = "[0-9]+", message = "age.regexp") 
    private String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }


}

2、配置國際化支持

參考國際化配置 

3、增加國際化文件,然後添加驗證的內容

username.request=\u8BF7\u8F93\u5165\u7528\u6237\u540D
username.length=\u7528\u6237\u540D\u957F\u5EA6\u5FC5\u987B\u57285-20

age.request=\u8BF7\u8F93\u5165\u5E74\u9F84
age.regexp=\u5E74\u9F84\u53EA\u80FD\u662F\u6570\u5B57

4、編寫校驗的Controller

@RequestMapping(value="addUser", method=RequestMethod.POST)
//必須使用@Valid對Student進行檢驗,然後將校驗結果綁定到BindingResult,頁面才能展示
public String addUser(@Valid User user, BindingResult result){
    //如果說result裏面包含錯誤信息了,那麼將返回增加用戶頁面
    if (result.hasErrors()) {
         return "addUser";
    }
    else{
         return "...";
    }

}

5、進行測試…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章