Spring、SpringMVC、Hibernate配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!--web应用名称-->
<display-name>webName< /display-name>
<!--配置spring容器-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
<!--监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--
ContextconfigLocation配置springmvc加载的配置文件适配器、处理映射器等
-->
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<!--
/,所有访问都由DispatcherServlet进行解析
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<!--
.action访问以.action结尾的 由DispatcherServlet进行解析
-->
<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>
<!--自定义xss请求过滤器-->
<filter>
<filter-name>XssSqlFilter</filter-name>
<filter-class>com.gt.filters.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XssSqlFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<!-- 404错误拦截 -->
<error-page>
<error-code>404</error-code>
<location>/error404.jsp</location>
</error-page>
<!-- 500错误拦截 -->
<error-page>
<error-code>500</error-code>
<location>/error500.jsp</location>
</error-page>
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list>
</web-app>
public class XssFilter implements Filter {
FilterConfig filterConfig = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response ;
String uri = req.getRequestURI().toLowerCase().trim() ;
// if( uri.startsWith("/ad/ad/") ) { //公告提交不做处理
// chain.doFilter(request, response) ;
// } else {
//对请求进行拦截,防xss处理
chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request), response);
// }
}
@Override
public void destroy() {
this.filterConfig = null;
}
}
Filter介绍
常见应用场合:
- 认证Filter
- 日志和审核Filter
- 图片转换Filter
- 数据压缩Filter
- 密码Filter
- 令牌Filter
- 触发资源访问事件的Filter
- XSLT Filter
- 媒体类型链Filter
Filter必须
实现javax.servlet.Filter接口
,在该接口中定义了三个方法:
(1) void init(FilterConfig config):用于完成Filter的初始化。FilteConfig用于访问Filter的配置信息。
(2) void destroy():用于Filter销毁前,完成某些资源的回收。
(3) void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能的核心方法,该方法就是对每个请求及响应增加额外的处理。该方法实现对用户请求request进行预处理,也可以实现对服务器响应response进行后处理—它们的分界线为是否调用了chain.doFilter(request,response),执行该方法之前,即对用户请求request进行预处理,执行该方法之后,即对服务器响应response进行后处理。
Servlet通常只配置一个URL,而Filter可以同时配置多个请求的URL
<filter>配置
- <filter-name>用来定义过滤器的名称,该名称在整个程序中都必须唯一。
- <filter-class>元素指定过滤器类的完全限定的名称,即Filter的实现类。
- <init-param>为Filter配置参数,与<context-param>具有相同的元素描述符<param-name>和<param-value>。
- <filter-mapping>元素用来声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL 模式。这个过滤器的和<filter-mapping>必须具有相同的<filter-name>,指定该Filter所拦截的URL。过滤是按照部署描述符的<filter-mapping>出现的顺序执行的
Servlet介绍
Servlet是个特殊的java类,继承于HttpServlet。
- 客户端通常只有GET和POST两种请求方式,Servlet为了响应则两种请求,必须重写doGet()和doPost()方法
- 大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写
service()
方法即可响应客户端的所有请求
HttpServlet有两个方法
- init(ServletConfig config):创建Servlet实例时,调用该方法的初始化Servlet资源
- destroy():销毁Servlet实例时,自动调用该方法的回收资源
通常无需重写init()和destroy()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法,如果重写了init()方法,应在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完成某些资源的回收,比如关闭数据库连接,才需要重写destory方法()。
创建Servlet实例有两个时机:
- 客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet。
- Web应用启动时立即创建Servlet实例,即load-on-start Servlet。
<servlet>配置
- 需要配置<servlet>和<servlet-mapping>。
- <servlet>用来声明一个Servlet。<icon>、<display-name>和<description>元素的用法和<filter>的用法相同。
- <init-param>元素与<context-param>元素具有相同的元素描述符,可以使用<init-param>子元素将初始化参数名和参数值传递给Servlet,访问Servlet配置参数通过ServletConfig对象来完成
java.lang.String.getInitParameter(java.lang.String name):用于获取初始化参数
- <description>、<display-name>和<icon>
- <description>:为Servlet指定一个文本描述
- <display-name>:为Servlet提供一个简短的名字被某些工具显示
- <icon>:为Servlet指定一个图标,在图形管理工具中表示该Servlet
- <servlet-name>、<servlet-class>和<jsp-file>元素
- <servlet-name>用来定义servlet的名称,该名称在整个应用中必须是惟一的
- <servlet-class>用来指定servlet的完全限定的名称
- <jsp-file>用来指定应用中JSP文件的完整路径。这个完整路径必须由/开始
- <load-on-startup>
如果load-on-startup元素存在,而且也指定了jsp-file元素,则JSP文件会被重新编译成Servlet,同时产生的Servlet也被载入内存。<load-on-startup>的内容可以为空,或者是一个整数。这个值表示由Web容器载入内存的顺序 - <servlet-mapping>
- <servlet-name>:Servlet的名字,唯一性和一致性,与<servlet>元素中声明的名字一致
- <url-pattern>:指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。<servlet-mapping>将URL模式映射到某个Servlet,即该Servlet处理的URL
Listener介绍
常用的Web事件接口有如下几个:
- ServletContextListener:用于监听Web Application的启动和关闭;
- ServletContextAttributeListener:用于监听ServletContext范围(Application)内属性的改变;
- ServletRequestListener:用于监听用户的请求;
- ServletRequestAttributeListener:用于监听ServletRequest范围(Request)内属性的改变;
- HttpSessionListener:用于监听用户session的开始和结束;
- HttpSessionAttributeListener:用于监听HttpSession范围(Session)内属性的改变
<listener>主要用于监听Web应用事件
springmvc.xml整合hibernate
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--启动aop功能-->
xmlns:aop="http://www.springframework.org/schema/aop"
<!--启用临时事物-->
xmlns:tx="http://www.springframework.org/schema/tx"
<!--p标签-->
xmlns:p="http://www.springframework.org/schema/p"
<!--启用自动扫描或者注解配置-->
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-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/tx
http://www.springframework.org/schema/tx/spring-tx-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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!--开启注解-->
<context:annotation-config />
<!--解决了@Controller注解的使用前提配置-->
<mvc:annotation-driven />
<!--自动扫描Controller,对包进行扫描-->
<context:component-scan base-package="com.test.*" />
<!--开启基于@AspectJ切面注解-->
<aop:aspectj-autoproxy/>
<!--创建一个beanName的实例
scope属性值:
singleton:默认类型,单例,只会创建一个对象,下次就不会创建了
prototype:每次对该bean的请求都会创建一个新的实例
request:从前台访问后一次,就是一次的request,这是创建出一个对象,请求结束后,对象等着垃圾回收机制回收它
session:从前台访问后一次,浏览器不关闭,如果调用其它方法的时候,还会调用的同一个对象
-->
<bean id="beanName" class="beanName的类全名" scope="属性值" init-method="初始化调用的方法名" destroy-method="销毁时调用的方法名">
<property name = "bean类中的属性名称" ref="要引用的bean名称"/>
<property name = "bean类中的属性名称" value="要制定的属性值"/>
<property name = "bean类中的属性名称" ref="要引用的bean名称">
<!--创建匿名内部类赋值,这个bean无法被外界访问-->
<bean class="bean的类全名"/>
</property>
</bean>
<!--拦截器-->
<mvc:interceptors>
<bean class="拦截器路径">
<!-- <mvc:interceptor>
拦截所有路径的请求 包括子路径
<mvc:mapping path="/**"/>
<bean class="拦截器"></bean>
</mvc:interceptor> -->
</bean>
</mvc:interceptors>
<!--hibernate相关配置-->
<!-- 配置hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<!-- 注入数据源 相关信息看源码 -->
<property name="dataSource" ref="dataSource" />
<!-- hibernate配置信息 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<!-- 设置二级缓存插件EHCache的Provider类-->
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.region_prefix">encache_</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>
<prop key="hibernate.generate_statistics">false</prop>
</props>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置事务增强处理Bean,指定事务管理器 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<!-- 配置详细事务处理语义
propagation属性:
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务
-->
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
<tx:method name="load*" propagation="SUPPORTS" read-only="true" />
<!-- 其他采用默认事务方式 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut id="transactionPointcut"
expression="execution(* com.test.service..*Impl.*(..))" />
<!-- 指定在txAdvice切入点应用txAdvice事务增强处理
pointcut-ref:切点名称
advice-ref:事务管理器名称
-->
<aop:advisor pointcut-ref="transactionPointcut"
advice-ref="transactionAdvice" />
<!--通知-->
<aop:before pointcut-ref="切点名称" method="切面中用做 前置 通知的方法名"/>
<aop:after-returning pointcut-ref="切点名称" method="切面中用做 后置 通知的方法名"/>
<aop:after-throwing pointcut-ref="切点名称" method="切面中用做 异常 通知的方法名"/>
<aop:after pointcut-ref="切点名称" method="切面中用做 最终 通知的方法名"/>
<aop:around pointcut-ref="切点名称" method="切面中用做 环绕通知的方法名"/>
</aop:config>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 使用前缀和后缀 -->
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
如果在配置前端控制器时拦截了所有的请求,不做特殊处理就会导致部分静态资源无法使用。如果是这种情况就可以使用下面的配置来访问静态资源文件
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/imgdata/**" location="/imgdata/" />
<!-- 加载资源文件 -->
<context:property-placeholder location="/WEB-INF/classes/xxx.properties"/>