一、浏览器发出请求,如url:localhost:8080/test/start.testhtml
二、请求会给到DispatcherServlet(总的控制中心——前端控制器),由它对请求进行派发,前端控制器是须要写在配置文件web.xml中,即前端
<servlet> <servlet-name> test</servlet-name > <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class > <load-on-startup> 1</ load-on-startup> </servlet> <servlet-mapping> <servlet-name> test</servlet-name > <url-pattern> *.test</url-pattern > </servlet-mapping>
因为限制了url的格式,若是请求是已.test结尾的。java
三、前端控制器DispatcherServlet接收到请求,派发给咱们本身的控制器,即具体的控制器,如StartController,如何派发给本身的控制器呢,就须要一个HandlerMapping,即创建了请求与控制器之间的映射,HandlerMapping须要配置在test-Servlet.xml文件中。web
这里说一个比较简单的控制器,SimpleUrlHandlerMapping,配置代码以下:spring
<!-- 基于Url的控制器,比较简单的控制器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name="mappings" > <props> <prop key="start.test" >startController</ prop> <prop key="add_emp.test" >addEmpController</ prop> <!-- UrlFilenameViewController --> <prop key="add.test" >addEmpSuccController</ prop> </props> </property> </bean>
四、转到哪一个具体的控制器,就须要按本身的要求去选择了。浏览器
上面提到的,本身创建的控制器,实现的是简单的Controller接口,以下:restful
<bean id= "startController" class ="test.StartController"></ bean>mvc
经常使用的,以及好用的控制器,在通常项目中常常使用到的。app
用于直接跳转页面的控制器:jsp
ParameterizableViewController,UrlFilenameViewController
配置以下:
(1)须要指定视图名,name ="viewName" value= "login"。
<!-- 参数化的ViewController,咱们不须要本身创建,只须要直接使用就能够了 --> <bean id= "loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController" > <property name="viewName" value="login"/> </ bean>
(2)不须要指定视图名,他是获取Url中的“.test”前面那一段。如“add_emp”
<!-- 使用UrlFilenameViewController,就不须要配置视图名这个过程。 --> <bean id= "addEmpController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController" > </bean>
使用时机:有时候,把全部的jsp文件隐藏在WEB-INF中里面。
进阶,控制器,包括
AbstractController
命令控制器——AbstractCommandController
(3)这个控制器开始,能够自动封装表单参数成Object commandc对象,控制器中只须要。
//自动封装表单参数成command,再强制装换成 Emp对象。
Emp emp=(Emp)command;
//service.addEmp(emp);
System. out.println(emp);
在配置文件中,须要制定Command是一个什么样类型的类。
<!-- 指定command对象是一个什么样的类,此处为员工类test.Emp --> <bean id= "addEmpSuccController" class="test.EmpController"> <property name="commandClass" value="test.Emp"/> </bean>
如此就能够了。
(4)说到这个控制器可以自动封装表单成为咱们须要的Bean,表单中的类型为int或String类型,能够,若是是Date类型,就不能够。
整型正确转行,日期型不正确转化
属性编辑器的问题
如何提供本身的属性编辑器。
DataBind——数据绑定
给数据绑定对象注册一个日期类型的属性编辑器,须要重写初始化绑按期的方法
@Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { // TODO Auto-generated method stub super.initBinder(request, binder); }
自定义为以下所示:
//注册了日期转换的编辑器 @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date. class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd" ), true)); }
表单控制器——SimpleFormController
(5)onSubmit方法,当表单用post方法提交时,会转到这个方法。若是进入一个页面以前有,有数据须要初始化,须要用到referenceData方法。建造一个map模型。
jsp页面须要使用到jstl包。
@Override protected Map referenceData(HttpServletRequest request) throws Exception { Map<String, Object> model= new HashMap<String, Object>(); model.put( "deptList", new String[]{"sales", "manage"}); return model; } /** * onSubmit方法,是当表单提交时处理请求 * 3.0版本后少用。 * 若是使用command控制器,只要 Url符合要求,自动就会提交 * 若是使用Form控制器,只有表单是method="post"时,才会去执行onSubmit方法。 */ @Override protected ModelAndView onSubmit(Object command) throws Exception { Emp emp = (Emp) command; // service.addEmp(emp); System. out.println(emp); return new ModelAndView(getSuccessView() ); }
test-servlet.xml配置文件须要配置以下:
<bean id= "addEmpController" class ="test.EmpFormController"> <property name="commandClass" value="test.Emp" /> <property name="formView" value="add_emp" /> <property name="successView" value="success" /> </bean>
(6)
五、视图解析器。
<!--基于URL的视图解析器, 从逻辑视图名称到真正视图上面的映射 --> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" > <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
跳转到哪一个页面,是根据这里设定的,
六、基于注解的MVC
加入包
当有多个配置文件时,能够在web.xml中配置以下:
<servlet > <servlet-name >mvc</ servlet-name> < servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param > <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名称不变 --> <param-value> /WEB-INF/classes/spring/*.xml </param-value> </init-param > <load-on-startup >1</ load-on-startup> </servlet >
看样子是知道了,虽然是在src/config里面创建配置文件,可是项目运行会把它放到上面的路径中。
下面的配置是重点!
<init-param > <param-name> contextConfigLocation</param-name ><!-- 上下文配置文件的名称不变 --> <param-value> /WEB-INF/classes/spring/*.xml </param-value> </init-param >
在Controller中,添加注解,如
@Controller @RequestMapping("/test" ) public class TestController { @RequestMapping("/start/{name}" ) public String start(@PathVariable String name){ System. out.println(name); return "start" ; } }
上面使用了两个注解。看到了吧
在servlet.xml中,首先,须要扫描包含控制器的包,找到这些注解。
<!-- 一、进行广泛扫描 --> <context:component-scan base-package="test.controller" />
<!-- 二、视图解析器,使用 jsp或者jstl 最适合使用这个类。基于Resources的解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/page/"/> <property name="suffix" value=".jsp"/> </bean>
详细讲 @RequestMapping ("/start" )
方法级别(必定要有),如上http://localhost:8080/@mvc/start.do
类级别,至关于根路径http://localhost:8080/@mvc/test/start.do
restfull,Url层面上的。