zoukankan      html  css  js  c++  java
  • java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用:  

      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>
        <!-- 
            package:包,将Action(应用控制器)在逻辑上进行隔离,完成包中功能上的继承
                name:给package起的名字,就是通过name属性完成继承
                namespace:命名空间(可以理解成包在地址栏的反映),action请求url的前缀(url的构成部分),默认空间为 "/"
                extends:值必须为某个包的名字,完成包之间的继承
                abstract:抽象的 ,如果一个package是abstract=“true”,该package必须被继承,该包下不能有action节点
            Action:描述javabean(应用控制器,具体处理请求的javabean)
                name:该javabean的请求路径
                class: javabean的完全限定名(通过反射创建javabean的对象)
                method: 指定的是处理本次请求的方法
            result:Action执行完成后需要响应的结果
               name:需要响应的结果逻辑名称
               type:表示响应的结果的类型(ajax响应,通过的跳转响应)
                       请求转化:
                       dispatcher(默认值),只能跳转到jsp
                       chain:跳转到javabean(应用控制器)
                       重定向:
                       redirect  :  jsp
                       redirectAction   :  javabean
                       产生一个流对象:
                       stream :  通过流对象的方式给客户端做出响应        
                       plainText:响应到客户单的内容为view的源码
         -->
        <!-- 启动方法的动态调用 --> //DMI:动态方法调用,复制default.properties里面的“struts.enable.DynamicMethodInvocation”字段粘贴到启动处
        <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
        <!-- 方法的通配符调用(重要) -->
        <package name="crud" namespace="/user" extends="struts-default">
            <action name="user-*" class="cn.zzsxt.crud.action.UserinfoAction" method="{1}">
                <result name="list">/list.jsp</result>
                <!--
                     结果视图类型 type="结果类型名称"
                    常见的结果视图
                    用于JSP页面的请求转换或重定向
                    dispatcher:请求转发 request.getRequestDispatcher().forword(request,response)
                    redirect:重定向  response.sendRedirect()
                    服务器端(action之间)的请求转发和重定向
                    redirectAction:action之间的重定向,新增后为了避免重复新增,经常都利用重定向
                    chain:action之前的请求转发
                    stream:将结果转换为流,在下载时使用
                 -->
                <result name="success" type="redirectAction">user-doList</result>
                <result name="error" type="redirect">/error.jsp</result>
                <result name="update">/update.jsp</result>
            </action>
        </package>
        <!-- 方法的动态调用(不建议) -->
    <package name="crud2" namespace="/user2" extends="struts-default"> <action name="userAction" class="cn.zzsxt.crud.action.UserinfoAction2"> <result name="list">/list2.jsp</result>     <result name="success" type="redirectAction">userAction!doList</result> //命名规则:ActionName!方法名.action </action> </package> </struts>

    2.获取Servlet API三种方式:

      方式一:(不推荐)

        利用ServletActionContext中的静态方法获取
        getRequest()--->request
        getResponse()-->response
        getServletContext()--->application
        request.getSessoin()--->session

      Action:

        public String doList()throws Exception{
            List<Userinfo> list = userinfoService.findAllUsers();
            //获取HttpServletRequest对象
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("list", list);
            //获取HttpServletResponse对象
            //HttpServletResponse response = ServletActionContext.getResponse();
            //获取HttpSessoin对象
            //HttpSession session = request.getSession();
            //获取ServletContext对象,application
            ServletContext application= ServletActionContext.getServletContext();
            return "list";
        }
    package cn.zzsxt.crud.action;
    
    import java.util.List;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts2.ServletActionContext;
    
    import cn.zzsxt.crud.entity.Userinfo;
    import cn.zzsxt.crud.service.UserinfoService;
    import cn.zzsxt.crud.service.impl.UserinfoServiceImpl;
    /**
     * 获取Servlet API的方式一:利用ServletActionContext中的静态方法获取
     * getRequest()--->request
     * getResponse()-->response
     * getServletContext()--->application
     * request.getSessoin()--->session
     * @author Think
     *
     */
    public class UserinfoAction {
        private UserinfoService userinfoService = new UserinfoServiceImpl();  
        private Userinfo user;//获取表单元素的值 
    
        public Userinfo getUser() {
            return user;
        }
    
        public void setUser(Userinfo user) {
            this.user = user;
        }
    
        /**
         * 查询用户列表
         * @return
         * @throws Exception
         */
        public String doList()throws Exception{
            List<Userinfo> list = userinfoService.findAllUsers();
            //获取HttpServletRequest对象
            HttpServletRequest request = ServletActionContext.getRequest();
            request.setAttribute("list", list);
            //获取HttpServletResponse对象
            //HttpServletResponse response = ServletActionContext.getResponse();
            //获取HttpSessoin对象
            //HttpSession session = request.getSession();
            //获取ServletContext对象,application
            ServletContext application= ServletActionContext.getServletContext();
            return "list";
        }
        
        public String doAdd()throws Exception{
            int count = userinfoService.addUser(user);
            if(count>0){
                return "success";
            }
            return "error";
        }
        /**
         * 删除
         * @return
         * @throws Exception
         */
        public String doDelete()throws Exception{
            int count = userinfoService.deleteUser(user.getUserId());
            if(count>0){
                return "success";
            }
            return "error";
        }
        /**
         * 查询详情
         * @return
         * @throws Exception
         */
        public String doDetail()throws Exception{
            user = userinfoService.findUserById(user.getUserId());
            return "update";
        }
        
        public String doUpdate()throws Exception{
            int count = userinfoService.updateUser(user);
            if(count>0){
                return "success";
            }
            return "error";
        }
    }

      方式二:(不推荐)   

        利用ActionContext中的静态方法getContext()获取ActionContext的实例
        然后就可以通过该实例调用它的众多方法得到Servlet的一些API
        public Object get(Object key)方法,就相当于request.getAttribute()
        public void put(Object key, Object value)对应request.setAttribute()
        public Map<String, Object> getParameters()对应request.getParameterMap()
        public Map<String, Object> getSession()方法对应javax.servlet.http.HttpSession
        session.put(Object key, Object value)对应Servlet编程中的session.setAttribute(…)
        session.get(Object key)对应Servlet编程中的session.getAttribute(…)
        也就是说,ActionContext能够获得三个Map类型的Request, Session, Application对象
       

        优点:

          Struts2便可脱离Servlet容器进行单纯的JUnit测试

      Action:

        public String doList()throws Exception{
            List<Userinfo> list = userinfoService.findAllUsers();
            //使用ActionContext中的getContext()获取ActionContext实例
            ActionContext actionContext = ActionContext.getContext();
            //将信息保存到request中,request.setAttribute(..)
            //actionContext.put("list", list);
            Map<String,Object> session = actionContext.getSession();
            session.put("list", list);
            return "list";
        }
        
    package cn.zzsxt.crud.action;
    
    import java.util.List;
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    
    import cn.zzsxt.crud.entity.Userinfo;
    import cn.zzsxt.crud.service.UserinfoService;
    import cn.zzsxt.crud.service.impl.UserinfoServiceImpl;
    /**
     * 获取Servlet API的方式二:利用ActionContext中的静态方法getContext()获取ActionContext的实例
          然后就可以通过该实例调用它的众多方法得到Servlet的一些API
        public Object get(Object key)方法,就相当于request.getAttribute()
        public void put(Object key, Object value)对应request.setAttribute()
        public Map<String, Object> getParameters()对应request.getParameterMap()
        public Map<String, Object> getSession()方法对应javax.servlet.http.HttpSession
            session.put(Object key, Object value)对应Servlet编程中的session.setAttribute(…)
            session.get(Object key)对应Servlet编程中的session.getAttribute(…)
        也就是说,ActionContext能够获得三个Map类型的Request, Session, Application对象
        优点:Struts2便可脱离Servlet容器进行单纯的JUnit测试
     * @author Think
     *
     */
    public class UserinfoAction2 {
        private UserinfoService userinfoService = new UserinfoServiceImpl();  
        private Userinfo user;//获取表单元素的值 
    
        public Userinfo getUser() {
            return user;
        }
    
        public void setUser(Userinfo user) {
            this.user = user;
        }
    
        /**
         * 查询用户列表
         * @return
         * @throws Exception
         */
        public String doList()throws Exception{
            List<Userinfo> list = userinfoService.findAllUsers();
            //使用ActionContext中的getContext()获取ActionContext实例
            ActionContext actionContext = ActionContext.getContext();
            //将信息保存到request中,request.setAttribute(..)
            //actionContext.put("list", list);
            Map<String,Object> session = actionContext.getSession();
            session.put("list", list);
            return "list";
        }
        
        public String doAdd()throws Exception{
            int count = userinfoService.addUser(user);
            if(count>0){
                return "success";
            }
            return "error";
        }
        /**
         * 删除
         * @return
         * @throws Exception
         */
        public String doDelete()throws Exception{
            int count = userinfoService.deleteUser(user.getUserId());
            if(count>0){
                return "success";
            }
            return "error";
        }
        /**
         * 查询详情
         * @return
         * @throws Exception
         */
        public String doDetail()throws Exception{
            user = userinfoService.findUserById(user.getUserId());
            return "update";
        }
        
        public String doUpdate()throws Exception{
            int count = userinfoService.updateUser(user);
            if(count>0){
                return "success";
            }
            return "error";
        }
    }

      方式三:使用IOC的方式(推荐)

        
        IOC:

          控制反转,是spring的核心,原来调用者需要自己创建所依赖的对象,比如在UserinfoAction中调用UserinfoService中的方法,
         需要自己创建UserinfoService的实例,使用了控制反转后不需要手工创建依赖对象,将有容器(struts2或spring等)创建所依赖的对象,
         这种控制权发生了转移的现象称为控制反转。

        实现步骤:
          1.将业务逻辑Action实现XxxAware,Xxx代表需要的ServletAPI对象
         eg:ServletRequestAware,ServletResponseAware,SessionAware...
          2.在业务逻辑Action中添加成员变量
          3.实现XxxAware中的setter方法,将容器创建的Servlet API对象设置给成员变量
     

       Action:  

        public String doList()throws Exception{
            List<Userinfo> list = userinfoService.findAllUsers();
            request.setAttribute("list", list);
    //        session.put("list", list);
            return "list";
        }
        
    package cn.zzsxt.crud.action;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;
    
    import com.opensymphony.xwork2.ActionContext;
    
    import cn.zzsxt.crud.entity.Userinfo;
    import cn.zzsxt.crud.service.UserinfoService;
    import cn.zzsxt.crud.service.impl.UserinfoServiceImpl;
    /**
     *获取ServletAPI方式三:使用IOC的方式(推荐)
     *IOC:控制反转,是spring的核心,原来调用者需要自己创建所依赖的对象,比如在UserinfoAction中调用UserinfoService中的方法,
     *        需要自己创建UserinfoService的实例,使用了控制反转后不需要手工创建依赖对象,将有容器(struts2或spring等)创建所依赖的对象,
     *        这种控制权发生了转移的现象称为控制反转。
     *实现步骤:
     *1.将业务逻辑Action实现XxxAware,Xxx代表需要的ServletAPI对象
     *  eg:ServletRequestAware,ServletResponseAware,SessionAware...
     *2.在业务逻辑Action中添加成员变量
     *3.实现XxxAware中的setter方法,将容器创建的Servlet API对象设置给成员变量  
     *
     */
    public class UserinfoAction3 implements ServletRequestAware,ServletResponseAware,SessionAware{
        private UserinfoService userinfoService = new UserinfoServiceImpl();  
        private Userinfo user;//获取表单元素的值 
        private HttpServletRequest request;
        private HttpServletResponse response;
        private Map<String,Object>  session;
        
        public Userinfo getUser() {
            return user;
        }
        public void setUser(Userinfo user) {
            this.user = user;
        }
    
        /**
         * 查询用户列表
         * @return
         * @throws Exception
         */
        public String doList()throws Exception{
            List<Userinfo> list = userinfoService.findAllUsers();
            request.setAttribute("list", list);
    //        session.put("list", list);
            return "list";
        }
        
        public String doAdd()throws Exception{
            int count = userinfoService.addUser(user);
            if(count>0){
                return "success";
            }
            return "error";
        }
        /**
         * 删除
         * @return
         * @throws Exception
         */
        public String doDelete()throws Exception{
            int count = userinfoService.deleteUser(user.getUserId());
            if(count>0){
                return "success";
            }
            return "error";
        }
        /**
         * 查询详情
         * @return
         * @throws Exception
         */
        public String doDetail()throws Exception{
            user = userinfoService.findUserById(user.getUserId());
            return "update";
        }
        
        public String doUpdate()throws Exception{
            int count = userinfoService.updateUser(user);
            if(count>0){
                return "success";
            }
            return "error";
        }
    
    
        //实现ServletRequestAware中的方法
        @Override
        public void setServletRequest(HttpServletRequest request) {
            this.request=request;
        }
        //实现ServletResponseAware中的方法
        @Override
        public void setServletResponse(HttpServletResponse response) {
            this.response=response;
        }
        //实现SessionAware中的方法
        @Override
        public void setSession(Map<String, Object> session) {
            this.session=session;
        }
    
    }

    3.拦截器:

      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>
        <package name="inteceptor" extends="struts-default">
            <action name="timerAction" class="cn.zzsxt.action.TimerAction">
                <result name="success">/success.jsp</result>
                <!-- 引入timer拦截器 --> 
      //在struts-default.xml文件下有各种各样的拦截器,只需要继承struts-default这个包就可以了
    <interceptor-ref name="timer"></interceptor-ref>//可以帮助打印信息,同时搜索log4j(2)粘贴到src下 <!-- 引入默认拦截器栈 -->//相当于把所有默认的拦截类型一次性引入,上面引入了默认之外的类型“timer”,所以需要再引入一次默认类型 <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>

    4.静态代理和动态代理(Spring AOP) 

      OOP:面向对象编程

      OOA:面向对象的分析

      OOD:面向对象的设计

      SOA:面向服务的编程

      AOP:面向切面编程

          AOP优点:

            对OOP的补充,将共性问题集中解决,体现的设计模式为代理模式。

          代理模式优点:

            在不改变原代码的情况下,对类的功能加强。

      静态代理:

      

      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>
        <package name="inteceptor" extends="struts-default">
            <action name="timerAction" class="cn.zzsxt.action.TimerAction">
                <result name="success">/success.jsp</result>
                <!-- 引入timer拦截器 -->
                <interceptor-ref name="timer"></interceptor-ref>
                <!-- 引入默认拦截器栈 -->
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
    </struts>

      index.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
      </head>
      
      <body>
          <a href="timerAction.action">timerAction</a>
      </body>
    </html>

      success.jsp:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <title>My JSP 'index.jsp' starting page</title>
      </head>
      <body>
          <h2>success!</h2>
      </body>
    </html>

      TimerAction:

    package cn.zzsxt.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class TimerAction extends ActionSupport{
        @Override
        public String execute() throws Exception {
            Thread.sleep(2000);
            return this.SUCCESS;
        }
    }

      Test:

    package cn.zzsxt.proxy;
    
    public class Test {
        public static void main(String[] args) {
            UserDaoProxy proxy = new UserDaoProxy(new UserDaoImpl());
            proxy.add();
        }
    }

      UserDao:

    package cn.zzsxt.proxy;
    
    public interface UserDao {
        public void add();
    }

      UserDaoImpl:

    package cn.zzsxt.proxy;
    
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void add() {
    //        System.out.println("开启事务....");
            System.out.println("执行了用户新增....");
    //        System.out.println("提交事务...");
        }
    
    }

      UserDaoProxy:

    package cn.zzsxt.proxy;
    /**
     * 代理模式:静态代理和动态代理(spring AOP)
     * 优点:在不该原有代码的基础之上对类的功能进行加强。
     * @author Think
     * 
     */
    public class UserDaoProxy {
        private UserDao target;//被代理目标
        public UserDaoProxy(UserDao target){
            this.target=target;
        }
        public void add(){
            System.out.println("开启事务....");
            target.add();//调用被代理目标中的方法
            System.out.println("提交事务...");
        }
    }

     

      

          

  • 相关阅读:
    第三天 moyax
    mkfs.ext3 option
    write file to stroage trigger kernel warning
    download fomat install rootfs script
    custom usb-seriel udev relus for compatible usb-seriel devices using kermit
    Wifi Troughput Test using iperf
    learning uboot switch to standby system using button
    learning uboot support web http function in qca4531 cpu
    learngin uboot design parameter recovery mechanism
    learning uboot auto switch to stanbdy system in qca4531 cpu
  • 原文地址:https://www.cnblogs.com/kuangzhisen/p/7327418.html
Copyright © 2011-2022 走看看