阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

SpringMVC入门

177次阅读
没有评论

共计 20803 个字符,预计需要花费 53 分钟才能阅读完成。

1、springMVC 概述

1.1、回顾 mvc

MVC 模式代表 Model-View-Controller(模型 - 视图 - 控制器)模式。这种模式用于 WEB 应用程序的分层结构开发。

Model(模型) – 代表一个存取数据的 java 对象(POJO)。通常模型对象负责在数据库中存取数据。

View(视图) – 代表模型包含的数据的可视化。通常视图是依据模型数据创建的可视化界面。

Controller(控制器) – 作用于模型和视图上。通常控制器负责从视图读取数据,并向模型发送数据;或者从模型获取数据,传送给视图。

注意:

POJO(Plain Ordinary Java Object)简单的 Java 对象,实际就是普通 JavaBeans,是为了避免和 EJB 混淆所创造的简称。

1.2、三层架构

Java 的三层架构分别为表示层、业务逻辑层和数据持久层。

常用的两种框架组合:**SSH:**Struts2+Spring+Hibernate、**SSM:**Spring MVC+Spring+MyBatis

表示层(UI 层):
表示层也称为界面层,位于最外层,离用户最近,是用户可以直接看到的。用于显示数据和接收数据,为用户提供一种交互式操作的界面。

业务逻辑层(BLL 层):
负责业务的处理和数据传递。复杂的逻辑判断和涉及到数据库的数据验证都需要在此做出处理。主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理。

数据访问层(DAL 层):
主要对数据库的直接访问,为业务逻辑层提供数据,根据传入的数据来完成数据库的增、删、改、查操作。

1.3、什么是 springMVC

SpringMVC 是基于 Java,实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架。即使用了 MVC 架构模式的思想,将 web 层进行解耦;又基于请求驱动(使用请求 - 响应模型)。

编写框架的目的就是帮助我们简化开发,SpringMVC 框架也简化了我们的 Web 开发。

1.4、springMVC 对应三层架构

SpringMVC 入门

** V 代表 View 视图:** 在 springMVC 中,V 指的是视图渲染技术:包含了 MVC 框架的标签、自定义标签和方便简化 HTML 代码;JSP 里面的动态代码都将用标签来表示;页面的校验部分,提供了初始的页面校验。

比如:登录校验,邮件格式校验等,所以说 View 部分主要负责页面的处理和展示。

** M 代表 Model 模型:** 简单的说就是业务模型与数据模型。

比如:学生信息,就是一个数据模型;注册操作,就是一个业务模型。模型其实是业务规则和数据对象的抽象。

** C 就是控制器:** V 负责展示页面数据,M 是业务模型与数据模型,而模型和展示数据之间的对应的连接则需要 C 来完成,因此 Controller(控制器),是模型和展示数据的桥梁。

比如:一个用户登录的执行过程,用户登录界面,输入的用户登录信息是 View,经过 Controller 的接收和传递(获取到了用户信息的模型),然后再经过 Controller 的派发处理,到页面上展示为 View 数据。

1.5、springMVC 优势

角色划分清晰:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(Validator)、命令对象(Command)、表单对象(Form)等。

命令对象就是一个 POJO,可以使用命令对象直接作为业务对象。

能够和 Spring 其他框架无缝集成,其它 Web 框架并不具备这种集成能力。

可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。可定制性,HandlerMapping、ViewResolver 等能够非常简单的定制。

springMVC 还有强大的数据验证、格式化、绑定机制。

对本地化、主题的解析支持,使我们更容易进行国际化和主题的切换。

拥有强大的 JSP 标签库,使 JSP 编写更容易。

2、第一个 springMVC 案例

2.1、创建一个项目

通过 maven 创建一个项目 smvc001

SpringMVC 入门

注意:

创建项目的时候速度会非常慢(外国的服务器你懂得),因此我们可以直接下载 archetype-catalog.xml(https://search.maven.org/search?q=a:archetypes-catalog),把这个 xml 下载下来放到本地的 maven 目录中,添加一个参数 archetypeCatalog=internal 就可以了。

2.2、导入应用到的 jar 包

pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tyschool</groupId> <artifactId>smvc001</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>smvc001 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <spring.version>5.2.2.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </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> </dependencies> <build> <finalName>smvc001</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>

注意:

SpringMVC 入门

2.3、配置前置控制器

web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- 配置 SpringMVC 核心, 前置控制器 DispatcherServlet --> <servlet> <servlet-name>SpringMVCDispathcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置初始化参数,用来读取 springmvc.xml 文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc.xml</param-value> </init-param> <!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺序 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 前置控制器,映射所有地址 --> <servlet-mapping> <servlet-name>SpringMVCDispathcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

2.4、编写 springmvc.xml 配置文件

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 http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置扫描器,扫描注解 --> <context:component-scan base-package="com.tyschool"></context:component-scan> <!-- 配置视图解析器,配置前缀和后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>

2.5、创建和修改 jsp 文件

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2><a href="/smvc001/hello">Hello World!</a></h2> </body> </html>

pages/index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2>Hello World!</h2> </body> </html>

2.6、创建控制器

HelloController.java

package com.tyschool.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; // 声明控制器组件 @Controller("helloController") public class HelloController {// 声明 url 地址 @RequestMapping("/hello") public String sayHello(){System.out.println("HelloController 的 sayHello 方法执行了。。。。。"); // 返回到指定页面 return "index"; } }

2.7、测试

配置 / 启动 tomcat 服务器,输入 http://localhost:8080/smvc001/index.jsp

3、案例分析

3.1、案例执行过程

SpringMVC 入门

3.2、springMVC 执行过程

SpringMVC 入门

3.3、springMVC 执行过程中的组件

DispatcherServlet(前置控制器)

前置控制器,所有的请求都有经过它来统一分发,请求会被分发给对应的 Handler。

HandlerMapping(处理器映射器)

解析请求链接,然后根据请求链接找到执行这个请求的类(HandlerMapping 所说的 handler)。

HandlerAdapter(处理器适配器)

调用具体的方法对用户发来的请求来进行处理。

Handler(处理器)

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。

ModelAndView(对象)

视图名称或视图对象以及一些模型属性。

ViewResolver(视图解析器)

解析 ModelAndView,将 ModelAndView 中的逻辑视图名变为一个真正的 View 对象,并将 ModelAndView 中的 Model 取出。

Model(模型)

模型属性

View(视图)

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。我们最常用的视图就是 jsp。

一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

4、mvc:annotation-driven

Spring 中的三大组件:处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)

mvc:annotation-driven 元素作用:

会自动加载,处理器映射器(RequestMappingHandlerMapping)和处理器适配器(RequestMappingHandlerAdapter)。通过配置该元素,我们可以替代注解处理器和适配器的配置。

<!-- <mvc:annotation-driven/> 相当于如下配置 --> <!-- 处理器映射器(HandlerMapping) --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 处理器适配器(HandlerAdapter) --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerA dapter"></bean> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!-- 处理器异常(HadnlerExceptionResolvers) --> <bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExcept ionResolver"></bean> <bean class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolv er"></bean> <bean class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver" ></bean>

可替换为:

<mvc:annotation-driven></mvc:annotation-driven>

5、RequestMapping 注解详解 - 上

5.1、RequestMapping 源码分析

package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping {// 表示映射地址别名 String name() default ""; // 用于映射请求地址和方法,可设置多个请求地址 @AliasFor("path") String[] value() default {}; // 4.2 版本出的新属性 @AliasFor("value") String[] path() default {}; // 请求方法类型,GET/POST 等,值取自 RequestMethod 枚举类中属性 RequestMethod[] method() default {}; // 指定请求参数中必须包含某些参数值时,才让该方法处理。 String[] params() default {}; // 指定请求参数中必须包含某些指定的 header 值时,才让该方法处理。 String[] headers() default {}; // 指定处理请求的提交内容类型(Content-Type),例如 application/json, text/html; String[] consumes() default {}; // 指定返回的内容类型,仅当 request 请求头中的 (Accept) 类型中包含该指定类型才返回 String[] produces() default {};}

5.1.1、作用

用于建立发送请求 url 地址和处理请求方法之间的对应关系。

格式:

@RequestMapping(“/manager”)

5.1.2、所在位置

类:

如果在类上编写:@RequestMapping,表示一级目录,类上不写默认为根目录,如果书写可以按模块儿语管理。

@Controller("managerController") @RequestMapping("/manager") public class ManagerController{@RequestMapping("/add") //url=>/manager/add public String addManager(){return add;} @RequestMapping("/update")//url=>/manager/update public String updateManager(){return update;} }

方法:

如果在方法上编写:@RequestMapping,表示二级目录

5.1.3、属性

value:用于指定请求的 url。它和 path 属性的作用一样。

method:指定请求的方法。

params:限制请求参数的条件,要求请求参数的 key 和 value 必须要和配置一模一样。

headers:用于指定限制请求消息头的条件。

注意:

多个属性同时出现他们是与的关系

5.2、类与方法同时出现

5.2.1、HelloController.java

import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller("helloController") @RequestMapping("/test") public class HelloController {@RequestMapping("/hello") public String sayHello(){System.out.println("HelloController 的 sayHello 方法执行了。。。。。"); return "index"; } }

5.2.2、index.jsp

<%@page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <h2><a href="/smvc001/test/hello">Hello World!</a></h2> <h2><a href="test/hello">Hello World!</a></h2> <h2><a href="${pageContext.request.contextPath}/test/hello">Hello World!</a></h2> </body> </html>

注意:

${pageContext.request.contextPath}失效?

解决方式一:

<%@page isELIgnored="false"%>

解决方式二:

<?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_3_1.xsd" id="WebApp_ID" version="3.1"> </web-app>

6、RequestMapping 注解详解 - 下

6.1、方法属性(method)

6.1.1、HelloController.java

import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller("helloController") @RequestMapping("/test") public class HelloController {@RequestMapping(value="/hello",method = RequestMethod.POST) public String sayHello(){System.out.println("HelloController 的 sayHello 方法执行了。。。。。"); return "index"; } }

6.1.2、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2><a href="test/hello">get 提交 </a></h2> <h2> <form action="test/hello" method="post"> <input type="submit" value="post 提交"> </form> </h2> </body> </html>

6.2、参数属性(params)

6.2.1、HelloController.jsp

import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller("helloController") @RequestMapping("/test") public class HelloController {@RequestMapping(value="/hello",method = RequestMethod.POST,params = {"uname","age>18"}) public String sayHello(){System.out.println("HelloController 的 sayHello 方法执行了。。。。。"); return "index"; } }

6.2.2、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2> <form action="test/hello?uname=zhangsan&age>17" method="post"> <input type="submit" value="post 提交"> </form> </h2> <h2> <form action="test/hello?uname=zhangsan&age>18" method="post"> <input type="submit" value="post 提交"> </form> </h2> </body> </html>

7、请求参数绑定 - 上

7.1、参数的绑定

7.1.1、HelloController.jsp

@RequestMapping("say") public String sayName(String uname){System.out.println(uname+"good bye"); return "index"; }

7.1.2、login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="test/say" method="get"> <input type="text" name="uname"/> <input type="submit" value="提交"/> </form> </body> </html>

7.2、参数绑定机制

参数传递的格式:key=value

springmvc 中,表单提交的请求参数与控制器中的方法进行了绑定。

SpringMVC 入门

SpringMVC 入门

7.3、参数支持的数据类型

基本数据类型参数:

整型、浮点型、字符型、字符串型、布尔型

POJO 类型参数:

Javabean(实体类)

数组和集合类型参数:

Array、List、Set、Map 等

7.4、参数使用方式

基本数据类型参数:

参数名称与控制器方法中形参的名称保持完全一致。

POJO 类型参数:

参数名称和 POJO 属性名称完全一致,并且与控制器方法中形参类型是 POJO 类型。

数组和集合类型参数:

第一种:

集合类型的请求参数必须在 pojo 中,在表单中请求参数名称要和 POJO 中集合属性名称相同。

给 List 集合中的元素赋值,使用下标。

给 Map 集合中的元素赋值,使用键值对。

第二种:

的请求参数是 json 格式数据。需要借助一个注解实现。

注意:

参数的自动类型转换:

在 org.springframework.core.convert.support 包下的内置转换器:

java.lang.Boolean -> java.lang.String : ObjectToStringConverter java.lang.Character -> java.lang.Number : CharacterToNumberFactory java.lang.Character -> java.lang.String : ObjectToStringConverter java.lang.Enum -> java.lang.String : EnumToStringConverter java.lang.Number -> java.lang.Character : NumberToCharacterConverter java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory java.lang.Number -> java.lang.String : ObjectToStringConverter java.lang.String -> java.lang.Boolean : StringToBooleanConverter java.lang.String -> java.lang.Character : StringToCharacterConverter java.lang.String -> java.lang.Enum : StringToEnumConverterFactory java.lang.String -> java.lang.Number : StringToNumberConverterFactory java.lang.String -> java.util.Locale : StringToLocaleConverter java.lang.String -> java.util.Properties : StringToPropertiesConverter java.lang.String -> java.util.UUID : StringToUUIDConverter java.util.Locale -> java.lang.String : ObjectToStringConverter java.util.Properties -> java.lang.String : PropertiesToStringConverter java.util.UUID -> java.lang.String : ObjectToStringConverter ......

8、请求参数绑定 - 中

8.1、基本数据类型参数

HelloController.jsp

@RequestMapping("/sayPerson") public String sayPerson(String uname,int age){System.out.println(uname+","+age); return "index"; }

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2> <form action="test/sayPerson" method="post"> uname:<input name="uname"/> age:<input name="age"/> <input type="submit" value="提交"> </form> </h2> </body> </html>

8.2、POJO 类型参数

8.2.1、创建 javabean

Manager.java

import java.io.Serializable; public class Manager implements Serializable {private int mid; private String uname; private String pword; private int age; private QuanXian qx; public int getMid() {return mid; } public void setMid(int mid) {this.mid = mid; } public String getUname() {return uname; } public void setUname(String uname) {this.uname = uname; } public String getPword() {return pword; } public void setPword(String pword) {this.pword = pword; } public int getAge() {return age; } public void setAge(int age) {this.age = age; } public QuanXian getQx() {return qx; } public void setQx(QuanXian qx) {this.qx = qx; } @Override public String toString() {return "Manager{" + "mid=" + mid + ", uname='" + uname + '\'' + ", pword='" + pword + '\'' + ", age=" + age + '}'; } }

QuanXian.java

import java.io.Serializable; public class Manager implements Serializable {private int mid; private String uname; private String pword; private int age; private QuanXian qx; public int getMid() {return mid; } public void setMid(int mid) {this.mid = mid; } public String getUname() {return uname; } public void setUname(String uname) {this.uname = uname; } public String getPword() {return pword; } public void setPword(String pword) {this.pword = pword; } public int getAge() {return age; } public void setAge(int age) {this.age = age; } public QuanXian getQx() {return qx; } public void setQx(QuanXian qx) {this.qx = qx; } @Override public String toString() {return "Manager{" + "mid=" + mid + ", uname='" + uname + '\'' + ", pword='" + pword + '\'' + ", age=" + age + '}'; } }

8.2.2、HelloController.jsp

@RequestMapping("/manager") public String sayManager(Manager m){System.out.println(m+":"+m.getQx()); return "index"; }

8.2.3、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2> <form action="test/manager" method="post"> uname:<input name="uname"/> age:<input name="age"/> qx.isval:<input name="qx.isval"/> qx.qname:<input name="qx.qname"/> <input type="submit" value="提交"> </form> </h2> </body> </html>

9、请求参数绑定 - 下

9.1、POJO 类型中的集合参数

9.1.1、创建 JavaBean

import java.io.Serializable; import java.util.List; import java.util.Map; public class User implements Serializable {private String uname; private String pword; private List<Manager> list; private Map<String,Manager> map; public String getUname() {return uname; } public void setUname(String uname) {this.uname = uname; } public String getPword() {return pword; } public void setPword(String pword) {this.pword = pword; } public List<Manager> getList() {return list; } public void setList(List<Manager> list) {this.list = list; } public Map<String, Manager> getMap() {return map; } public void setMap(Map<String, Manager> map) {this.map = map; } @Override public String toString() {return "User{" + "uname='" + uname + '\'' + ", pword='" + pword + '\'' + ", list=" + list + ", map=" + map + '}'; } }

9.1.2、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2> <form action="test/user" method="post"> uname:<input name="uname"/> pword:<input name="pword"/> list[0].muname:<input name="list[0].muname"/> list[0].age:<input name="list[0].age"/> list[1].muname:<input name="list[1].muname"/> list[1].age:<input name="list[1].age"/> map[one].muname<input name="map['one'].muname"/> map[one].age:<input name="map['one'].age"/> map[two].muname<input name="map['two'].muname"/> map[two].age:<input name="map['two'].age"/> <input type="submit" value="提交"> </form> </h2> </body> </html>

9.1.3、HelloController.java

@RequestMapping("/user") public String sayUser(User u){System.out.println(u); return "index"; }

9.2、参数的乱码问题

9.2.1、web.xml

<!-- 配置 springMVC 编码过滤器 --> <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> <!-- 启动过滤器 --> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <!-- 过滤所有请求 --> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

9.2.2、springmvc.xml

在 springmvc 的配置文件中可以配置,静态资源不过滤:<!-- location 表示路径,mapping 表示文件,** 表示该目录下的文件以及子目录的文件 --> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/scripts/" mapping="/javascript/**"/>

9.2.3、tomcat 下 server.xml

<Connector connectionTimeout="8000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

注意:

<mvc:default-servlet-handler/> <mvc:annotation-driven></mvc:annotation-driven>

10、特殊参数类型转换

10.1、日期类型

10.1.1、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2> <form action="test/date" method="post"> udate:<input type="date" name="udate"/> <input type="submit" value="提交"> </form> </h2> </body> </html>

10.1.2、HelloController.java

@RequestMapping("/date") public String sayUser(String udate){System.out.println(udate); return "index"; }

10.1.3、修改 HelloController.java

@RequestMapping("/date") public String sayUser(Date udate){System.out.println(udate); return "index"; }

SpringMVC 入门

10.2、编写类型转换

10.2.1、实现 Converter 接口

org.springframework.core.convert.converter.Converter;

//S: 表示接受的类型,T:表示目标类型 public interface Converter<S, T> {@Nullable // 实现类型转换的方法 T convert(S source); }

DatetoDate.java

import org.springframework.core.convert.converter.Converter; import org.springframework.util.StringUtils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class DatetoDate implements Converter<String, Date> {@Override public Date convert(String source) {DateFormat format = null; try {if(StringUtils.isEmpty(source)) {throw new NullPointerException("请输入要转换的日期"); } format = new SimpleDateFormat("yyyy-MM-dd"); Date date = format.parse(source); return date; } catch (Exception e) {throw new RuntimeException("输入日期有误"); } } }

10.2.2、配置转换器

springmvc.xml

<!-- 配置转换器工厂 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!-- 给工厂注入一个新的类型转换器 --> <property name="converters"> <array> <!-- 配置自定义类型转换器 --> <bean class="com.tyschool.utils.DatetoDate"></bean> </array> </property> </bean>

10.2.3、引用转换服务

<!-- 引用自定义转换服务 --> <mvc:annotation-driven conversion-service="conversionService2"></mvc:annotation-driven>

10.3、ServletAPI 对象

将下面对象作为参数:

HttpServletRequest HttpServletResponse HttpSession java.security.Principal Locale InputStream OutputStream Reader Writer

10.3.1、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <body> <h2> <form action="test/servletapi" method="post"> <input type="submit" value="提交"> </form> </h2> </body> </html>

10.3.2、HelloController.java

@RequestMapping("/servletapi") public String sayServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){System.out.println(request); System.out.println(response); System.out.println(session); return "index"; }

注意:

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计20803字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中