1.通過配置的形式搭建(瞭解)
1.1創建項目並導包
- web項目, 包:
- spring相關
- springmvc相關: spring-webmvc.jar
1.2編寫後端控制器
public class DemoController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
// 準備要返回的結果對象
// Model代表request作用域
// View代表要跳轉的頁面
ModelAndView mv = new ModelAndView();
// 向作用域存放數據: demo
mv.addObject("demo", "Hello SpringMVC!");
// 跳轉到一個頁面: index.jsp
mv.setViewName("index.jsp");
// 返回結果
return mv;
}
}
1.3web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--不能配/*, 要配置/, 放行jsp-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
1.4 編寫springMVC配置文件
默認有要求, 必須放在WEB-INF目錄下, 名稱必須叫<servlet-name>-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置後端控制器 - 程序員提供的類-->
<bean name="/demo, /bjsxt" class="com.bjsxt.controller.DemoController" />
<!--處理器適配器: 幫助前端控制器去調用後端控制器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!--處理器映射器: 幫助後端控制器映射客戶的訪問路徑, 類似於url-pattern-->
<!--使用後端控制器的名稱作爲訪問的路徑-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!--視圖解析器: 定位顯示頁面的-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
</beans>
1.5 訪問流程
當客戶端發起請求後, 首先, 被前端控制器(DispatcherServlet)接收, 前端控制器會先解析訪問路徑, 接着, 通過處理器映射器進行比對, 定位到需要調用的後端控制器, 接下來, 前端控制器會通過處理器適配器去調用後端控制器中的handleRequest方法, handleRequest方法會返回ModelAndView對象, 由視圖解析器解析要響應的頁面, 將頁面響應到客戶端, 到此爲止, 用戶就看到訪問的頁面了.
1.6 存在的問題
a) 麻煩, 還不如servlet簡單;
b) 後端控制器存在嚴重的問題, 必須實現接口;
c) springMVC配置文件的問題
2.通過註解的形式搭建(掌握)
2.1創建項目並導包(跟之前一樣)
2.2編寫後端控制器(不用實現任何接口)
- 控制器方法需要遵循特定的簽名規範:
- public * 方法名(…)
一般情況下, 方法簽名如下:public String 方法名(…). 其中返回類型String, 表示要跳轉的頁面, 相當於ModelAndView.setViewName(string).
@Controller
public class DemoController {
@RequestMapping({"/demo1", "/bjsxt"})
public String demo1() {
System.out.println("DemoController.demo1");
return "index.jsp";
}
}
2.3配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.4配置SpringMVC配置文件
<?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: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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--註解掃描-->
<context:component-scan base-package="com.bjsxt.controller" />
<!--註解驅動-->
<mvc:annotation-driven />
</beans>
2.5視圖解析器和靜態資源映射
<!--配置自定義視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!--靜態資源映射-->
<mvc:resources mapping="/static/**" location="/static/" />
3.作用域
3.1request作用域
@RequestMapping("/test")
public String demo2(HttpServletRequest req) {
System.out.println("DemoController.demo2");
req.setAttribute("demo", "HttpRequest");
return "demo";
}
@RequestMapping("/test")
public String demo2(Model model) {
System.out.println("DemoController.demo2");
model.addAttribute("demo", "Model");
return "demo";
}
@RequestMapping("/test")
public String demo2(Map<String, Object> map) {
System.out.println("DemoController.demo2");
map.put("demo", "Map");
return "demo";
}
session作用域
@RequestMapping("/test")
public String demo2(HttpServletRequest req) {
System.out.println("DemoController.demo2");
req.getSession().setAttribute("demo", "request --> session");
return "demo";
}
@RequestMapping("/test")
public String demo2(HttpSession session) {
System.out.println("DemoController.demo2");
session.setAttribute("demo", "HttpSession");
return "demo";
}
application作用域(不能直接傳遞ServletContext作爲參數)
@RequestMapping("/test")
public String demo2(HttpServletRequest req) {
System.out.println("DemoController.demo2");
req.getServletContext().setAttribute("demo", "request --> application");
return "demo";
}
@RequestMapping("/test")
public String demo2(HttpSession session) {
System.out.println("DemoController.demo2");
session.getServletContext().setAttribute("demo", "session --> application");
return "demo";
}