SSH框架学习笔记

ssh整合
1.先搞定spring
2.引入spring包
3.编写applicationContext.xml或者(beans)文件,我们把它放在src目录下面。
4.测试一下spring是否ok?—》目前spring可以工作
5.加入Hibernate开发包
6.因为我们是ssh,所以我们Hibernate里面的核心就被spring接管了。 hibernate.cfg.xml文件和对象映射文件、sessionFactory在spring的文件里面配置即可。
7.在ApplicationContext中配置数据源
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///mysqllh"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
         <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="30"/>
         <!-- 连接池的最大值 -->
         <property name="maxActive" value="500"/>
         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="2"/>
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="1"/>
</bean>
8. 配置sessionFactory对象
9. 我们编写了domain文件和对象关系映射文件Employee.hbm.xml文件 。测试spring和Hibernate是否可以结合使用?->ok的。
10. 考虑分层
11. 使用事务管理器,管理事务
13. 整合Struts
13. 1引入Struts开发包
13.2 创建struts-config.xml

配置如下:



13.3在web.xml中配置我们的Struts
    
    
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

14. 让spring接管我们Struts(action控件)
14.1 在Struts-config.xml文件中添加如下代码:
<!-- 配置代理请求处理 DelegatingRequestProcessor ,它的用户是 -->
<controller>
 <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller> 
14.2 在applicationContext.xml文件中配置action路径。 
<!-- 配置action -->
    <bean name="/login" class="com.liheng.web.actions.LoginAction"/>
14.3 这样我们就可以通过spring容器
14.4 通过使用spring来接管我们的action还有一个好处,可以解决action是单例的问题,通过在applicationContext.xml文件中配置属性<bean scope="prototype">
15. 解决中文乱码问题
思路1:自己配置过滤器
步骤:(1)开发一个Filter
           (2)在web.xml中配置自己写的过滤器
          <!-- 配置自己写的过滤器 -->
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.liheng.web.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
思路二:利用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>


ssh特别说明

1.spring可以启用注解扫描方式来配置属性

1.1 重新下这样配置属性
<bean id="employeeService" class="com.liheng.service.imp.EmployeeService"/>
1.2 在EmployeeService的属性sessionFactory中添加一个注解@resource
1.3 在applicationContext.xml文件中启用注解
<!-- 启用注解扫描 -->
    <context:annotation-config/>

2.ssh整合的时候如何解决懒加载问题
问题?如果我们的雇员都属于一个部门

Class Department{

private Integer id;

    private String name;

}

目前我们把测试数据作出了.

具体问题?如果我们在 mainFrame.jsp中要求显示该雇员所在部门的时候

${loginuser.department.name}  时候,懒加载问题出现:

解决思路:

1. 明确初始化

在session还没有关闭时,访问一次 xxx.getXxx(),强制访问数据库。或者 Hibernate.initialize(xxx)

2 在对象映射文件中 取消懒加载  <lazy=”false”/>

上面方法问题是: 不管你在jsp中使不使用 部门的名称,它都有向数据库发出select 请求.

3. spring专门提供了opensessioninview的方法来解决懒加载.

需要在web.xml文件中添加如下配置:

    
    
<filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

该方法可以有效的减少对数据库的查询,缺点是和数据保持的session,时间延长了.



struts1.x余spring整合的结合配置使用流程

该方案通过"自动注入"的方式获取对象,也即"依赖注入"方式。
较为常用,但特定情况下使用不了。如两个JVM,一个在长沙运行,一个在深圳运行,就不能同时实现注入,(1)"Spring和Struts的支持环境构建"
复制Struts、Spring相关包,并提供Struts、Spring的配置
提供国际化支持,提供缺省的国际化资源文件。
(2)"配置web.xml"
配置<context-param>,其中内容为Spring的配置文件applicationContext.xml。注意<param-name>的内容,必须为"contextConfigLocation";
配置<listener>,使用Spring提供的ContextLoaderListener。
配置范例:

    
    
      
      
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

解析:
当Web应用启动时,将执行以下操作:
	①由Tomcat创建一个ServletContext,并自动载入<context-param>中的属性;
	②ContextLoaderListener检测到ServletContext的创建,运行Spring的相关程序;
	③Spring根据<context-param>中contextConfigLocation的指向,加载对应applicationContext.xml;
	④Spring根据applicationContext.xml的内容创建一个BeanFactory实例,并放入ServletContext中。
简而言之,该配置的作用是:当Web应用启动时,Spring将自动创建一个BeanFactory实例,并放入ServletContext中。
(3)"配置Struts"
struts-config.xml文件中,注意其<action>标签的type属性,设置为Spring的代理Action类。由此真正的action创建交给Spring完成。
若不使用Spring,type设置为com.project.LoginAction等自定义类;使用Spring,type设置为"org.springframework.web.struts.DelegatingActionProxy"。
但"仍需构建具体Action",并编写Action的具体方法。该Action"在Spring的配置中引用",详见"(4)配置Spring"。
相当于将Struts配置转移到了Spring配置中,此处即Struts与Spring框架结合的关键结合点。
配置范例:
             
             
<struts-config>
    <form-beans>
        <form-bean name="loginForm" type="com.project.usermgr.web.forms.LoginActionForm"/>
    </form-beans>
    <action-mappings>
        <action path="/login"
                type="org.springframework.web.struts.DelegatingActionProxy"
                name="loginForm"
                scope="request"
        >
            <forward name="success" path="/login_success.jsp"/>
        </action>
    </action-mappings>
    <message-resources parameter="MessageResources" />
</struts-config>

(4)"配置Spring"
由Spring来创建和管理Action,并向Action注入Model层Service对象。
设置scope="prototype"后可使每个线程都有一个新的Action,从而解决Struts1.x的Action线程安全问题。
注意:
①必须使用name属性,且name属性的值必须和struts-config.xml文件中<action>标签的path属性值一致
②必须配置Model层Service对象,如userManager等。

    
    
      
      
applicationContext-beans.xml<bean name="/login" class="com.project.usermgr.web.actions.LoginAction" scope="prototype"><property name="userManager" ref="userManager"/></bean>

(5)"构建Action"
Model层Service对象由Spring"自动注入",因此无需手动构建该对象,也无需获取BeanFactory。通过"自动注入"的方式获取对象,即"依赖注入"。
注意,相关对象须提供set方法,以方便Spring注入。
    
    
        
        
public class LoginAction extends Action {
    private UserManager userManager;
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        LoginActionForm laf = (LoginActionForm)form;
        String username = laf.getUsername();
        String password = laf.getPassword();
        userManager.login(username, password);
        return mapping.findForward("success");
    }
    //须提供set方法,以方便Spring注入。
    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
}

Struts2与spring结合
注意Struts2在web.xml中的配置:
          
          
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/ *</url-pattern>
</filter-mapping>


Struts2用的是一个filter。只有在用到action的时候,才会读取Struts2的配置,明显Spring先启动。

Spring由listener启动之后,读取Spring的配置文件applicationContext.xml。如有多个配置文件,会全部读取。注意,是“全部”读取,不管有多少个。
Spring的配置文件中,基本都是<bean>,一个bean对应一个对象。Spring在读取配置完毕后,就立刻实例化这些对象。所以,这些对象是很早就被实例化好了的,并被保存起来。当程序需要使用这些对象时,则直接从内存中获取。Spring会把这些实例好了的对象保存在一个map里,第一次用的时候从map里取,查找速度是很快的。且查找一次之后,程序使用的就是引用了。

这里要稍微注意的就是scope="prototype"的情况。
①scope="singleton",默认值。顾名思义,单例。
②scope="prototype",每次都会生成新的实例,从IoC容器中获得的对象每次都是"不同"的。
若使用非线程安全的类,可以考虑使用prototype。

同其他对象一样,prototype在一开始也会被实例化一个对象出来。当此对象被使用后,Spring将额外再生成一个对象放到map里,供其他线程使用。

此外,Spring还有AOP机制。AOP说白了就是代理。一种是java的动态代理,还有一种则是CGLIB的继承式代理。这些代理类,与那些ioc容器的对象一样,也都是在Spring配置读取完成之后立刻被创建的。

Spring配置中的东西,都是一开始就被创建好了的,根本就不存在“重复查找”的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半路笙歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值