1、springmvc请求过程
2、开发springmvc的一般流程
1 )导入开发需要的jar包
com.springsource.javax.servlet.jsp.jstl-1.1.2.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.taglibs.standard-1.1.2.jar
org.springframework.aop-3.0.0.RELEASE.jar
org.springframework.asm-3.0.0.RELEASE.jar
org.springframework.beans-3.0.0.RELEASE.jar
org.springframework.context.support-3.0.0.RELEASE.jar
org.springframework.context-3.0.0.RELEASE.jar
org.springframework.core-3.0.0.RELEASE.jar
org.springframework.expression-3.0.0.RELEASE.jar
org.springframework.web.servlet-3.0.0.RELEASE.jar
org.springframework.web-3.0.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.taglibs.standard-1.1.2.jar
org.springframework.aop-3.0.0.RELEASE.jar
org.springframework.asm-3.0.0.RELEASE.jar
org.springframework.beans-3.0.0.RELEASE.jar
org.springframework.context.support-3.0.0.RELEASE.jar
org.springframework.context-3.0.0.RELEASE.jar
org.springframework.core-3.0.0.RELEASE.jar
org.springframework.expression-3.0.0.RELEASE.jar
org.springframework.web.servlet-3.0.0.RELEASE.jar
org.springframework.web-3.0.0.RELEASE.jar
2)配置web.xml配置文件(在web.xml文件中配置DispatcherServlet)
例子:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 配置springmvc的分发器servlet -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过初始化参数指定配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:action-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
3)创建contorller(控制器)
例子:
继承AbstractController类并复写handleRequestInternal()方法
public class HelloController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("HomeController-------" + req.getParameter("name"));
//向request域中添加东西 req.setAttribute("msg", "hello " + req.getParameter("name"));
return new ModelAndView("home","msg","hello " + req.getParameter("name"));//home为逻辑名
}
}
4)创建spring配置文件/WEB-INF/action-servlet.xml(此路径为默认路径)
配置视图解析器
配置控制器
其中控制器会返回一个ModelAndView的对象,然后再经过DispatcherServlet调用ViewResolver视图解析器进行解析(怎么解析的呢? 前缀名 + 返回的逻辑名 + 后缀名 解析完成后跳转到相应的资源(一般为jsp页面))
其中控制器会返回一个ModelAndView的对象,然后再经过DispatcherServlet调用ViewResolver视图解析器进行解析(怎么解析的呢? 前缀名 + 返回的逻辑名 + 后缀名 解析完成后跳转到相应的资源(一般为jsp页面))
例子:
<?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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!-- bean名url处理器映射:默认 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<!-- 优先级 -->
<property name="order" value="3"></property>
</bean>
<!-- 简单url处理器映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<map>
<entry key="/abc.action" value="HelloController"></entry>
<entry key="/save.action" value="HelloController"></entry>
</map>
</property>
<property name="order" value="2"></property>
</bean>
<!-- 控制器类名处理器映射 -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="order" value="4"></property>
</bean>
<!-- 配置控制器HomeController -->
<bean id="homeController" name="/home.action" class="cn.springmvc.controller.HelloController"></bean>
<!-- 命令控制器 -->
<bean name="/mycommand.action" class="cn.springmvc.controller.HelloController"></bean>
<!-- 表单控制器 -->
<bean name="/myform.action" class="cn.itcast.springmvc.controller.MyFormController">
<!-- personForm为逻辑名 -->
<property name="formView" value="personForm"></property>
<!-- success为逻辑名 -->
<property name="successView" value="success"></property>
</bean>
<!-- 向导表单控制器 -->
<bean name="/mywizardform.action" class="cn.itcast.springmvc.controller.MyWizardFormController">
<!-- 配置表单页面 -->
<property name="pages">
<list>
<value>/wizard/1</value>
<value>/wizard/2</value>
<value>/wizard/3</value>
</list>
</property>
</bean>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 /WEB-INF/jsps/home.jsp-->
<property name="prefix" value="/WEB-INF/jsps/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
首先,所有的请求都会经过DispatchserServlet处理,然后通过HandlerMapping(处理机映射)把具体的请求分发具体的controller(控制器)上,然后控制器执行默认方法,执行完后返回一个对象(也是就是ModelAndView类),然后ModelAndView将请求返回给DispatcherSevlet在把这个具体的工作交个一个专门的组件去处理结果,也就是ViewResolver(视图解析器--框架提供)去解析,解析完成后生成一个view(一般为jsp页面),最后将请求返回给客户端浏览器
三种Controller。
CommandController(命令控制器)
需要继承AbstractCommandController类,并重写handle方法
* 通过构造方法注册命令类和命令名称,如:
public MyCommandController(){
//注册命令类
this.setCommandClass(Person.class);
//命令名称
this.setCommandName("person");
}
public class PersonCommandController extends AbstractCommandController {
public PersonCommandController(){
//注册命令类
this.setCommandClass(Person.class);
this.setCommandName("person");
}
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
Person p = (Person) command;
System.out.println(p.toString());
return new ModelAndView("index");
}
FormController(表单控制器)
封装表单中的数据
需要继承SimpleFormController类,并重写doSubmitAction方法
* 通过构造方法注册命令类和命令名称,如:
public MyFormController(){
this.setCommandClass(Person.class);
this.setCommandName("person");
}
* 在spring配置文件中对表单控制器进行配置,如:
<!-- 表单控制器 -->
<bean id="myFormController" name="/form.action" class="cn.itcast.controller.MyFormController">
<property name="successView" value="success"/>
<property name="formView" value="personForm"/>
</bean>
public class PersonFormController extends SimpleFormController {
//注册命令对象
public PersonFormController() {
this.setCommandClass(Person.class);
this.setCommandName("person");
}
protected void doSubmitAction(Object command) throws Exception {
Person p = (Person) command;
System.out.println(p.toString());
}
}
WizardFormController(向导表单控制器)
* 需要继承AbstractWizardFormController类,并重写processFinish方法
*通过构造方法注册命令类和命令名称,如:
public MyWizardFormController(){
this.setCommandClass(Person.class);
this.setCommandName("person");
}
* 在spring配置文件中对向导表单控制器进行配置,如:
<!-- 向导表单控制器 -->
<bean name="/wizard.action" id="myWizardFormControlle" class="cn.itcast.controller.MyWizardFormController">
<property name="pages">
<list>
<value>test/1</value>
<value>test/2</value>
<value>test/3</value>
</list>
</property>
</bean>
public class MyWizardFormController extends AbstractWizardFormController {
public MyWizardFormController() {
this.setCommandClass(Person.class);
this.setCommandName("person");
}
//处理完成
protected ModelAndView processFinish(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
Person p = (Person) command;
System.out.println(p.toString());
return new ModelAndView("index");
}
//处理取消
protected ModelAndView processCancel(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
return new ModelAndView("wizard/jPersonBaseInfo");
}
}
其中向导表单控制器用的一般不多,一般用在例如:上一页,下一页,之类的页面中
如:
<form action="mywizardform.action" method="post">
<table>
<tr>
<td>age:</td>
<td><input type="text" name=“age”/></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" name="_target1" value="上一步" />
<input type="submit" name="_cancel" value="取消" />
<input type="submit" name="_finish" value="完成" />
</td>
</tr>
</table>
</form>
三个控制器的相同点:都需要经过构造函数注册命令类