java:struts框架2(方法的动态和静态调用)

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的源码
     -->
    <!-- 启动方法的动态调用 -->
    <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>-->
        </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";
    }

  方式二:(不推荐)   

    利用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";
    }
    

  方式三:使用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";
    }
    

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("提交事务...");
    }
}

      

时间: 2024-10-22 08:36:26

java:struts框架2(方法的动态和静态调用)的相关文章

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb

java 第五章 方法定义及调用

1.方法的定义 什么是方法 方法是完成某个功能的一组语句,通常将常用的功能写成一个方法 方法的定义 [访问控制符] [修饰符] 返回值类型 方法名( (参数类型 形式参数, ,参数类型 形式参数, ,-) ) { 方法体 } 修饰符:public .static 被称为修饰符(后续会详细讲解它们): 返回值类型:用来说明该方法运算结果的类型.如果返回其他类型,编译就可能出错: 方法名:它作为调用时引用方法的标识: 参数列表:方法的参数个数可以是0个到多个,每个参数前面要声明参数的数据类型:每个参

Java面试-框架篇(SSH-hibernate or Strut2)

这篇博客主要记录SSH框架的相关面试知识点和题 1.Hibernate工作原理及为什么要用? 原理:  读取并解析配置文件 读取并解析映射信息,创建SessionFactory 打开Sesssion 创建事务Transation 持久化操作 提交事务 关闭Session 关闭SesstionFactory 为什么要用:  对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现.他很大程度的简化DAO

java 三大框架——Struts&#178;

Struts2是一种基于MVC模式的javaWeb框架,本质上相当于Servlet. 所谓MVC,就是模型-视图-控制器. Model(模型)表示应用程序核心(比如数据库记录列表). View(视图)显示数据(数据库记录). Controller(控制器)处理输入(写入数据库记录) 而Struts的作用实际上是作为控制器,建立模型层和视图层的数据交互(就是通常所说控制model和jsp之间的数据交互) 上面都是废话,你只要知道struts2能控制model和jsp之间的数据交互即可. web程序

如何开发一个java开源框架-----Jvn框架之实现文件的上传以及方法封装(第六讲)八哥实力讲解

前言 一 . 博主正在教大家如何开发一个javaEE框架(Jvn框架),博客里有完整的开发视频,每一篇博文都是一个知识点,帮助大家理解框架: 博客首页:http://www.cnblogs.com/everxs/ 本次内容视频以及源码下载地址:http://pan.baidu.com/s/1pJsoGDd 1,为什么要使用java的框架,以及框架能带来什么好处.  2,帮助你们理解框架的原理. 3,框架是如何实现的.                                        

第一个使用Struts框架的Java Web项目

今天早上第一次完成了一个HelloWorld级别的Java Web项目login(登陆验证)项目. 按照<JavaEE主流开源框架(第二版)>的指导做的. 1.先下载了struts:struts-2.3.16.3-all.zip,解压之后看到struts-2.3.16.3目录下有一个lib目录,这个目录里的全部是jar文件,采用struts框架需要使用jar包都在这个目录下. 2.根据书上的说明,先在myeclipse8.5中建立web project,命名为Login. 然后把下面的五个ja

实例详解Java中如何对方法进行调用

原文源自http://www.jb51.net/article/73827.htm 方法调用Java支持两种调用方法的方式,根据方法是否返回值来选择. 当程序调用一个方法时,程序的控制权交给了被调用的方法.当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序. 当方法返回一个值的时候,方法调用通常被当做一个值.例如: int larger = max(30, 40); 如果方法返回值是void,方法调用一定是一条语句.例如,方法println返回void.下面的调用是个语句: Sy

Caliburn框架中二级Menu无法调用ViewModel方法

公司WPF程序开发中应用了Caliburn框架,最近在做一个DataGrid上二级MenuItem时,发现Click方法无法调用ViewModel中的方法,但是回来后,在自己的机器上写了一个类似的测试程序时,却能够调用ViewModel中的方法 测试程序DataGrid 1 <DataGrid CanUserAddRows="False" AutoGenerateColumns="True" ItemsSource="{Binding Collect

java开源框架SpringSide3多数据源配置的方法详解

原创整理不易,转载请注明出处:java开源框架SpringSide3多数据源配置的方法详解 代码下载地址:http://www.zuidaima.com/share/1781579130801152.htm 在SpringSide 3社区中,不断有人提出多数据源配置的问题,但是时至今日却一直没有一个完美的答案.经过一个星期的折腾,我总算搞清楚了在SpringSide 3中配置多数据源的各种困难并加以解决,在这里,特地把我配置SpringSide 3项目中多数据源的过程写出来,与大家分享. 我使用