【SSM Spring 5.0.2 SpringMVC IDEA Maven】SpringMVC學習記錄 2019_6_30

QuickStart

基礎配置
  1. 创建maven项目
    选择archetype:maven-archetype-webapp
    注:如果创建项目过慢,输入<archetypeCatalog,internal>在创建项目Properties的时候

  2. 补全工程文件目录
    java,resource,并mark directory为Re/Source root

  3. 在pom中引入依赖

	<!-- 编译版本修改为1.8 -->
	<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <!-- Spring版本锁定 -->
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
  1. 在web.xml配置核心控制器DispatcherServlet
<web-app>
    <!-- SpringMVC的核心控制器 -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置Servlet的初始化参数,指定springmvc配置文件在類路徑下,创建springMVC容器 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 配置servlet启动时加载对象 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    	<!-- 在servlet映射中添加dispatcherServlet -->
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 整个网站全部的Servlet都要经过核心控制器 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

輸入<servlet生成兩行,第二行為沒寫完的<光標下移,然後輸入servlet-class補全,然後在<servlet-class></servlet-class>内輸入
DispatcherServlet,就可自動生成。init-param與servlet-mapping都需要自己手動輸入,不自動匹配。
提示:init-param不需要輸入,如果沒有指定使用默认值:/WEB-INF/<servlet-name>-servlet.xml

  1. 在類路徑Resouce文件下創建springmvc.xml文件(選擇創建Spring XML即可)。

以上配置完畢,就可以部署在Tomcat上。當然只有一個index.jsp頁面罷了

進階配置
  1. 在index.jsp上使用<a/>標簽
    【入口頁面】
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
	<body>
		<h2>Hello World!</h2>
		<a href="hello" >新手程序,但是我好像都懂hhhh</a>
	</body>
</html>
  1. 新建controller類
    【控制器】
    2個要點
    第一個是使用@Controller標記這個類為控制器
    第二個是使用@RequestMapping(path = “/hello”)標記接收的請求url為/hello
package cn.itcast.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 控制器标记
 */
@Controller
public class HellowController {
   
   
    /**
     * 接收请求路徑为`hello`千萬別寫反斜杠/
     * @return
     */
    @RequestMapping(path = "/hello")
    public String sayHello() {
   
   
        System.out.println("Hello SpringMVC!!");
        return "success";
    }
}
  1. 在WEB-INF中創建pages文件夾
    裏面放置跳轉的jsp頁面,這個路徑由SpringMVC-servlet.xml配置文件中 視圖解析器 決定的。

  2. 新建success JSP頁面
    【跳轉頁面】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h2>Welcome to SpringMVC!</h2>
</body>
</html>
  1. 修改springMVC.xml配置
    1個要點:在springMVC的視圖解析器中,配置pages文件的路徑【可以不在WEB-INF中】
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.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-4.0.xsd">
	
	<!-- 只扫描带有controller注解的控制器 -->
	<context:component-scan base-package="com.atguigu.mybatis" use-default-filters="false">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<!-- 视图解析器InternalResourceViewResolver -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 处理动态,静态资源两个MVC标签,重要**不僅僅是注解還代表注冊各種SpringMVC組件xxx器** -->
	<mvc:annotation-driven></mvc:annotation-driven>
	<mvc:default-servlet-handler/>
</beans>

<mvc:annotation-driven>说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用<mvc:annotation-driven> 自动加载 RequestMappingHandlerMapping(处理映射器)
和RequestMappingHandlerAdapter(处理适配器)可用在SpringMVC.xml配置文件中使用 <mvc:annotation-driven>
替代注解处理器和适配器的配置。

入門SpringMVC圖解

入門級

詳細SpringMVC圖解

在这里插入图片描述
個人理解:
前端控制器DispatchServlet:只是中轉站,傳入request請求,返回response響應。這個中間經它的調用有
1.處理器映射器2.處理器適配器3.視圖解析器4.動靜態頁面

處理器映射器handlermapping:將傳入的請求路徑進行解析,生成這個請求路徑+背後全部需要的其他請求的執行鏈Chain。返回給前端控制器。

處理器適配器HandlerAdapter:將由前端控制器轉發的執行鏈中的全部servlet執行,返回Model結果數據和View需要的頁面

視圖解析器ViewResolver:將由前端控制器轉發的View頁面 拼裝 為完整的頁面訪問路徑

視圖:渲染–由前端控制器裝載model數據到返回的具體頁面request域中

注:爲什麽這個前端控制器這麽,是因爲和Spring IOC容器一樣,降低這些組件閒的相互耦合.

重要注解

@RequestMapping()
出现位置:  
	类上:请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。   
	功用:使 URL 訪問可以按照模块化管理:   
		例如:    
			账户模块:     /account/add     /account/update   /account/delete     ... 
   			订单模块:     /order/add       /order/update     /order/delete 
  		實例:
  		@RequestMapping("/account") ,使 URL 更加精细【將重複性的類名從方法上的requestmapping中抽取出來放在上面而已】。  

  	方法上:请求 URL 的第二级访问目录。
  		實例:
  		@RequestMapping(path="/add"),path,可寫可不寫,如果是一個參數時

属性:  
	value:用于指定请求的 URL。它和 path 属性的作用是一样的。  
	method:用于指定请求的方式(get/post/head/put/patch/delete/options/trace)可單個,可多個值。
		實例:
			@RequestMapping(value="/saveAccount",method=RequestMethod.POST)
			@RequestMapping(value="/saveAccount",method={RequestMethod.POST,RequestMethod.GET})
		注:<a></a>使用get方法

	params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和 配置的一模一样。 可單多   
			半實例:   
				params = {"accountName"},表示请求参数必须有 accountName     
				params = {"moeny!100"},表示请求参数中 money 不能是 100。  
	headers:用于指定请求消息头的条件 限制。  
			半實例:
				headers = {"Accept"}

	注意:   以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。 
@RequestParam()
	作用:  指定(從前臺傳入後臺的)參數名称,给控制器中的形参賦值。 
	属性:  
			value=name:请求参数中的名称。  
			required:请求参数中是否必须提供此参数。默认值為true必须提供,如果不提供将报错。
			defaultValue:默認值
	實例:
			@RequestMapping("/useRequestParam") 
			public String useRequestParam(
				@RequestParam("name")String username,
				@RequestParam(value="age",required=false)Integer age)
			{  
				System.out.println(username+","+age);  
				return "success"; 
			}
@RequestBody()

GET請求方法是將所有參數封裝在url上,而POST方法則是封裝成一個對象【所以Form表單是POST請求】
請求體包含Form表單内容,controller函數形參只能寫一個@RequestBody String body。

	作用:	用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。  
			get 请求方式不适用。
			【異步的時候會用到。傳遞Json數據,封裝的時候用到@RequestBody】
	属性:  required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。
					 如果取值 为 false,get 请求得到是 null。 

controller.java

    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body){
   
   
        System.out.println("执行了...");
        System.out.println(body);
        return "success";
    }

實例:如果表單為,username:abc,age:12。則請求體為:username=abc&age=12

@PathVaribale()
	作用:  用于獲取 請求路徑 中的占位符`{}`内容(/usePathVariable/100)獲取100這樣就不需要input。
		   也不需要key=value的形式獲取。
	属性:  
			name=value:用于指定 url 中占位符名称。  
			required:是否必须提供占位符

	實例: 	controller函數上的@RequestMapping("/usePathVariable/{id}") 中的{id}就是 url 占位符。
			url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。 

jsp 代码:

<!-- PathVariable 注解 --> 
<a href="springmvc/usePathVariable/100">pathVariable 注解</a> 

controller 代碼:

	@RequestMapping("/usePathVariable/{id}") 
	public String usePathVariable(@PathVariable("id") Integer id){
   
   
		System.out.println(id);  
		return "success"; 
	}

Restful風格:
個人理解——用不同的請求方法+佔位符來區分相同請求路徑調用的不同方法——>用最簡單的方法來實現複雜重複代碼
對於緩存的優點是——共用一個局部緩存,因爲路徑上訪問的都是這個Controller類對象,利於管理。
rest
Rest案例:
restcase

基於HiddentHttpMethodFilter的Restful風格Controller實現

由于浏览器 form 表单只支持 GET 与 POST 请求(a標簽支持的是GET),而 DELETE、PUT 等 method 并不支持
Spring3.0 添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT 与 DELETE 请求。
這樣就可以實現@PathVaribale()注解的功用,創建Restful風格代碼。

【除了這個filter,還可以通過WebClient類,直接調用靜態方法模擬各種請求方式。以及瀏覽器插件也可以做到】

使用方式:

  1. 在web.xml中添加此filter過濾器
  2. 请求方式必须使用 post 请求。
  3. 按照要求提供_method 请求参数,该参数的取值就是我们需要的请求方式。

filter完全實現類
hhmfilter

原理:雖然form表單只能發post或者get
但下面有一行input 隱藏域<input type="hidden" name="_method" value="PUT">
這個會被filter攔截到,從而將post請求轉換為put請求。

.jsp


                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值