文章目录
1. SpringMVC中的各种组件
- DispatcherServlet:前端控制器;
用来接收用户的请求,是整个执行请求流程的核心,由它调用其它的组件处理用户的请求,可以降低各组件之间的耦合度;
- HandlerMapping:处理器映射器;
为用户的请求找到handler即处理器,SpringMVC提供了不同的映射器实现了不同的映射方式,如:配置文件方式,实现接口方式、注解方式等;
- Handler:处理器;
开发中主要的业务控制器,由DispatcherSevlet将用户请求转发到handler,由handler进行具体的请求处理;
- HandlerAdapt:处理适配器;
是一种适配器模式的应用,通过扩展适配器,对多类型的处理器进行执行;
- View Resolver:视图解析器;
View Resolver负责将处理结果生成View视图,View Resolver首先根据具体的逻辑视图名解析成物理视图名,即具体的页面地址,生成View视图对象,最后通过View渲染处理将页面展示给用户;
- <mvc:annotation-driven>:自动加载
RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapt(处理适配器),在SpringMVC文件中配置
,或者可以说是Spring配置文件,好像是一样的;
2. @RequestMapping注解
2.1 什么是@RequestMapping
作用:建立请求URL和处理请求方法之间的对应关系;简单来说就是一个url地址,这个注解使用在一个方法上面,作用和@webServlet类似,也是指定请求执行的位置,一个是指定执行方法(也可以放在类上,也是一个地址,只是这个地址是方法上那个地址的上级),一个是指定执行的类,比较理解,好记;
2.2 该注解中的属性介绍
path:
用于指定请求的URL,作用和path一样;method:
用于指定请求的方式;params:
用于限定请求的参数,请求参数是键值对形式;使用如:params={“use”},则表示请求的参数键必须要由use;或者中间放"u!1",表示u值不能为1,反正就是键值对的配置必须是一样的;- headers:用于指定限制请求消息头的条件;
3.请求参数的绑定
3.1 绑定普通数据
以下配置文件
SpingMVC入门里面一样的,不再赘述;下面是直接的方法;
@Controller(value = "testHello")
@RequestMapping(path = "/Test")//这样在其它地方想到这个类,就需要先标注这个类的映射地址,再标注方法的地址才能跳转成功;
public class TestHello {
@RequestMapping(path = "/hello")//就类似于请求映射,就像是创建servlet的时候,servlet需要urlPatterns一样;
public String testhello(String user){
System.out.println("用户"+user);
return "success";//希望它可以返回到一个success.jsp文件显示;所以需要进一步配置;
}
}
在上面绑定这些普通的参数只需要可以在类的方法中写上一样的参数名,和参数类型就可以了;
3.2 绑定属性值
当传入的数值较多时,可以设置一个序列化的类来接收传进来的值,并且这些值会被自动封装到那个被序列化的类里面;
如下:创建一个传值的JSP页面
然后创建好,接受这些值的序列化类;(序列化,必须要实现接口Serializable,如果这个类里面有属性是类属性,那么那个类属性也要序列号)
public class User implements Serializable {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
下面是处理类,可以取到值,取到值其实可以做很多时,但是现在还没学怎么将值传到指定的界面,就先不做多余的操作;
如果序列化中的属性有引用类型,如下:
该UName类中只有属性Mname;
那么在表单中传输数据时该怎么为name属性赋值;如下:
4. 解决接受参数时出现的乱码问题
可以通过一个过滤器解决这个问题,过滤器就是filter,在web.xml里面进行配置就可以;一般如果时Servlet接受参数前都会设置setCharacterEncoding();这里的话Spring提供了一个类,可以过滤器,完全可以用来解决乱码问题
<!--设置过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--设置字符集的初始化,全部设置成UTF-8-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!--拦截所有的值传入-->
<url-pattern>/*</url-pattern>
</filter-mapping>
添加过滤器后之所以web-app标签会报错,是由于版本问题,这个只需要将过滤器放到前端控制器前面就可以了;
5. 请求参数绑定集合类型
在序列化的类里面,如果有一个集合类型的属性,又或者说传入了一个集合类型的属性,那么该怎么接收;
在序列化的类里面就简单的描述一下;
private List<User> user;//如果这就是序列化中的属性
private Map<String,User> Muser;//这是Map集合;
-------------------------------------------------
/User类,假设有个属性 name,age;
下面如果是表单,是怎么写的;
<input type="text" name="List[0].name"/>
<input type="text" name="List[0].age"/>
<!--通过这样传值,就可以直接传入一个List集合-->
<input type="text" name="List[1].name"/>
<input type="text" name="List[1].age"/>
------------------------------------------------
<input type="text" name="map['key'].name"/> //这里map中加键,然后加属性
<input type="text" name="map['key1'].age"/>
6. 自定义类型转换
在SpringMVC中,一般都会有一个自动转换机制,比如:JSP中传输的参数,传输到后台是通过字符串的形式,但是在后台会将一些String类型的数值,直接转换成基本的数值,比如页面的String “100”,传输到后台就可以转换成int 100;
但是问题是有些类型是不能自动转换的,或者说转换了也不一定正确,所以我们需要自定义类型转换;
第一步:想要进行类型转换必须要实现接口Converter;由于是将字符串转换成时间的格式,所以需要用到simpleDateFormat类;
public class StringtoDate implements Converter<String, Date> {
//source是传入的值;
@Override
public Date convert(String source) {
if(source==null){
throw new RuntimeException("运行时异常");
}
//这里标注好了,输入的字符串的格式;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
//这里将字符串转化成自定义的时间类;
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("数据转换时出现错误!");
}
}
}
第二步:在Spring的配置文件中配置类型转换器
<!--配置类型转换器-->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionServiceFactoryBean">
<property name="converters">
<set>
<!--将自己写的类型转换类导入,其它的自带的也没有失效-->
<bean class="cn.dxs.utils.StringtoDate" id="stringtoDate"/>
</set>
</property>
</bean>
---------------------上面的配置也可以写成下面的形式-----------
<!--配置类型转换器-->
<bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionServiceFactoryBean">
<property name="converters" ref="stringtoDate"/>
</bean>
<bean id="stringtoDate" class="cn.dxs.utils.StringtoDate"/>
然后配置完之后,就需要让其生效,可以在SpringMVC的一个mvc:annotation-driven标签里面使用属性conversion-service,并将类型转换器的id值放进去,用来启动类型转换器,因为如果没有这个属性,它默认只是启动另外的像处理映射器和处理适配器等;所以像这个类型转化器自然是需要自己配置的;
注意:这里只是一种转换事例,还可以进行其它的转换,比如:还可以将字符串为2020.3.3转换成日期格式,或者是将其它的什么类型进行转换,但是一般可能就日期需要转换;