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、進行測試…