文章目錄
一、SpringMVC 框架中頁面在 WEB-INF 下的處理方式
1、頁面爲 JSP 的項目
(1)由 JSP 頁面構成的項目,如果想將 JSP 頁面放到 WEB-INF 目錄下,可以將核心控制器的地址匹配規則設置爲*.do
或者*.html
(項目中不支持ajax請求)。但是注意,靜態資源是不能放到 WEB-INF 之下的,例如 js、css、圖片等。
(2)項目結構:
(3)核心控制器的地址匹配規則
<!-- 核心控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
(4)一旦將 JSP 頁面放到 WEB-INF 目錄中,訪問 JSP 頁面就不能直接通過頁面的地址直接進行訪問,任何一個頁面都需要提供一個業務控制器中的方法用轉發的方式來訪問頁面。
爲了便於轉發 JSP,可以使用 SpringMVC 提供的視圖解析器來配置前後綴。
<!--配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
(5)對於業務控制器的分工來講,這時分爲兩種情況。
① 類似於首頁,登錄頁面,註冊頁面這種公共的頁面,我們可以專門定義一個 PageController 提供頁面的訪問方式。如下:
@Controller
public class PageController {
//訪問index.jsp的地址映射
@RequestMapping("index")
public String index() {
return "index";
}
//訪問regist.jsp的地址映射
@RequestMapping("regist")
public String regist() {
return "regist";
}
//訪問login.jsp的地址映射
@RequestMapping("login")
public String login() {
return "login";
}
}
配置完成之後,按照以前 Springmvc 的配置掃描包,添加註解驅動後可以在瀏覽器中,分別通過index.do
、login.do
、register.do
來訪問首頁、登錄頁面、註冊頁面等等。
② 對於其他的 JSP 訪問,由於通常都和業務掛鉤,所以自然需要我們根據業務的分類定義對應的業務控制器,在處理完業務之後轉發到其他頁面。
這時就要注意一個問題,由於login.do
和register.do
的請求地址在項目中已經使用了,是用來訪問登錄頁面和註冊頁面的,那麼切記我們在執行真正的登錄和註冊業務時就不能再直接使用login.do
和register.do
了。爲了解決這個問題,我們可以將業務請求定義在對應的命名空間之下,例如我們可以將登錄的請求地址定義爲user/login.do
,註冊定義爲user/register.do
,這時我們就需要在控制器類上添加一個@RequestMapping("user")
註解來定義命名空間。如下:
@Controller
@RequestMapping("user")
public class UsersController {
//定義登錄的請求地址映射
@RequestMapping("login")
public String login() {
return "index";
}
}
通過命名空間的配置,我們可以將 login 頁面請求和 login 業務請求區分開來,但是加上命名空間所帶來的一個新問題就是命名空間的加入會造成相對路徑在使用時的障礙,所以 JSP 中推薦發送任何請求時都採用絕對路徑的方式來訪問,要訪問絕對路徑可以在 jsp 頁面中首先動態獲取項目的絕對路徑,如下:
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
然後在發送請求時統一採用絕對路徑的方式來訪問,如下:
- 超鏈接:
<a href=""<%=basePath %>login.do">登錄</a>
- 表單提交:
<form action="<%=basePath %>user/login.do" method="post">
<input type="submit" value="登錄">
</form>
- 引入js和引入css
<script type="text/javascript" src="<%=basePath %>js/jquery-3.3.1.js"></script>
<link rel="stylesheet" type="text/css" href="<%=basePath %>css/style.css"/>
2、如果項目由HTML頁面構成,採用AJAX的方式獲取數據
(1)如果一個項目完全由HTML組成,採用了AJAX的方式獲取數據,那麼首先要明確一點,頁面間的跳轉不再依賴於控制器的轉發,而是直接訪問HTML網頁,這時也可以將HTML網頁放到WEB-INF 中處理。
(2)項目結構:
(3)所有的靜態資源都放到了WEB-INF下,那麼我們對於任何靜態資源的訪問,都不能直接訪問,而是要通過 SpringMVC 的進行響應,所以對核心控制器的地址匹配規則需要定義爲/
不能定義爲*.do
。
<!-- 核心控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
(4)SpringMVC 在3.0以後專門提供了靜態資源處理器,用於對靜態資源和它的路徑進行映射,這是一個非常強大且實用的工具,使用它我們可以可以訪問WEB-INF下的靜態資源。
<mvc:resources location="/WEB-INF/resources/page/" mapping="/page/**"/>
<mvc:resources location="/WEB-INF/resources/js/" mapping="/js/**"/>
<mvc:resources location="/WEB-INF/resources/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/resources/img/" mapping="/img/**"/>
<mvc:resources location="/WEB-INF/resources/fonts/" mapping="/fonts/**"/>
上述標籤需要配置在 SpringMVC 的配置文件中,其含義是,將請求地址以 page 開頭的所有請求地址映射到 WEB-INF下resources 文件夾下的 page 文件中,SpringMVC 會從該文件夾下去響應網頁文件,將所有以 js 開頭的請求地址映射到 WEB-INF 下 resources 文件夾下的 js 文件中,以此類推。
二、SpringMVC 參數校驗
1、SpringMVC 參數校驗概述
SpringMVC 提供了非編程式的後端參數校驗,Spring3 以後支持 JSR-303 驗證框架,JSR-303 是JAVA EE 6 中的一項子規範,叫做 Bean Validation,官方推薦的實現是 Hibernate Validator(與Hibernate ORM 沒有關係),JSR 303 用於對 Java Bean 中的字段的值進行驗證。
2、SpringMVC 參數校驗步驟:
(1)添加jar包
添加jar包時,注意不同版本 springmvc 對 Hibernate-Validator 框架的兼容性,如 SpringMVC 5.1.6 兼容 Hibernate-Validator 6.0 版本,Hibernate-Validator6.0 需要其他3個依賴包,所以總共需要導入4個包。
(2)在springmvc配置文件中加載參數校驗器
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校驗器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
</bean>
(3)在實體類的屬性中使用註解添加驗證規則以及錯誤信息
public class Users {
private Integer userId;
@NotNull(message="用戶名不能爲空")
@NotEmpty(message="用戶名不能爲空")
private String userName;
@NotNull(message="密碼不能爲空")
@NotEmpty(message="密碼不能爲空")
@Length(max=16,min=6,message="密碼長度爲6-16位")
private String userPassword;
@Pattern(regexp="[a-zA-Z0-9]{1,}@{1}[a-zA-Z0-9]{1,}(\\.[a-z]{2-3}){1,2}",message="郵箱格式不正確")
private String email;
//省略get、set方法
}
(4)在控制器中接收 User 類型的參數時,添加註解進行校驗,添加@Validated
表示在 springmvc對 user 參數綁定時進行校驗,校驗信息寫入BindingResult
中,在要校驗的實體類對象後邊添加BingdingResult
, 一個BindingResult
對應一個實體類對象,且BingdingResult
放在實體類對象的後邊。
@RequestMapping("login")
public ModelAndView login(@Validated @ModelAttribute("users") Users users, BindingResult br) {
ModelAndView mav = new ModelAndView();
//如果驗證未通過,將錯誤信息保存到模型中並返回到登錄界面
if(br.hasErrors()) {
lList<ObjectError> errors = br.getAllErrors();
mav.addObject("errors", errors);
mav.setViewName("login.jsp");
}else{
//驗證通過,跳轉到首頁
mav.setViewName("index.jsp");
}
return mav;
}
(5)在 jsp 頁面中顯示錯誤信息
<c:forEach items="${errors}" var="error">
${error.defaultMessage}
</c:forEach>
3、常見的校驗規則註解
註解 | 運行時檢查 |
---|---|
@AssertFalse | 被註解的元素必須爲false |
@AssertTrue | 被註解的元素必須爲true |
@DecimalMax(value) | 被註解的元素必須爲一個數字,其值必須小於等於指定的最小值 |
@DecimalMin(Value) | 被註解的元素必須爲一個數字,其值必須大於等於指定的最小值 |
@Digits(integer=, fraction=) | 被註解的元素必須爲一個數字,其值必須在可接受的範圍內 |
@Future | 被註解的元素必須是日期,檢查給定的日期是否比現在晚 |
@Max(value) | 被註解的元素必須爲一個數字,其值必須小於等於指定的最小值 |
@Min(value) | 被註解的元素必須爲一個數字,其值必須大於等於指定的最小值 |
@NotNull | 被註解的元素必須不爲null |
@Null | 被註解的元素必須爲null |
@Past(java.util.Date/Calendar) | 被註解的元素必須過去的日期,檢查標註對象中的值表示的日期比當前早 |
@Pattern(regex=, flag=) | 被註解的元素必須符合正則表達式,檢查該字符串是否能夠在match指定的情況下被regex定義的正則表達式匹配 |
@Size(min=, max=) | 被註解的元素必須在制定的範圍(數據類型:String, Collection, Map and arrays) |
@Valid | 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組, 那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗 |
@CreditCardNumber | 對信用卡號進行一個大致的驗證 |
被註釋的元素必須是電子郵箱地址 | |
@Length(min=, max=) | 被註解的對象必須是字符串的大小必須在制定的範圍內 |
@NotBlank | 被註解的對象必須爲字符串,不能爲空,檢查時會將空格忽略 |
@NotEmpty | 被註釋的對象必須爲空(數據:String,Collection,Map,arrays) |
@Range(min=, max=) | 被註釋的元素必須在合適的範圍內 (數據:BigDecimal, BigInteger, String, byte, short, int, long and 原始類型的包裝類 ) |
@URL(protocol=, host=, port=, regexp=, flags=) | 被註解的對象必須是字符串,檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件 |