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

Posted 咫尺天涯是路人丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的源码
     -->
    <!-- 启动方法的动态调用 --> //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以上是关于java:struts框架2(方法的动态和静态调用)的主要内容,如果未能解决你的问题,请参考以下文章

Struts 2之动态方法调用,不会的赶紧来

第三章Struts2 Action中动态方法调用通配符的使用

Java的反射

Java Struts2

SSH框架——struts2篇

struts2.5+框架使用通配符与动态方法