1.快速入门
步骤:
1) 建立项目
2) 导入springioc,springweb相关jar包
3) 在/WEB-INF/
下创建web.xml
文件:
4) 创建控制器
什么是springMVC, 它和spring有什么关系?
SpringMVC属于Spring的后续产品,用在基于MVC的表现层开发,类似于structs2框架。
注意:servlet是一个单例
我们如果在web.xml
注册了DispatcherServlet
之后, 系统会自动找/WEB-INF/<servlet-name>-servlet.xml
,注意目录和名字。
<!-- 注册springmvc核心控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
导包:
ModelAndView中,逻辑名称和真实名称
我们在Action中,
public class HelloAction implements Controller {
/**
* 处理请求/业务方法
* @param httpServletRequest
* @param httpServletResponse
* @return
* @throws Exception
*/
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
/**
* ModelAndView表示向视图封装的数据和路径
*/
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", "this my first springmvc application");
//modelAndView.setViewName("/jsp/success.jsp"); // 真实路径
modelAndView.setViewName("success"); // 逻辑名称
return modelAndView;
}
}
我们在DispatcherServlet-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
">
<!-- 这个Action -->
<!-- Action处理类:
class 代表处理类的全路径
name 代表请求路径
-->
<bean name="/hello.action" class="com.ypd.springmvc2.controller.HelloAction"></bean>
<!--
如果Action中熟悉而的是视图逻辑名称,那么视图解析器就必须配置
如果是真实名称,就可选配置
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 路径前缀 -->
<property name="prefix" value="/jsp/"></property>
<!-- 路径后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 前缀+逻辑名+后缀=真实路径 -->
</bean>
</beans>
就是说如果使用逻辑名称:那么我们需要在DispatcherServlet-servlet.xml中配置视图解析器:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 路径前缀 -->
<property name="prefix" value="/jsp/"></property>
<!-- 路径后缀 -->
<property name="suffix" value=".jsp"></property>
<!-- 前缀+逻辑名+后缀=真实路径 -->
</bean>
JSP取得绝对根路径
${pageContext.request.contextPath}
JSP取得绝对路径
映射器 Mapping
什么样的请求交给Action
可以将多个action的映射交给一个<bean>标签为id的Action来处理:
视图解析器
InternalResourceViewResolver
一个Action中可以写多个类似的业务控制方法:增删改查
适配器 Adapter
SimpleControllerHanderAdapter 简单控制器
ParameterizableViewController: 参数视图控制器
AbstractCommandController:抽象的CommandController
原则
1) JavaBean中的属性适合用包装类型即Integer, Double
2) 普通方法中的参数类型适合用于基础类型,即Int, double
SpringMVC 的@InitBinder标签
SpringMVC中,bean定义了Date, double 等类型,如果没有任何处理的话,日期以及double都无法绑定。
解决的方法就是使用Spring MVC的@InitBinder标签。
一般的做法是:BaseController中增加方法initBinder。
并使用注解@InitBinder标注,那么spring mvc在绑定表单之前,都会先注册这些编辑器,当然你如果不嫌麻烦,你也可以单独的写在你的每一个controller中。剩下的控制器都继承该类。
spring自己提供了大量的实现类,诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true));
binder.registerCustomEditor(int.class, new CustomNumberEditor(int.class, true));
binder.registerCustomEditor(int.class, new IntegerEditor());
binder.registerCustomEditor(long.class, new CustomNumberEditor(long.class, true));
binder.registerCustomEditor(long.class, new LongEditor());
binder.registerCustomEditor(double.class, new DoubleEditor());
binder.registerCustomEditor(float.class, new FloatEditor());
}
常用的方法:
// 自定义的转换器
@InitBinder
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)
);
}
如果web.xml
中配置了url-pattern
:
在注解的时候,可以写也可以不写.action
:
但是在请求的时候一定要写:
自定义注解