Spring實現(xiàn)步驟
- 新建web maven工廠
- 加入依賴
spring-mvc依賴,間接把spring的依賴都加入到項目
jsp,servlet依賴 - 重點:在web.xml注冊springmvc框架的核心對象DispatcherServlet
1.DispatherServlet:中央調(diào)度器是一個servlet,父類是HttpServlet
2.DispatherServlet:也叫前端控制器
3.DispatherServlet:負責(zé)接受請求,調(diào)用其他控制器對象,并把請求返回給用戶。
4.創(chuàng)建一個發(fā)起請求的頁面 index.jsp
5.創(chuàng)建控制器類
- 1. 在類上面加入@Controller注解,創(chuàng)建對象,并放入到springmvc容器中。
- 2. 在類中的方法上面加入@RequestMapping注解
6.創(chuàng)建一個作為結(jié)果的jsp,顯示請求的處理結(jié)果。
7.創(chuàng)建springmvc的配置文件(spring的配置文件一模一樣)
- 1.聲明組件掃描器,指定@Controller注解所在的包名。
- 2.聲明視圖解析器,幫組處理視圖的。
springmvc 配置
- 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">
<!-- 注冊springMVC的核心對象DispatherServlet-->
<!-- 需要在tomcat服務(wù)器啟動后創(chuàng)DispatherServlet實例-->
<!-- 為什么要創(chuàng)建DispatherServlet對象的實例呢
通過DispatherServlet在他創(chuàng)建過程中,會同時創(chuàng)建springmvc容器對象
讀取springmvc的配置文件,吧這個配置文件中的對象都創(chuàng)建好,當(dāng)用戶發(fā)起請求
就可直接使用對象了
servlet的初始化會執(zhí)行init()方法.DispatherServlet在init()中
創(chuàng)建容器 讀取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext("SpringMVC.xml");
// 把容器對象放入ServletContext中
getServletContext().setAttribute(key, ctx);
報錯: /WEB-INF/springmvc-servlet.xml
/WEB-INF/myWeb-servlet.xml
原因是: springmvc在創(chuàng)建容器對象時
默認讀取的是/WEB-INF/<servlet-name>-servlet.xml
-->
<servlet>
<servlet-name>myWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 自定義springmvc配置文件的位置-->
<init-param>
<!-- springmvc的配置文件的位置的屬性-->
<param-name>contextConfigLocation</param-name>
<!-- 指定自定義文件的位置-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在tomcat啟動后,創(chuàng)建servlet對象
load-on-startup: 表示tomcat啟動后創(chuàng)建對象的順序
它的值士整數(shù),數(shù)值越小,tomcat創(chuàng)建對象的時間越早。
大于等于0的整數(shù)
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myWeb</servlet-name>
<!-- 使用框架的時候,url-pattern可以使用兩種方式-->
<!-- 1. 使用擴展名, 使用*.xx , xxx是自定義的擴展名。-->
<!-- 常用*.do 等等
2. 使用斜杠 */
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
- resrouce/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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 聲明組件掃描器-->
<context:component-scan base-package="com.study.controller"/>
<!-- 聲明 springmvc框架中的視圖解析器, 幫助開發(fā)人員設(shè)置視圖文件的路徑、-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前綴: 視圖文件的路徑-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后綴:視圖文件的擴展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- Controller類
/**
* 表示一個控制器對象
* 位置在類上面
* 和spring中講的@Service, @Component一樣
*/
@Controller
public class MyController {
/**
* 處理用戶提交的請求,springmvc是用方法來處理的
* 方法是自定義的,可以有多種返回值,多種參數(shù), 方法名自定義
*/
/**
* @RequestMapping 請求映射
* 作用: 把一個請求和一個方法綁定在一起
* 屬性: 1. value是一個String, 表示url地址的(some.do)
* value 的值必須是唯一的, 不能重復(fù). 在使用時, 推薦地時以"/"
* 說明: 使用RequestMapping修飾的方法叫做處理器方法,或者說控制器方法。
* 類似于servlet的doGet, doPost.
* 返回值: ModelAndView
* Model:要顯示給用戶的數(shù)據(jù)
* View : 返回jsp等.
*/
@RequestMapping(value = "/some.do")
public ModelAndView dosome(){ // doGet()
ModelAndView mv = new ModelAndView();
// 添加數(shù)據(jù) , 框架最后吧數(shù)據(jù)放入request作用域
// request.setAttribute("fun","執(zhí)行完成");
mv.addObject("msg", "歡迎使用springmvc");
mv.addObject("fun", "執(zhí)行dosmome方法");
// 指定視圖
// 框架對視圖執(zhí)行的是forward.
mv.setViewName("/show.jsp");
return mv;
}
}
- spring.xml 配置文件 掃描包 創(chuàng)建對象
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.lz.controller"/>
</beans>
- view層 show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>show.jsp</h3>
<p>msg數(shù)據(jù):${requestScope.msg}</p>
<p>fun數(shù)據(jù):${requestScope.fun}</p>
</body>
</html>
springmvc的處理流程:
-
用戶發(fā)起請求 -> tomcat -> tomcat讀取web.xml更具映射規(guī)則*.do給中央調(diào)度器DispatherServlet(根據(jù)springmvc.xml配置文件 知道some.do - > dosome()方法)- >DispatherServlet吧some.do裝法給MyController.dosome() - > 方法返回ModelAndView
如何訪問WEB-INF/view目錄下的jsp或者其他頁面
即保證了用戶直接訪問,又解決的無法轉(zhuǎn)發(fā)的問題。
mv.setViewName("/WEB-INF/view/show.jsp");
-
視圖解析器:
<!-- 聲明 springmvc框架中的視圖解析器, 幫助開發(fā)人員設(shè)置視圖文件的路徑、-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前綴: 視圖文件的路徑-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后綴:視圖文件的擴展名-->
<property name="suffix" value=".jsp"/>
</bean>
@Controller
public class MyController {
/**
* 處理用戶提交的請求,springmvc是用方法來處理的
* 方法是自定義的,可以有多種返回值,多種參數(shù), 方法名自定義
*/
/**
* @RequestMapping 請求映射
* 作用: 把一個請求和一個方法綁定在一起
* 屬性: 1. value是一個String, 表示url地址的(some.do)
* value 的值必須是唯一的, 不能重復(fù). 在使用時, 推薦地時以"/"
* 說明: 使用RequestMapping修飾的方法叫做處理器方法,或者說控制器方法。
* 類似于servlet的doGet, doPost.
* 返回值: ModelAndView
* Model:要顯示給用戶的數(shù)據(jù)
* View : 返回jsp等.
*/
@RequestMapping(value = "/some.do")
public ModelAndView dosome(){ // doGet()
ModelAndView mv = new ModelAndView();
// 添加數(shù)據(jù) , 框架最后吧數(shù)據(jù)放入request作用域
// request.setAttribute("fun","執(zhí)行完成");
mv.addObject("msg", "歡迎使用springmvc");
mv.addObject("fun", "執(zhí)行dosmome方法");
// 指定視圖
// 框架對視圖執(zhí)行的是forward.
// mv.setViewName("/WEB-INF/view/show.jsp");
// 配置了視圖解析器后用邏輯名稱指定視圖
// 框架自動把前綴和邏輯名稱和視圖進行字符串拼接
mv.setViewName("show");
return mv;
}
}
- controller
@RequestMapping(value = {"/some.do","/second.do"})
@RequestMapping("")可以定義在類上把公共的部分放在類上。形成層級例如 /first/metod.do
RequestMapping() Method屬性
- 控制請求方式
//使用的是枚舉形式
@RequestMapping(value = "/some.do", method = RequestMethod.POST)
如果沒有設(shè)置則什么形式的訪問都行
接受前臺數(shù)據(jù)
// 接受前端參數(shù)
@RequestMapping(value = "/first.do")
public ModelAndView doFirst(HttpServletRequest req,
HttpServletResponse resp,
HttpSession session){
ModelAndView mv = new ModelAndView();
mv.addObject("msg", req.getParameter("name"));
mv.setViewName("other");
return mv;
}
逐個接受form表單
<form action="properties.do" method="post">
姓名: <input type="text" name="name">
年齡: <input type="text" name="age">
<input type="submit" value="提交參數(shù)">
</form>
// 逐個接受 需要方法參數(shù)與請求名字一一對應(yīng) 并且一樣
@RequestMapping(value = "properties.do")
/**
* 框架會提供類型轉(zhuǎn)型功能,能把String 轉(zhuǎn)換為 int float double類型
*/
public ModelAndView proper(String name, int age){
ModelAndView mv = new ModelAndView();
mv.addObject("myAge", age);
mv.addObject("myName", name);
mv.setViewName("properties");
return mv;
}
}
int 換成 Integer更好 容錯 也可以全部寫String
- post方式請求 解決亂碼
get請求沒有亂碼 post請求會有中文亂碼
1. 在每個方法前面加Request.getCharacterEncoding("utf-8");
2. 使用過濾器解決
- web.xml 過濾器解決亂碼問題
<!-- 注冊過濾器, 解決亂碼問題-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 設(shè)置使用的項目字符編碼-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- 強制請求對象使用上面的編碼格式-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!-- 強制應(yīng)答對象使用上面編碼格式-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 強制所有請求先通過過濾器-->
<url-pattern>/*</url-pattern>
</filter-mapping>
@RequestMapping
- 請求參數(shù)和處理器方法的形參名不一樣時用
解決請求中參數(shù)名形參名不一樣的問題
屬性 :
1.value 請求中參數(shù)名稱
2.required 是一個boolean,默認是true
true標(biāo)識請求中必須包含此參數(shù)
false參數(shù)可以有也可以沒有(必須有時,不傳參數(shù)會報400錯誤)
位置:在處理器方法
@RequestMapping(value = "haha.do")
public ModelAndView hahaPara(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "age",required = false) Integer age){
ModelAndView view = new ModelAndView();
view.addObject("msg" , name);
view.addObject("fun", age);
view.setViewName("show");
return view;
}
- 接受對象
處理器方法形參是java對象,這個對象的屬性名和請求名一樣的。
框架會創(chuàng)建形參java對象,給屬性賦值。請求中的參數(shù)是name,框架會調(diào)用setName()
使用同名原則所以參數(shù)中可以有多個對象
并且沒法使用RequestParam。
···
@RequestMapping(value = "object.do")
public ModelAndView objectTest(Student student){
ModelAndView mv = new ModelAndView();
mv.addObject("msg", student.getName());
mv.addObject("fun", student.getAge());
mv.setViewName("show");
return mv;
}
····

