如何整合S2SH(三)

来源:互联网 发布:实时天气预报软件电脑 编辑:程序博客网 时间:2024/06/03 13:26

第七步(解决中文乱码问题):

(与s1sh一样)
1.思路1:自己配置过滤器,同时在web.xml中做如下配置:

    <filter>        <filter-name>MyFilter</filter-name>        <filter-class>com.ssh.web.filter.MyFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>MyFilter</filter-name>        <url-pattern>/*</url-pattern>           </filter-mapping>

2.思路2:使用spring框架提供的处理中文乱码的过滤器,在web.xml中添加如下配置:

<!-- spring提供的编码过滤器 -->    <filter>        <filter-name>encoding</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>encoding</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

第八步(S1SH整合特别说明):

1.Spring可以启用注解的方式来配置属性:
首先,重新在applicationContext.xml中配置bean:

<!-- 配置dao --><bean id="userDao" class="com.ssh.dao.impl.UserDaoImpl"/><!-- 配置service --><bean id="userService" class="com.ssh.service.impl.UserServiceImpl"/><!-- 配置struts2 --><bean id="login" class="com.ssh.action.LoginAction"/>

其次,在UserDaoImpl.java、UserServiceImpl.java、LoginAction.java中做如下修改:
UserDaoImpl.java:

@Autowiredpublic void setSessionFactory(@Qualifier("sessionFactory")SessionFactory sessionFactory) {        this.sessionFactory = sessionFactory;}

UserServiceImpl.java:

@Autowiredpublic void setUserDao(@Qualifier("userDao")UserDao userDao) {        this.userDao = userDao;}

LoginAction.java:

@Autowiredpublic void setUserService(@Qualifier("userService")UserService userService) {        this.userService = userService;}

然后,在applicationContext.xml中添加如下配置:
你可以按照这种方式:

<!-- 启用注解扫描 -->    <context:annotation-config/>

你也可以按照这种方式:

<!-- 扫描有注解的文件   back-package包路径 --><context:component-scan base-package="com.ssh"/>

测试一下,测试通过


2.2. ssh整合的时候,如何解决懒加载问题?
解决方式与如何整合s1sh的一样,同样的对于对象User与Group,是多对一的映射,从多方导航到一方,不会出现懒加载这种现象,你可以通过在mainFrame.jsp中作如下测试(前提是你已经为User分配了一个组):

<body>    welcome,${user.name },你所在的组是:${user.group.name}</body>

Spring专门提供了openSessionView的方法来解决懒加载,需要在web.xml中做如下配置:

<!-- 将HibernateSession开关控制配置在Filter,保证一个请求一个session,并对lazy提供支持 -->    <filter>        <filter-name>OpenSessionInView</filter-name>        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>        <init-param>            <param-name>singleSession</param-name>            <param-value>true</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>OpenSessionInView</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

第九步(登录拦截器):

(参考贾琳SSH框架总结)
首先,自定义一个拦截器CheckLogin.java:

package com.ssh.inreceptor;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.ssh.entity.User;public class CheckLogin extends AbstractInterceptor {    @Override    public String intercept(ActionInvocation invocation) throws Exception {        // TODO Auto-generated method stub        ActionContext ctx = invocation.getInvocationContext();        Map session = ctx.getSession();        User user = (User) session.get("user");        if(user!=null){            return invocation.invoke();        }        return "checkLoginFail";    }}

其次,在struts.xml中做出如下修改:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <!-- 指定Web应用的默认编码,相当于调用request的setCharacterEncoding方法 -->    <constant name="struts.i18n.encoding" value="UTF-8" />    <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->    <constant name="struts.serve.static.browserCache" value="false" />    <!-- 当Struts2的配置文件修改后,系统是否自动重新加载配置文件,默认值为false(生产环境下使用),开发阶段最好打开 -->    <constant name="struts.configuration.xml.reload" value="true" />    <!-- 开发模式下使用,这样可以打印出更详细的日志信息 -->    <constant name="struts.devMode" value="true" />    <!-- 默认的视图主题 -->    <constant name="struts.ui.theme" value="simple" />    <!-- 把Action对象交给Spring创建和管理 -->    <constant name="struts.objectFactory" value="spring" />    <!-- Struts2处理的请求后缀,默认值是action -->    <constant name="struts.action.extension" value="do" />    <!-- 修改一 -->    <package name="abstract_struts" abstract="true" extends="struts-default"         namespace="/">        <interceptors>            <interceptor name="checkLogin" class="com.ssh.interceptor.CheckLogin"/>            <interceptor-stack name="checkLoginStack">                <interceptor-ref name="checkLogin"/>                <interceptor-ref name="defaultStack"/>            </interceptor-stack>        </interceptors>        <global-results>            <result name="checkLoginFail">/login.jsp</result>        </global-results>    </package>    <!-- 修改二 -->    <!-- 包含的配置文件 -->    <include file="struts-user.xml"></include></struts>

在resources目录下,添加配置文件struts-user.xml(方便管理相关配置):

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="loginAction" namespace="/" extends="abstract_struts">        <action name="login" method="login"  class="com.ssh.action.LoginAction">            <result name="success">/mainFrame.jsp</result>            <result name="error">/login.jsp</result>        </action>    </package>    <package name="userAction" namespace="/user" extends="abstract_struts">        <action name="add" method="add" class="com.ssh.action.UserAction">            <result name="success">/success.jsp</result>            <result name="fail">/fail.jsp</result>            <interceptor-ref name="checkLogin" />        </action>    </package></struts>

然后编写一个action,UserAction.java:
(只是为了测试)

package com.ssh.action;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {    private static final long serialVersionUID = 1L;    public  String  add() {        return SUCCESS;    }}

最后,编写jsp页面,add.jsp和success.jsp:
add.jsp:

 <body>    <form action="${pageContext.request.contextPath }/user/add.do">        <input type="submit" value="添加"/>    </form> </body>

success.jsp:

<body>    添加成功,拦截失败!</body>

设计思路:通过点击添加按钮,看看如果不存在用户的session,是否能被拦截器成功拦截,并跳转到登录界面login.jsp


测试一下,参考路径:http://localhost:8080/Struts2.3.20Spring4.1.5Hibernate4.3.8/add.jsp
跳转到了,登录界面,实现了成功拦截。


总结,对于s2sh的整合与s1sh整合思路一样,通过整合ssh也学到了很多,同时也要感谢布丰和贾琳,接下来还有更多东西要学。


最后关于源码,见链接[源码地址]

1 0