Web開發表現層主要請求和響應
響應包括兩方面
1,頁面跳轉
2,數據共享
頁面跳轉兩種方式
1,請求轉發
2,重定向
web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<!-- 設置請求參數字符編碼過濾 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>\/*</url-pattern>
</filter-mapping>
<!-- 配置SpringMVC的前端控制器 (總控)
之前所有請求,都訪問Servlet
現在:所有請求都要經過SpringMVC
-->
<servlet>
<servlet-name>MVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化參數讀取springmvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 容器初始化啓動時機,tomacat服務器啓動就啓動 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MVC</servlet-name>
<!--
使用 通配符*+後綴
如 : *.do(推薦),*.action *.mvc
-->
<url-pattern>*.do</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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
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">
<!-- 配置Spring註解配置包掃描 -->
<context:component-scan base-package="com.ywq.springmvc"/>
<!-- 配置SpringMVC的註解驅動 -->
<mvc:annotation-driven/>
<!-- 處理靜態資源,將靜態資源處理交給Tomcat -->
<mvc:default-servlet-handler/>
<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
1.返回void類型和共享數據 : 需要共享數據,頁面跳轉
//返回void類型和共享數據 : 需要共享數據,頁面跳轉
//必須注入請求響應對象(共享數據,頁面跳轉)
@RequestMapping("/method1")
public void method1(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException {
//共享數據
req.setAttribute("username", "小龍女");
//跳轉到jsp頁面要顯示數據,就必須使用請求轉發
req.getRequestDispatcher("/WEB-INF/response/response.jsp").forward(req, resp);
}
2.返回ModelAndView類型和共享數據
/*
* 返回ModelAndView類型和共享數據
* ModelAndView 模型和視圖
* Spring提供此對象可以集中管理共享數據操作和設置跳轉視圖操作
* ModelAndView 只能使用請求轉發
*/
@RequestMapping("/method2")
public ModelAndView method2() {
ModelAndView mv = new ModelAndView();
//共享數據,等價於 request對象共享數據的級別
//mv.addObject(attributeName, attributeValue)
mv.addObject("username", "楊過");
//頁面跳轉,等價於request對象的請求轉發
//mv.setViewName(viewName);
mv.setViewName("/WEB-INF/response/response.jsp");
return mv;
}
3.通過Model方式-設置共享數據
/*
* Model方式 : 直接將需要共享的數據封裝到Model對象中即可
* 方法返回String字符傳直接,返回需要跳轉的地址即可
* 默認使用請求轉發
*/
@RequestMapping("/method3")
public String method3(Model m) {
//m.addAttribute(attributeName, attributeValue)
m.addAttribute("username", "劍神123");
//沒有配置視圖解析器之前的寫法
//return "/WEB-INF/response/response.jsp";
//配置視圖解析器之後的寫法
return "model"; //返回邏輯視圖名稱
}
4.自定義請求轉發和重定向跳轉的頁面
// 自定義請求轉發頁面跳轉的地址 : forward: 跳轉的地址
@RequestMapping("/method4")
public String method4(Model m) {
// m.addAttribute(attributeName, attributeValue)
m.addAttribute("username", "東方姑娘");
return "forward:/WEB-INF/views/index.jsp";
}
// 自定義重定向頁面跳轉的地址 redirect: 跳轉的地址
@RequestMapping("/method5")
public String method5() {
return "redirect:http://www.jd.com";
}
5.返回對象類型和共享數據
方法不返回ModelAndView也不返回String類型對應的邏輯視圖名稱直接返回一個Pojo對象
如果直接返回Pojo對象,項目又配置了視圖解析器規則
如果方法中沒有返回ModelAndView對象,此時SpringMVC不知道視圖在哪裏.
此時需要配置視圖解析器org.springframework.web.servlet.view.InternalResourceViewResolver.
物理視圖路徑爲:前綴+請求路徑(上下文路徑+資源名稱)+後綴
必須保證視圖解析器路徑下面必須有 請求路徑對應的頁面
@ModelAttribute作用如下:
1、設置請求參數綁定到Model對象中並傳到視圖頁面的key名.
2、將方法返回值或請求參數綁定到Model對象中並傳到視圖頁面
@ModelAttribute("userKey")//跳轉頁面使用el表達式獲取的對應的屬性名稱
@RequestMapping("/method6")
public User method6() {
User user = new User();
user.setUsername("東方姑娘");
user.setPassword("dfgn");
user.setEmail("[email protected]");
user.setPhone("234234234324");
return user;
}
6.轉換JSON數據
在web開發中,前臺頁面經常會發送ajax請求從後臺請求數據,ajax請求給前臺的數據一般都是json 數據。
SpringMVC支持自動將對象轉換JSON格式的數據響應給客戶端(瀏覽器)
SpringMVC默認使用的是 jackson 作爲對象轉json的工具
Fast-json Alibaba
Gson google
Json-lib Apache
@ResponseBody 會將當前方法直接返回字符串 ,不再進行頁面跳轉
@Controller
public class JsonController {
@RequestMapping("/getUserJson")
@ResponseBody //把響應的內容設爲普通字符串
public User getUserJson() {
User user = new User();
user.setUsername("東方姑娘");
user.setPassword("dfgn");
user.setEmail("[email protected]");
user.setPhone("234234234324");
return user;
}
@RequestMapping("/getUserJsonList")
@ResponseBody
public List<User> getUserJsonList() {
User user = new User();
user.setUsername("東方姑娘");
user.setPassword("dfgn");
user.setEmail("[email protected]");
user.setPhone("234234234324");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user);
list.add(user);
list.add(user);
return list;
}
}