SpringMVC与Struts2 的对比及请求参数的绑定

SpringMVC 和 Struts2 的优略分析

共同点:
它们都是表现层框架,都是基于 MVC 模型编写的。
它们的底层都离不开原始 ServletAPI。
它们处理请求的机制都是一个核心控制器。
区别:
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter
Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。
Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便
(JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就可以在需要校验的时候进行校验了。)
Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高。

RequestMapping 注解

@Controller(“accountController”)
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/findAccount")
public String findAccount() {

作用:
用于建立请求 URL 和处理请求方法之间的对应关系。

出现位置:
类上:
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
它出现的目的是为了使我们的 URL 可以按照模块化管理:
例如:
账户模块:
/account/add
/account/update
/account/delete

订单模块:
/order/add
/order/update
/order/delete
第一个 / 的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。
方法上:
请求 URL 的第二级访问目录。
属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
例如:
params = {“accountName”},表示请求参数必须有 accountName
params = {“moeny!100”},表示请求参数中 money 不能是 100。
headers:用于指定限制请求消息头的条件。
注意:
以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。

请求参数的绑定

@RequestMapping("/findAccount")
public String findAccount(Integer accountId) {
System.out.println(“查询了账户。。。。”+accountId);
return “success”; }

支持的数据类型:
基本类型参数:
包括基本类型和 String 类型
POJO 类型参数:
包括实体类,以及关联的实体类
数组和集合类型参数:
包括 List 结构和 Map 结构的集合(包括数组)

使用要求:
如果是基本类型或者 String 类型:
要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
如果是 POJO 类型,或者它的关联对象:
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
如果是集合类型,有两种方式:
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值,使用下标。
给 Map 集合中的元素赋值,使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解实现。

它还可以实现一些数据类型自动转换。
自定义类型转换

第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。

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

public class StringToDateConverter implements Converter<String, Date> {
/**
* 用于把 String 类型转成日期类型
*/
@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("输入日期有误");
} } }


第二步:在 spring 配置文件中配置类型转换器。

spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

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

第三步:在 annotation-driven 标签中引用配置的类型转换服务 

<!-- 引用自定义类型转换器 --> <mvc:annotation-driven
conversion-service="converterService"></mvc:annotation-driven>

请求参数乱码问题

post 请求方式:
在 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> 在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>
get 请求方式:
tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml
配置文件,如下:
<Connector connectionTimeout="20000" port="8080"  protocol="HTTP/1.1" redirectPort="8443"/>
改为:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"   useBodyEncodingForURI="true"/>
如果遇到 ajax 请求仍然乱码,请把:
useBodyEncodingForURI="true"改为 URIEncoding="UTF-8"
即可

ServletAPI对象作为参数

SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
HttpServletRequest 
HttpServletResponse
HttpSession
java.security.Principal
Locale
InputStream 
OutputStream 
Reader 
Writer
我们可以把上述对象,直接写在控制的方法参数中使用。
部分示例代码:
jsp 代码:
<!-- 原始 ServletAPI 作为控制器参数 --> <a href="account/testServletAPI">测试访问 ServletAPI</a>
控制器中的代码:

@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request,   HttpServletResponse response, HttpSession session) {
System.out.println(request);
System.out.println(response);
System.out.println(session);
return "success"; }
发布了43 篇原创文章 · 获赞 2 · 访问量 985

猜你喜欢

转载自blog.csdn.net/study_azhuo/article/details/105583746