SSM學習之SpringMVC-一、springmvc 概述
一、springmvc 概述
1.1 springmvc定義
基於spring的一個框架,實際上就是spring的一個模組,專門是做web開發的,理解為servlet的升級。web開發底層是servlet,框架是在servlet基礎上面加入一些功能,讓開發更方便。
1.2 spring和springmvc對比
spring:spring是容器,ioc能夠管理物件, 使用< bean>,@Component,@Repository,@Service,@Controller 標籤 springmvc:能夠建立物件,放入到容器中(springmvc容器),spring容器中放的是控制器物件
1.3 springmvc簡要流程
我們要做的是 使用
二、開發步驟
2.1、做一個小demo
index.jsp —> DispatcherServlet(中央排程器,類似servlet) ----> 轉發,分配給Controller物件(@Controller 註解建立的物件)
開發流程:
- 發起some.do請求
- tomcat (web.xml 從url-pattern知道 *.do 的請求給DispatcherServlet)
- DispatcherServlet(根據spring.xml配置知道some.do,doSome()方法)
- DispatcherServlet把some.do轉發給MyController.doSome()方法
- 框架執行doSome()把得到的ModelAndView進行處理,轉發到show.jsp
簡化流程:
some.do -> DispatcherServlet -> MyController
img
在pom.xml中引入servlet和springmvc依賴
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
核心配置檔案 web.xml
- (自定義配置檔案的位置<init-param>:在resources目錄下建立配置檔案,new->XML Configuration File->Spring Config,然後在web.xml下指定自定義配置檔案的位置即可)
- 之前servlet-name報錯是因為沒有設定servlet-mapping對映,設定完就不報錯了
<?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的核心物件DispatcherServlet
需要在tomcat伺服器啟動後,建立DispatcherServlet物件例項
為什麼要建立DispatcherServlet物件的例項呢?
因為在DispatcherServlet建立過程中,會同時建立springmvc容器物件,
讀取springmvc的配置檔案,把這個配置檔案中的物件都配置好,
當用戶發起請求時就可以直接使用物件了。
servlet的初始化會執行init()方法,DispatcherServlet在init()中{
//建立容器,讀取配置檔案
webApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器物件放入到ServletContext中
getServletContext().setAttribute(key,ctx);
}
-->
<servlet>
<servlet-name>springmvc</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啟動後,建立servlet物件
數字表示啟動後建立物件的順序,數值越小,tomcat建立物件越早,要求大於等於0的整數
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
使用框架的時候,url-pattern可以使用兩種值
1.使用副檔名方式,語法 *.xxxx , xxxx時自定義副檔名。常用的方式 *.do, *.action, *.mvc等等
http://localhost:8080/myweb/some.do
http://localhost:8080?myweb/other.do
2.使用斜槓"/"
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
上面已經指定了中央排程器的位置,那麼我們現在就在指定的位置建立springmvc.xml
- 宣告元件掃描器(controller)
<?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.laj.controller"/>
</beans>
聲明瞭Controller後,我們就在com.laj.controller.MyController.java 建立控制類
- 設定對映請求,new ModelAndView(),根據K-V的形式存放資料
- 設定資料返回的檢視,setViewName
package com.laj.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @Controller 建立處理器物件,物件放在SpringMVC容器中
*/
@Controller
public class MyController {
/*
處理使用者的請求,SpringMVC中是使用方法來處理的
方法是自定義的,可以有多種返回值,多種引數,方法名稱自定義
*/
/**
* 準備使用doSome 方法處理some.do請求
* @return
*/
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
//處理some.do的請求
ModelAndView mv = new ModelAndView();
//K-V形式
mv.addObject("msg1","Hello World!");
mv.addObject("msg2","Hello World!!");
mv.setViewName("/show.jsp");
return mv;
}
@RequestMapping(value = "anny.do")
public ModelAndView anny(){
//處理some.do的請求
ModelAndView mv = new ModelAndView();
//K-V形式
mv.addObject("value1","我是程式設計天才!");
mv.addObject("value2","是的!");
mv.setViewName("/show.jsp");
return mv;
}
}
上面設定了資料返回的檢視後,我們開始建立檢視
(由於我們一開始沒有建立主頁面,現在這裡補上index.jsp)
<%--
Created by IntelliJ IDEA.
User: 11877
Date: 2021/7/4
Time: 1:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>第一個MVC的專案</p>
<p><a href="some.do">發起一個some.do請求</a></p>
<p><a href="anny.do">發起一個anny.do請求</a></p>
</body>
</html>
在主頁面中,有兩個不同的請求頁面, 根據不同的請求頁面中,有兩個不同的Controller類中的方法返回的值可以獲取到。
接下來我們建立超連結裡面的檢視 資料通過 ${} 的格式進行書寫
<%--
Created by IntelliJ IDEA.
User: 11877
Date: 2021/7/4
Time: 1:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>show.jsp從request作用域獲取資料</h3><br />
<h4>msg1資料:${msg1}</h4>
<h4>msg2資料:${msg2}</h4>
<h4>msg2資料:${value1}</h4>
<h4>msg2資料:${value2}</h4>
</body>
</html>
如此一個完整的SpringMVC 的demo就完成啦!
注意:檔案的路徑圖
img2.2、防止使用者不在網頁內請求下直接訪問內部網站
解決辦法:將檢視檔案(.jsp)放到WEB-INF下的資料夾下
導致:setViewName請求的網站需要改成/WEB-INF/view/show.jsp
如果有多個請求的網站頁面,增加字首的方式將很繁瑣
解決辦法:在springmvc.xml中宣告檢視解析器,使用bean註冊字首和字尾
<!-- 宣告檢視解析器,幫助開發人員設定檢視檔案的路徑 InternalResourceViewResolver-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 字首:檢視檔案的路徑-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 字尾:檢視檔案的副檔名-->
<property name="suffix" value=".jsp"/>
</bean>
讓MyController中setViewName("/WEB-INF/view/show.jsp")--->MyController中setViewName("show")
三、註解式開發
3.1@RequestMapping
放在類上面@RequestMapping("/user"),表示下面的請求都是基於/user/xxx.xx,便於模組化操作
放在方法上@RequestMapping(value="/xxx.xx",method = RequestMethod.GET) -->表示get請求方式
RequestMethod.GET、RequestMethod.POST……
如果method不寫就不限制
**注意**:在Controller中設定GET或者POST,在index中也要對應,否則會報 **錯誤405**
3.2處理器方法的引數
處理器方法可以包含以下四類引數,這些引數會在系統呼叫時由系統自動賦值,即程式設計師可以在方法中直接使用。
HttpServletRequest request, 請求
HttpServletResponse response, 應答
HttpSession session 會話
請求中所攜帶的請求引數(即使用者提交的資料)
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(HttpServletRequest request,
HttpServletResponse response,
HttpSession session){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","歡迎使用springmvc做web開發" + request.getParameter("name"));
mv.addObject("fun","執行的是doSome方法");
mv.setViewName("show");
return mv;
}
http://www.sczw.com/webnews/39993.html
http://www.sczw.com/webnews/39994.html
在這裡插入圖片描述
3.3逐個引數接收
設定主頁index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>提交引數給Controller</p>
<form action="receive.do" method="post">
姓名:<input type="text" name="name"><br />
年齡:<input type="text" name="age"><br />
<input type="submit" value="提交引數">
</form>
</body>
</html>
<注意:1、action後面的域名前面不要加/
2、input後面的引數是對應的事type和**name**>
業務層:
@Controller
public class MyController {
@RequestMapping(value = "/receive.do")
public ModelAndView doSome(String name ,String age){
ModelAndView mv = new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("show");
return mv;
}
}
檢視層:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>從request作用域獲取資料</h3><br />
<h3>name資料:${myname}</h3><br/>
<h3>age資料:${myage}</h3>
</body>
</html>
注意:在提交請求引數的時候,get請求方式中文沒有亂碼;post請求方式中文有亂碼,需要使用過濾器處理亂碼問題。
使用過濾器處理post中文亂碼:characterEncodingFilter 在org. springframework: spring-web: 5.2.5. RELEASE依賴中
所以在web.xml檔案中配置:三個引數:encoding、forceRequestEncoding、forceResponseEncoding,通過mapping對映,最後強制範圍內請求通過過濾器
<!--註冊宣告過濾器,解決post請求亂碼-->
<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>
<!-- 強制請求物件(HttpServletRequest)使用encoding編碼的值-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<!-- 強制應答物件(HttpServletResponse)使用encoding編碼的值-->
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- /*表示強制所有的請求先通過過濾器處理-->
<url-pattern>/*</url-pattern>
</filter-mapping>
總結:
SpringMVC總結歸納