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

 

  

      

java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))的更多相关文章

  1. 调用sed命令的三种方式

    调用sed命令的三种方式 调用sed有三种方式,一种为Shell命令行方式,另外两种是将sed命令写入脚本文件,然后执行该脚本文件. 三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用s ...

  2. java 获取时间戳的三种方式

      java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...

  3. 【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】

    不考虑第三方框架,如果只使用JDK提供的API,那么可以使用三种方式调用WebService服务:另外还可以使用Ajax调用WebService服务. 预备工作:开启WebService服务,使用jd ...

  4. Django框架之ORM的相关操作之多对多三种方式(五)

    在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下: 1.ORM自动帮助我们创建第三张表 2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来 3.手动创建第 ...

  5. jquery调用click事件的三种方式

    第一种方式: $(document).ready(function(){ $("#clickme").click(function(){ alert("Hello Wor ...

  6. 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=6 ...

  7. JavaWeb_(Struts2框架)Struts创建Action的三种方式

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  8. Struts2方法调用的三种方式(有新的!调用方法的说明)

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...

  9. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

随机推荐

  1. 标准C语言(12)

    一个存储区的地址应该是它自身大小的整数倍(双精度浮点类型存储区的地址只需要是4的整数倍),这个规则叫数据对齐,结构体内部的存储区通常也需要遵守数据对齐的规则,数据对齐有可能导致结构体相邻子存储区之间有 ...

  2. 读《JavaScript面向对象编程指南》(二)

    第五章 原型 在JavaScript中,所有函数都会拥有一个 prototype 的属性,默认初始值为空对象. 可以在相关的原型对象中添加新的方法和属性,甚至可以用自定义对象来完全替换掉原有的原型对象 ...

  3. win10上使用自带的Hyper-V安装虚拟机

    Hyper-V管理器,新建虚拟机,安装了.iso系统,但启动报错,电脑上联想G40-70,都说在bios设置的security里开启硬件虚拟化选项,可我security里没有虚拟化相关选项, 后来在 ...

  4. 仿响应式html:JS来判断页面是在手机端还是在PC端打开的方法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a419419/article/detail ...

  5. 我说CMMI之七:需求管理过程域--转载

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/dylanren/article/deta ...

  6. JavaWeb--ServletContext

    https://www.jianshu.com/p/31d27181d542 java类中获取ServletContext的方法 起因是我想要获取一个相对路径,需要用到servletContext的g ...

  7. LOJ-6282-数列分块入门6

    链接: https://loj.ac/problem/6282 题意: 给出一个长为 的数列,以及 个操作,操作涉及单点插入,单点询问,数据随机生成. 思路: vector 维护每个区间, 当某个区间 ...

  8. python 文件定位

    tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后. seek(offset [,from])方法改变当前文件的位置.Offset变量表示要移动的字节数.F ...

  9. 翻页的时候更改URL地址

    要求点击第一页是url+p1html,点击第二页是url+p2html等等 $("body").on('click','#w_tagPage a[wid]',function(){ ...

  10. ABP core2.2错误笔记,持续更新

    注:以下问题全部基于版本 © 2019 MLCDZ. Version 4.3.0.0 [20190830]  .net core 的版本为2.2 1.System.InvalidOperationEx ...