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对应三层架构
**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
注意:
创建项目的时候速度会非常慢(外国的服务器你懂得),因此我们可以直接下载archetype-catalog.xml(https://search.maven.org/search?q=a:archetypes-catalog),把这个xml下载下来放到本地的maven目录中,添加一个参数archetypeCatalog=internal就可以了。
2.2、导入应用到的jar包
pom.xml
代码语言:javascript复制<?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>
2.3、配置前置控制器
web.xml
代码语言:javascript复制<!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
代码语言:javascript复制<?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
代码语言:javascript复制<%@ 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
代码语言:javascript复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
2.6、创建控制器
HelloController.java
代码语言:javascript复制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、案例执行过程
3.2、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)。通过配置该元素,我们可以替代注解处理器和适配器的配置。
代码语言:javascript复制<!-- <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>
可替换为:
代码语言:javascript复制<mvc:annotation-driven></mvc:annotation-driven>
5、RequestMapping注解详解-上
5.1、RequestMapping源码分析
代码语言:javascript复制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,表示一级目录,类上不写默认为根目录,如果书写可以按模块儿语管理。
代码语言:javascript复制@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
代码语言:javascript复制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
代码语言:javascript复制<%@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}失效?
解决方式一:
代码语言:javascript复制<%@page isELIgnored="false"%>
解决方式二:
代码语言:javascript复制<?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
代码语言:javascript复制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
代码语言:javascript复制<%@ 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
代码语言:javascript复制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
代码语言:javascript复制<%@ 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
代码语言:javascript复制@RequestMapping("say")
public String sayName(String uname){
System.out.println(uname " good bye");
return "index";
}
7.1.2、login.jsp
代码语言:javascript复制<%@ 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中,表单提交的请求参数与控制器中的方法进行了绑定。
7.3、参数支持的数据类型
基本数据类型参数:
整型、浮点型、字符型、字符串型、布尔型
POJO类型参数:
Javabean(实体类)
数组和集合类型参数:
Array、List、Set、Map等
7.4、参数使用方式
基本数据类型参数:
参数名称与控制器方法中形参的名称保持完全一致。
POJO类型参数:
参数名称和POJO属性名称完全一致,并且与控制器方法中形参类型是POJO类型。
数组和集合类型参数:
第一种:
集合类型的请求参数必须在pojo中,在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值,使用下标。
给 Map 集合中的元素赋值,使用键值对。
第二种:
的请求参数是 json 格式数据。需要借助一个注解实现。
注意:
参数的自动类型转换:
在org.springframework.core.convert.support 包下的内置转换器:
代码语言:javascript复制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
代码语言:javascript复制 @RequestMapping("/sayPerson")
public String sayPerson(String uname,int age){
System.out.println(uname "," age);
return "index";
}
index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制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
代码语言:javascript复制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
代码语言:javascript复制@RequestMapping("/manager")
public String sayManager(Manager m){
System.out.println(m ":" m.getQx());
return "index";
}
8.2.3、index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制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
代码语言:javascript复制<%@ 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
代码语言:javascript复制 @RequestMapping("/user")
public String sayUser(User u){
System.out.println(u);
return "index";
}
9.2、参数的乱码问题
9.2.1、web.xml
代码语言:javascript复制<!-- 配置 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
代码语言:javascript复制在 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
代码语言:javascript复制<Connector connectionTimeout="8000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
URIEncoding="UTF-8"/>
注意:
代码语言:javascript复制 <mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
10、特殊参数类型转换
10.1、日期类型
10.1.1、index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制@RequestMapping("/date")
public String sayUser(String udate){
System.out.println(udate);
return "index";
}
10.1.3、修改HelloController.java
代码语言:javascript复制 @RequestMapping("/date")
public String sayUser(Date udate){
System.out.println(udate);
return "index";
}
10.2、编写类型转换
10.2.1、实现Converter接口
org.springframework.core.convert.converter.Converter;
代码语言:javascript复制//S:表示接受的类型,T:表示目标类型
public interface Converter<S, T> {
@Nullable
//实现类型转换的方法
T convert(S source);
}
DatetoDate.java
代码语言:javascript复制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
代码语言:javascript复制<!--配置转换器工厂-->
<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、引用转换服务
代码语言:javascript复制<!--引用自定义转换服务-->
<mvc:annotation-driven conversion-service="conversionService2"></mvc:annotation-driven>
10.3、ServletAPI对象
将下面对象作为参数:
代码语言:javascript复制HttpServletRequest
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream
OutputStream
Reader
Writer
10.3.1、index.jsp
代码语言:javascript复制<%@ 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
代码语言:javascript复制 @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";
}
注意:
代码语言:javascript复制<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>