SpringMVC是一个表示层框架,搭建真实环境
SpringMVC的使用方法:注解和配置。(注解为主)
SpringMVC是Spring3.x的一个模块,其实就是用MVC提供的表示层框架。
SpringMVC对视图组件没有必然要求,不一定要使用jsp,struts1,struts2规定了只能用jsp。
SpringMVC的映射器对象,相当于struts1 的ModuleConfig
SpringMVC的转向:可以自动的封装结果数据。相当于struts1的ActionForward.
SpringMVC优点:
使用简单,学习成本低
容易写出性能高的程序
灵活性好
结构清晰
编码效率:jsp+servlet—> struts1à SpringMVCàstruts2(越来越高)
执行效率:jsp+servlet—> struts1à SpringMVCàstruts2(越来越低)
Struts1:编码效率低,执行效率高,配置量大,结构清晰
Struts2:编码效率高,运行效率低,需要维护ognl
表示层框架:接收用户请求,封装请求数据,将结果转发到对应的jsp页面。
SpringMVC的(开发)环境搭建:
1、 创建web项目
2、 导入jar包(dist下的所有jar包)基本的jar:org.springframework.aop-3.0.5.RELEASE.jar :与Aop 编程相关的包
org.springframework.beans-3.0.5.RELEASE.jar :提供了简捷操作bean 的接口
org.springframework.context-3.0.5.RELEASE.jar :构建在beans 包基础上,用来处理资源文件及国际化。
org.springframework.core-3.0.5.RELEASE.jar :spring 核心包
org.springframework.web-3.0.5.RELEASE.jar :web 核心包,提供了web 层接口
org.springframework.web.servlet-3.0.5.RELEASE.jar :web 层的一个具体实现包,DispatcherServlet也位于此包中。
建议在搭建环境中导入spring3.0 的所有jar 包(所有jar 包位于dist 目录下)。
3、 编写配置文件,SpringMVC的中央控制器DispatcherServlet,和struts1配置ActionServlet一样。在web.xml中配置
<servlet>
//spmvc命名和springMVC的主配置文件名相关
< servlet-name>spmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<servlet>
<servlet-mapping>
< servlet-name>spmvc</servlet-name>
< url-pattern >*.do</url-pattern>
</servlet-mapping>
4、 配置SpringMVC的主配置文件:spmvc-servlet.xml servlet-name 作为前缀,文件放在WEB-INF下
从springmvc到struts2使用的tomcat版本至少是6.0及以上。
spmvc-servlet.xm文件中的配置信息
<beans>
<bean id = "simpleUrlHandlerMapping"
class ="org.springframework.web.servlet.
handler. SimpleUrlHandlerMapping">
<property name ="mappings">
<props>
<prop key ="/login.do">loginControl</prop>
</props>
</property>
</bean>
<bean id ="loginControl"
class ="com.asm.spmvclogin"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
SpringMVC的流程:
1、Tomcat一启动,读取web.xml,
2、根据web.xml的配置创建DispatchServlet对象,
3、执行该Servlet对象执行init()方法,读取整个springmvc的配置文件(spmvc-servlet.xml)。
4、一读取主配置文件spmvc-servlet.xml创建WebFactory(web 工厂),
5、在web工厂中创建以下几个对象:
创建分派器(也叫映射器)对象SimpleUrlHandlerMapping:将请求交给对应的Action,分派器有个属性 mappings,是一个props,key和value都是String类型
创建处理请求的Action对象
创建视图定位器对象InternalResourceViewResolver:给转向信息加上前缀和后缀
通过配置方式登录示例:
1、发现*.do请求,交给DispatcherServlet处理
2、截取请求路径,截取结果包含.do(/login.do)
3、到web工厂中找到分派器,把请求交给分派器
4、分派器到分派器对象的mappings属性的props配置中找key(/login.do)对应的value.(loginControl)
5、根据value(loginControl)取出id标识为loginControl的Action对象。(实现了Controller的接口的类标识)
6、该Action类实现了handleRequest()方法(handleRequest是接口中的方法)
handleRequest()方法中:
从request中拿到请求参数,创建业务层对象,调用业务对象的方法。
//封装转向信息
ModelAndView mav2= new ModelAndView("failure");
mav2.addObject("username", username); //封装结果信息
mav2.addObject("password", password);
return mav2;
ModelAndView:封装转向信息,也封装结果数据。
ModelAndView中有个map ,
mavl.addObject(“username”,username);// key是String类型,value是Object类型。
7、DispatcherServlet的作用:
1、 从ModelAndView中拿出存储的数据,放到request内置对象中(key作为属性名,value作为属性值)
2、 从ModelAndView中拿到转向字符串,找到视图定位器,加上前缀和后缀,找到确定的转向页面
8、结果显示:
在加上前缀和后缀指定位置的failure.jsp页面中:使用EL表达式直接输出登录失败的用户名和密码:${username}, ${password}
使用注解SpringMVC(annocation)完成登录:
在web.xml中的配置
<servlet>
//命名和主配置文件名相关,主配置文件名为:spring-servlet.xml
< servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<servlet>
<servlet-mapping>
< servlet-name>spring</servlet-name>
< url-pattern >*.do</url-pattern>
</servlet-mapping>
//配置监听器,在该监听器中创建BeanFactory
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 指定Spring ,Bean的配置文件所在目录(业务层对象在这个bean中通过IOC创建)。默认配置在WEB-INF目录下 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml
</param-value>
</context-param>
</web-app>
Tomcat一启动:
1、 先创建Listener监听器对象
2、 一创建监听器对象对application的状态监听,创建Application对象时,调用监听器的contextInitialized()方法
3、 在contextInitialized()方法中通过application内置对象拿到初始化参数信息创建BeanFactory(BeanFactory:处理业务)
4、 创建DispatcherServlet对象,调用init()方法,读取springmvc主配置文件信息 spring-servlet.xml
5、 根据springmvc的主配置文件spring-servlet.xml
创建webFactory(web 工厂:处理请求)
6、 创建视图定位器对象;
创建分派器对象(分派器也叫映射器)
分派器自动扫描项目,到指定的包下找Action类(Action类有被@Controller注解标识),自动创建Action对象。
7、 在Action类中找@Resource(name=”loginService”):一创建Action对象,就自动到BeanFactory中找到bean中id为loginService的对象,自动注入业务层对象。
Spring-servlet.xml(springMVC主配置文件中的信息)
<!-- 启用spring mvc 注解 -->
<context:annotation-config />
<!-- 设置使用注解的类所在的jar包 -->
<context:component-scan base-package= "com.asm"> </context:component-scan>
<!-- 完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.
annotation.AnnotationMethodHandlerAdapter" />
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
@Controller:注解标识,标识这个类就是Action(用在类上)
@RequestMapping("/login.do") // 请求url地址映射,类似Struts的action-mapping(用在方法上)
@Resource(name=”loginService”):一创建Action对象,就自动到BeanFactory中找到bean中id为loginService对象,自动注入业务层对象。(用在属性上)
@RequestParam(value="username")String name:一般用于当表单的请求参数名和方法中形参不一致时,将指定的请求参数赋值给方法中的形参
可以简写为:@RequestParam("username")(用在参数上)
SpringMVC注解方式登录示例:
1、 *.do请求,交给DispatcherServlet处理
2、 截取请求路径,/login.do
3、 到web工厂中找到分派器,把请求交给分派器
4、 分派器找到Action类(@Controller标识的类),根据注解@requestMapping找到对应的方法
5、 找到对应方法后,收集表单数据:
如果方法的形参名字和表单中参数名一样,会自动设定
如果不一样就通过注解设定@RequestParam(value="username")String name//把表单中参数名为username的参数值设到此方法中的name参数中。
需要传送数据的时候,在方法中也要写上request参数,就会自动注入request内置对象
然后再 调用request.setAttribute();方法,设定属性名和属性值
6、 返回字符串,success
到WebFactory中拿到视图解析器,加上前缀和后缀,完成转向。
7、 在jsp页面中通过EL表达式输出存在request中的属性值
${username}
SpringMVC对Action类没有要求,通过注解将请求映射到方法上面。返回值可以为String,也可以为ModelAndView.不能无返回值。
知识点解析:
表单中获取的参数类型都是String类型
当前方法中的形参age为int类型,SpringMVC完成自动转换。
return new ModelAndView(“success”);//默认为转发,需要用到视图解析器加上前缀和后缀
如果需要重定向(不需要使用视图解析器):
return new ModelAndView(new RedirectView (“./index.jsp”));// 重定向的第一种方法
return new ModelAndView(“redirect: ../index.jsp”));//重定向的第二种方法
引入ActionForm User收集表单数据
表单bean,不需要继承任何的类,和普通的bean一样属性私有构造方法公有。
pubic String testLogin3(User user){}
1、创建User对象