SpringMVC基於模型-視圖-控制器(MVC)模式實現,可以構建松耦合的web應用程式。 1、SpringMVC的請求過程 1)請求離開瀏覽器,並攜帶用戶所請求的內容 2)DispatcherServlet角色為調度員(前端控制器)。查詢一個或多個處理器映射確定處理請求的控制器 3)將請求發給選 ...
SpringMVC基於模型-視圖-控制器(MVC)模式實現,可以構建松耦合的web應用程式。
1、SpringMVC的請求過程
1)請求離開瀏覽器,並攜帶用戶所請求的內容
2)DispatcherServlet角色為調度員(前端控制器)。查詢一個或多個處理器映射確定處理請求的控制器
3)將請求發給選中的控制器業務處理
4)控制器處理完成後,將業務數據封裝為模型,並指定一個邏輯視圖名,一起返回給DispatcherServlet
5)DispatcherServlet將邏輯視圖名匹配一個特定視圖實現
6)使用模型數據渲染出指定的視圖
7)返給前端展示
2、springMVC工程配置
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!--<context-param>-->
<!--<param-name>contextConfigLocation</param-name>-->
<!--<param-value>classpath:applicationContext.xml</param-value>-->
<!--</context-param>-->
<!--<listener>-->
<!--<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
<!--</listener>-->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springMvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 掃描控制器 -->
<context:component-scan base-package="com.cn.controller"></context:component-scan>
<!-- 處理器映射 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3、控制器
接受參數的方式
- 查詢參數
- 表單參數
- 路徑變數
控制器
package com.cn.controller;
import com.cn.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.Valid;
@Controller
public class HelloController {
@RequestMapping("/home")
public String home(){
System.out.println("執行home");
return "home"; //返回一個字元串,即邏輯視圖名
}
@RequestMapping("/home2")
public String home2(){
System.out.println("執行home2");
return "redirect:home3"; //含有redirect的字元串,表示重定向到另一個處理器;
//如果含有forward的字元串,表示轉向到另一個處理器
}
@RequestMapping("/home3")
public String home3(){
System.out.println("輸出home");
return "home3";
}
@RequestMapping("/show3") //表單參數,,@Valid註解與添加了校驗註解的User配合使用
public String showPerson3(@Valid User user, Errors errors){//Errors參數必須緊跟@Valid的參數
if (errors.hasErrors()){//校驗是否有校驗未通過的參數
System.out.println("表單元素校驗不通過");
return "fail";
}
System.out.println("用戶信息:"+user);
return "success";
}
@RequestMapping("/{name}/{age}") //路徑參數 http://localhost:8080/tt/123 輸出:名稱:tt 年齡:123;;
public String showPerson2(@PathVariable(value = "name") String name,
@PathVariable(value = "age") String age){
System.out.println("名稱:"+name+" 年齡:"+age);
return "success";
}
@RequestMapping("/show") //查詢參數 http://localhost:8080/show?name=pp&age=99 輸出:名稱:pp 年齡:99;;
public String showPerson(@RequestParam(value = "name", defaultValue = "laowang") String name,
@RequestParam(value = "age", defaultValue = "100") String age){
System.out.println("名稱:"+name+" 年齡:"+age);
return "success";
}
}
POJO
package com.cn.pojo;
import com.sun.istack.internal.NotNull;
import javax.validation.constraints.Size;
public class User {
//表單參數校驗
@NotNull
@Size(min = 6,max = 10)
private String firstName;
@NotNull
@Size(min = 6,max = 10)
private String lastName;
@NotNull
@Size(min = 6,max = 10)
private String name;
@NotNull
@Size(min = 6,max = 10)
private String passwd;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String toString() {
return "User{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", name='" + name + '\'' +
", passwd='" + passwd + '\'' +
'}';
}
}
4、視圖解析器
- 在控制器中返回的字元串(不包含redirect、forward)表示邏輯視圖名,而不會調用具體的視圖實現。spring的視圖解析器能夠決定使用哪種視圖實現去渲染模型。SpringMvc定義了一個ViewResolver 介面,返回為View對象
public interface ViewResolver { View resolveViewName(String var1, Locale var2) throws Exception; }
View介面定義,其中render方法接受模型、request、response參數,並將模型數據渲染到response中
public interface View { String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus"; String PATH_VARIABLES = View.class.getName() + ".pathVariables"; String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType"; String getContentType(); void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception; }
- 視圖解析器的實現
Spring提供了ViewResolver 多個內置的實現,比如InternalResourceViewResolver、TilesViewResolver...其中InternalResourceViewResolver(最簡單、最常用的視圖解析器)將視圖解析為Web應用的內部資源(一般為jsp)
- 創建JSP視圖
Spring支持兩種JSP視圖的方式---使用InternalResourceViewResolver
方式1:在頁面中使用JSP標準標簽庫(JSTL),InternalResourceViewResolver能夠將視圖名解析為JstlView形式的JSP文件
方式2:使用Spring提供的JSP標簽庫(兩個:一個用於表單到模型的綁定;另一個提供了通用工具類特性)
a、配置適用於JSP的視圖解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
控制器中返回的字元串與該配置中的前尾碼拼接成完成的文件路徑,控制器中返回的字元串如果包含了斜線,則可以區分出了不同的目錄。該配置會將邏輯視圖名解析為InternalResourceView實例。
如過JSP中使用JSTL標簽來處理內容,則希望視圖解析器將視圖解析為JstlView實例。僅僅添加一行配置文件即可:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
b、Spring的JSP的標簽庫
...