Struts1.2/2.1、spring、hibernate整合笔记

来源:互联网 发布:淘宝客服消息发不出去 编辑:程序博客网 时间:2024/05/21 09:21

struts 1.x + hibernate +spring

1.jar包
2.1 struts MVC中央控制器,所有请求都交给前端控制器(ActionServlet)
2.2 hibernate
2.3 spring---对象的装配(IOC),AOP:把B的代码动态的加入A的代码中,B是一段公共的代码,有通用功能,可以加入A,也可以加入A1,A2,A3…………(!通用) ---AOP:通过动态代理把一段
主要只用spring的事务功能
spring的事务:
    action
    service
        validateUser
        validateUserName  这些方法是根据业务来定的(业务方法)
        在业务方法中加入事务(事物管理的advice加入service中,只需写pointcut)
    dao----->增删改查

applicationContext.xml
    dao_hibernate.xml   
        dataSource
        SessionFactory
        dao
    service.xml
        service
        transactionManager
        tx:advice
            <tx:advice id="txAdivce" transacton-manager="tx"(注入事物管理器)>
                <tx:attributes>
                    <tx:method name="get*" read-only="true"/>
注:read-only="true"如果insert-->如果实现是hibernate,则抛异常;实现如果是JDBC,则能insert
                    <tx:method name="add*" parpaon="required">
required:一个方法开启一个事物,方法完后关闭事物,如果抛出RuntimeException就回滚,可自定义异常回滚
f1(){}
f2(){}
f3(f1,f2){}
                </tx:attributes>
            </tx:advice>
        aop:config
action.xml
    action

______________________________________________
web.xml
    <listener>
        <listener-class>org.springframework.web.struts.ContextLoaderListener</listener-class>-->通用性强(spring为web应用而写的)
    </listener>//new applicationContext()
       
struts-config.xml
    <action path="/"
    type="DelegationActionProxy">
    </action>
    <plug-in name="ContextLoaderPlugIn">---->只为struts1.X而写
        <set-property property="" value="/WEB-INF/action.xml">
    </plug-in>
   
*************************************************************
struts2.x+hibernate+spring

applicateionContext.xml
标注:
action里只需定义就可以

struts2.x核心

Struts 1.x
WebWork--->IOC/拦截器 XWork jar包
Struts 2  XWork jar包
1.jar包:核心包没有几个
    struts2-core-2.1.6.jar
    xwork-2.1.2.jar
    ognl-2.6.11.jar
    freemarker-2.3.13.jar写页面模板(像JSP)
    commons包
    jsonplugin-0.33.jar
   
    一共有三个过滤器
        不加自己的过滤器
        StrutsPrepareAndExecuteFilter
       
        要加自己的过滤器
        PrepareFilter struts2初始化工作
        MyFilter 我的过滤器
        ExecuteFilter  struts2的请求控制器
       
    src/struts.xml  实际上是在classes/struts.xml
   
    <struts>
        <package name="hello" extends="struts-default" namespace="/one">  ---一个模块
        注:name:唯一模块名
            extends:继承(另一个模块)
            namespace:地址栏上的地址,模块的命名空间
           
            <action name="test" class="action.TestAction" method="go">
                <reslut name="success" type="dispatcher">/jsp/test_view.jsp</result>
            </action>
        </package>
    </struts>
    struts-default.xml
    1.默认加载
    2.<result-type> 返回类型(默认有十种chain/dispatcher/freemarker/httpheader/redirect/rediectAction/stream/velocity/xslt/plainText)
      <interceptor> 可民扩展功能
     
    3.action extends ActionSupport 也可以不继承
        如:
            public class TestAction extends ActionSupport{
                public String go(){
                }
            }
            或:
            public class TestAciton{
                public String go(){//名字可以任意取,默认为execute()
                    System.out.println(this+".go()");
                    return "success";
                }
            }
    4.访问:http://localhost:8080/netstone/one/test.action
        ----->访问一次,创建一个action对象,
        而struts1.x的Servlet只创建一次,有多线程并发的访问题
       
重点:ValueStack ----存放数据(一个请求一个ValueStack)
    先了解Ognl:ognl-2.6.11.jar
    EL表达式 :通过一段字符串的方式来表示对 对象属性的访问:如${emp.name}
    Ognl和EL做的事情是一样的
    什么叫Ognl?
    Object value = Ognl.getValue("name",emp);//获取emp对象的name属性的值
    Object value = Ognl.getValue("dept.description + '_' + name",emp);
    Object value = Ognl.getValue("dept.props[1]",emp);//数组或集合
       
    ValueStack是一个对象,内部是用Ognl来实现。
    ValueStack是对Ognl的再次封装
    Root根:表达式是相对谁来做计算的
    对于ValueStack来说:
        class ValueStack{
            private CompondRoot root;//是一个栈
            public Object findValue(String str){
                。。。//在root栈顶开始从上往下找,看哪一个对象能匹配上这个Ognl表达式---str
                !!!!!!!!action里root栈的栈顶就是action自己
            }
        }
       
    ActionContext ctx = ActionContext.getContext();
    ValueStack vs = ctx.getValueStack();
   
    vs.findValue("Ognl的表达式");
   
    org.apache.struts2.dispatcher.StrutsRequestWrapper--->包装Request
   
   
    Servlet中的HttpServletRequestWrapper:
   
    HttpServletRequestWrapper implements HttpServletRequest{
        private HttpServletRequest request;
       
        public HttpServletRequestWrapper(HttpServletRequest request){
            this.request = request;
        }
       
        public String getParameter(String param){
            return request.getParameter();
        }
    }
   
    自己写的RequestWrapper:
    public class MyRequestWrapper extends HttpServletRequestWrapper{
        public MyRequestWrapper(HttpServletRequest request){
            supper(request);
        }
        public Object getAttribute(){
            return "hahah";
        }
    }
    过滤器:
    ………………
    doFile(request,response,chain){
        return chain(new MyRequest(request),response);
    }
    ………………
    //一种设计模式:这样改变了Request的部分功能,其它功能不变
   
    *
    ${emp.name} //先到request里面去找,如果为NULL,则到ValueStack里去取
    也可以用标记:
        <s:property value="emp.name"/> 直接从ValueStack里面去取
   
    *
    action里的数据,一半是表单数据,一半是把结果返回页面的数据
    在struts2里,action和form是合在一起的,是Action的属性