“SpringMVC:开发基础”的版本间差异

来自Wikioe
跳到导航 跳到搜索
第231行: 第231行:
#: 非负数时,值越小优先级越高;
#: 非负数时,值越小优先级越高;
#: 负数时或未指定时,则指示容器在该servlet被选择时才加载;
#: 负数时或未指定时,则指示容器在该servlet被选择时才加载;
<br/>
<code>DispathcerServlet</code>作为<code>springmvc</code>的中央调度器存在,<code>DispatcherServlet</code>创建时会默认从<code>DispatcherServlet.properties</code>(“Dspring-webmvc-3.2.0.RELEASE.jar”>>“org.springframework.web.servlet”>>“DispatcherServlet.properties”)文件加载<code>springmvc</code>所用的各各组件,如果在<code>springmvc.xml</code>中配置了组件则以<code>springmvc.xml</code>中配置的为准,<code>DispatcherServlet</code>的存在降低了<code>springmvc</code>各各组件之间的耦合度。<br/>
DispatcherServlet.properties:
<syntaxhighlight lang="xml">
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
</syntaxhighlight>


==== Servlet拦截方式 ====
==== Servlet拦截方式 ====

2020年9月25日 (五) 10:54的版本


基础

SpringMVC框架是一个开源的Java平台,属于Spring框架 Spring的一部分,是一个轻量级的web框架。
(Spring框架最初由Rod Johnson撰写,并于2003年6月根据Apache 2.0许可证首次发布。)
SpringMVC在三层架构(表示层UI、业务逻辑层BLL、持久层DAL)中处于表示层。

MVC

MVC框架用于开发灵活和松散耦合的Web应用程序的组件:

  1. 模型(Model):封装了应用程序数据,通常它们将由POJO(Plain Ordinary Java Object简单Java对象,即区别于EJB的普通JavaBean)类组成。
    pojoactionservicedao
  2. 视图(View):负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
    jsppdfexcelframework
  3. 控制器(Controller):负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
    struts2中的filter

架构

  1. 用户发送请求至DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping
  3. HandlerMapping根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  4. DispatcherServlet通过HandlerAdapter调用处理器;
  5. 执行Controller
  6. Controller执行完成返回ModelAndView
  7. HandlerAdaptercontroller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServletModelAndView传给ViewReslover视图解析器;
  9. ViewReslover解析后返回具体View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中);
  11. DispatcherServlet响应用户;

SpringMVC架构.png

依赖包

springMVC属于spring的一个部分,所以需要spring包的支持:

Spring3.2.0的jar包.png

组件

  1. DispatcherServlet(前端控制器):作用接收请求,响应结果,相当于转发器、中央处理器,减少其它组件之间的耦合度;
  2. HandlerMapping(处理器映射器):根据请求的url查找Handler;
  3. HandlerAdapter(处理器适配器):按照特定规则(HandlerAdapter要求的规则)去执行Handler
  4. Handler(Controller:处理器):编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  5. ViewReslover(视图解析器):进行视图解析,根据逻辑视图名解析成真正的视图(view);
  6. View(视图):View是一个接口,实现类支持不同的视图类型(jsppdfexcelframework);

配置文件

配置文件 说明
web.xml
  1. 位置:“WEB-INF\web.xml”;
  2. 用于:配置FilterListenerServlet等及Servlet拦截方式等;(DispatcherServlet
SpringMVC配置文件.png
springmvc.xml
  1. 位置:默认加载WEB-INF/[前端控制器的名字]-servlet.xml,也可以在前端控制器定义处指定加载的配置文件;
  2. 用于:配置HandlerMappingHandlerAdapterHandler(组件扫描)、ViewResolver等;

web.xml示例

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	<!-- Web应用名称 -->
	<display-name>springmvcfirst1208</display-name>
  
	<!-- springmvc前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等)
		如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml)
		 -->
		<init-param>
			<!-- 指定加载的配置文件 -->
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
	</servlet>
	  
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<!-- 
		第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析
		第二种:/,除jsp之外的全拦截。所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析
		使用此种方式可以实现 RESTful风格的url
		第三种:/*,真的全拦截。这样配置不对,使用这种配置,最终要转发到一个jsp页面时,
		仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。
		 -->
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>
	  
	<!-- post乱码过虑器 -->
	<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>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	  
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

springmvc.xml示例

<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.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

	<!-- 可以扫描controller、service、... 这里让扫描controller,指定controller的包 -->
	<context:component-scan
		base-package="cn.itcast.ssm.controller"></context:component-scan>


	<!--注解映射器 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
	<!--注解适配器 -->
	<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> -->

	<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 mvc:annotation-driven默认加载很多的参数绑定方法, 
		比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter 
		实际开发时使用mvc:annotation-driven -->
	<mvc:annotation-driven
		conversion-service="conversionService"></mvc:annotation-driven>


	<!-- 视图解析器 解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置jsp路径的前缀 -->
		<property name="prefix" value="/WEB-INF/jsp/" />
		<!-- 配置jsp路径的后缀 -->
		<property name="suffix" value=".jsp" />
	</bean>

	<!-- 自定义参数绑定 -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 转换器 -->
		<property name="converters">
			<list>
				<!-- 日期类型转换 -->
				<bean
					class="cn.itcast.ssm.controller.converter.CustomDateConverter" />
			</list>
		</property>
	</bean>
</beans>

开发基础

建立项目

Eclipse:Dynamic Web Project

导入依赖包

springmvc独立运行需要的jar:

  1. commons-logging-1.1.1.jar
  2. jstl-1.2.jar
  3. spring-aop-3.2.0.RELEASE.jar
  4. spring-aspects-3.2.0.RELEASE.jar
  5. spring-beans-3.2.0.RELEASE.jar
  6. spring-context-3.2.0.RELEASE.jar
  7. spring-context-support-3.2.0.RELEASE.jar
  8. spring-core-3.2.0.RELEASE.jar
  9. spring-expression-3.2.0.RELEASE.jar
  10. spring-jdbc-3.2.0.RELEASE.jar
  11. spring-orm-3.2.0.RELEASE.jar
  12. spring-test-3.2.0.RELEASE.jar
  13. spring-tx-3.2.0.RELEASE.jar
  14. spring-web-3.2.0.RELEASE.jar
  15. spring-webmvc-3.2.0.RELEASE.jar

配置DispatcherServlet

(关于servlet
web.xml中配置前端控制器:

	<!-- springmvc前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<!-- 指定加载的配置文件 -->
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	  
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.action</url-pattern>
	</servlet-mapping>

其中:

  1. contextConfigLocation:配置springmvc加载的配置文件(配置处理器映射器、适配器等等);
    如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml);
  2. load-on-startup:表示容器启动优先级:
    当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
    非负数时,值越小优先级越高;
    负数时或未指定时,则指示容器在该servlet被选择时才加载;


DispathcerServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties(“Dspring-webmvc-3.2.0.RELEASE.jar”>>“org.springframework.web.servlet”>>“DispatcherServlet.properties”)文件加载springmvc所用的各各组件,如果在springmvc.xml中配置了组件则以springmvc.xml中配置的为准,DispatcherServlet的存在降低了springmvc各各组件之间的耦合度。
DispatcherServlet.properties:

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

Servlet拦截方式

  1. *.action:拦截固定后缀的url(如*.do*.action),由DispatcherServlet进行解析;
    例如:/user/add.action,此方法最简单,不会导致静态资源(jpgjscss)被拦截。
  2. /:除jsp之外的全拦截。所有访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析;
    (此方法可以实现REST风格的url
    例如:/user/add/user/add.action,但是会导致静态文件(jpgjscss)被拦截后不能正常显示,需要特殊处理。
  3. /*:全拦截;
    使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错;

配置 HandlerMapping

所有的映射器都实现HandlerMapping接口:

非注解

简单url映射:

	<!--简单url映射  -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<!-- 对itemsController1进行url映射,url是/queryItems1.action -->
				<prop key="/queryItems1.action">itemsController1</prop>
				<prop key="/queryItems2.action">itemsController1</prop>
				<prop key="/queryItems3.action">itemsController2</prop>
			</props>
		</property>
	</bean>

BeanNameUrlHandlerMapping:

	<!-- 处理器映射器 将bean的name作为url进行查找 ,需要在配置Handler时指定beanname(就是url) 
		所有的映射器都实现 HandlerMapping接口。
	-->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

注解映射器

	<!--注解映射器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  1. 与注解适配器RequestMappingHandlerAdapter搭配使用。

配置 HandlerAdapter

所有处理器适配器都实现HandlerAdapter接口:

非注解

SimpleControllerHandlerAdapter:

	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

HttpRequestHandlerAdapter:

	<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

注解适配器

	<!--注解适配器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
  1. 与注解映射器RequestMappingHandlerMapping搭配使用。

配置 Handler

配置 ViewReslover

Handler开发

View开发

部署与测试

Structs2的区别