【SSH2(理论+实践)】--图说Struts2的执行

    前几篇文章讨论了有关Struts2的核心机制及一些基础,但同一时候也遗留下了非常多问题。这些问题主要是针对Struts2的一些使用技巧的,该篇文章将会针对Struts2的使用技巧进行讨论,并做一个文件上传和下载的实例。

一、Struts2再温习

Struts2使用了有半个月的时间了,在使用之余我对Struts2的使用流程做了具体的思考,它的使用流程和它的核心息息相关。所以在介绍Struts2时首先解读了它的核心机制。这里对Struts2的基本内容和使用流程再做一次总结。

上图是Struts2的基本内容,它的内容事实上非常少。在开发过程中应用最多的就是Struts强大的标签库和它的Webwork核心,当中Webwork核心是映射的重点,通过在xml中配置Filter来管理请求,将请求内容转化为Struts请求。然后依据请求的action去查找拦截器并运行拦截器中的方法,最后知心action中的方法。

只是有非常多使用的细节须要慢慢的总结。这里就不在一一说明。

下图为自己绘制的运行流程图。

1、当页面发出请求后。将会创建程序池。把HttpServletResponse请求送到程序池中。

2、查找对应的action,依据表单配置的action去struts.xml中查找对应的action配置项。

3、依据struts.xml中配置的action查找对应的拦截器。假设配置有拦截器将会首先运行拦截器中配置的class。

4、然后运行class中的init方法;

5和6、假设一个action中配置有多个action,将会依据配置顺序来顺序运行对应的拦截器。拦截器的方法运行完毕后最后运行action配置的class中的方法;

7、假设没有在表单提前指定要运行的方法,那么它会默认运行重写的方法execute()。

8、运行的方法会返回一个字符串,会依据该字符串查找action中配置的result假设有与之匹配的标签,将会跳转到标签中的页面。

这就是在使用struts时整个配置的运行过程,事实上非常简单,主要理解了struts的映射机制那么它的运行流程是非常easy理解的,这样的方法谈不上高效,由于它的每一个步骤都是使用的字符串名称匹配来完毕的映射,它会影响运行的效率,由于在这样的匹配工作上数字类型的效率是高于字符串类型的。

二、Struts2应用实例

上文一直在讨论Struts2的理论,理论是用来指导实践的。能够加深对事物的理解程度。另外有些部分的理论也能够通过实践获得,在实践中思考总结,相同能够获知理论。

2.1 一个form运行多个action

在程序开发的时候会碰到非常多应用问题。当中经常使用到的当数一个form会有多种提交请求,这时候怎么解决呢?菜鸟可能会使用多加入action的方法来运行请求,但这样会使页面的布局混乱,所以要考虑使用其他的办法,这里提供两种方法。

2.1.1 使用!

为对应的action指定要运行的方法

这样的方法在开发时常常使用,它不但简单并且通俗易懂,这里!

能够被理解为“的”,如:login!Method1,能够理解为login的Method1方法。使用简单并且easy读取。

详细例如以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

	//方法1,定义被拦截的方法的实例
	function method1(){
		var form=document.forms[0];
		form.action="loginaction!Method1";
		form.submit();
	}

	//方法2。为button2加入不拦截的方法
	function method2(){
		var form=document.forms[0];
		form.action="loginaction!Method2";
		form.submit();
	}

	//方法3,为button3加入不拦截的方法
	function method3(){
		var form=document.forms[0];
		form.action="loginaction!Method3";
		form.submit();
	}
</script>
</head>
<body>
	<form action="loginaction">
		用户名:<input type="text" name="username"><br>
		密     码:<input type="text" name="password"><br>
		<input type="submit" name="ok" value="button1" onclick="method1()">
		<input type="submit" name="ok1" value="button2" onclick="method2()">
		<input type="submit" name="ok2" value="button3" onclick="method3()">
	</form>
</body>
</html>

2.1.2使用通配符

通配符相同也能够实现该功能,struts的通配符使用的星号“*”,它指代随意内容。在须要使用它的地方使用大括号加数字的方式来引用第几个通配符,如:<actionname="*User*" class="com.action.ManagerUser"method="{1}User{2}">,当中{1}指代name属性的第一个“*”的内容,{2}指代name属性的第二个“*”的内容。

详细用法例如以下:

(1)jsp页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

	//方法1,定义被拦截的方法的实例
	function method1(){
		var form=document.forms[0];
		form.action="loginaction/LoginUser";
		form.submit();
	}

	//方法2。为button2加入不拦截的方法
	function method2(){
		var form=document.forms[0];
		form.action="loginaction/AddUser";
		form.submit();
	}

	//方法3,为button3加入不拦截的方法
	function method3(){
		var form=document.forms[0];
		form.action="loginaction/DeleteUser";
		form.submit();
	}
</script>
</head>
<body>
	<form action="loginaction">
		用户名:<input type="text" name="username"><br>
		密     码:<input type="text" name="password"><br>
		<input type="submit" name="ok" value="登陆" onclick="method1()">
		<input type="submit" name="ok1" value="加入" onclick="method2()">
		<input type="submit" name="ok2" value="删除" onclick="method3()">
	</form>
</body>
</html>

(2)配置的action类,loginAction.java

package com.action;

import com.opensymphony.xwork2.ActionSupport;

public class loginAction extends ActionSupport {
	@Override
	public String execute() throws Exception {
		System.out.print("这是运行的execute()");
		if(this.username.equals("admin") && this.password.equals("admin")){
			return "success";
		}else if(this.username.equals("cancel") && this.password.equals("cancel")){
			return "cancel";
		}else{
			return "error";
		}
	}

	public void AddUser(){
		System.out.println("运行方法:AddUser");
	}

	public void LoginUser(){
		System.out.println("运行方法:LoginUser");
	}

	public void DeleteUser(){
		System.out.println("运行方法:DeleteUser");
	}

}

(3)struts.xml中的action配置

<package name="manageuser" namespace="/loginaction" extends="struts-default">
    	<action name="*User" class="com.action.loginAction" method="{1}User">
    		<result name="error">error.jsp</result>
    		<result name="success">success.jsp</result>
        </action>
</package>

上面两种方法配置完毕后显示界面例如以下图:

分别单击三个button后运行的结果例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

分别运行了三种方法,证明上面的两种请求分配方法都是非常正确的。

结语

Struts2的使用相较Hibernate来说简单的非常,它的基本内容非常少,核心也採用的是Webwork,所以在使用时仅仅须要读WebWork了解清楚就能够非常快上手开发,它的映射机制也非常easy,下篇文章使用Struts2来做一个文件上传和下载的样例。

时间: 2024-10-05 05:37:21

【SSH2(理论+实践)】--图说Struts2的执行的相关文章

【SSH2(理论+实践)】--图说Struts2的运行

    前几篇文章讨论了有关Struts2的核心机制及一些基础,但同时也遗留下了很多问题,这些问题主要是针对Struts2的一些使用技巧的,该篇文章将会针对Struts2的使用技巧进行讨论,并做一个文件上传和下载的实例. 一.Struts2再温习 Struts2使用了有半个月的时间了,在使用之余我对Struts2的使用流程做了详细的思考,它的使用流程和它的核心息息相关,所以在介绍Struts2时首先解读了它的核心机制,这里对Struts2的基本内容和使用流程再做一次总结. 上图是Struts

【SSH2(理论+实践)】--Hibernate步步为营(一)

前几篇博客讨论了SSH2框架中的Struts,它对表示层进行了整合封装,并采用WebWork作为处理的核心,依赖映射是它的处理核心,在使用时需要在Struts.xml中配置相应的Action和Interceptor并设置它的属性就可以完成基本的操作,它的操作相对简单,接下来介绍另一个框架Hibernate,它的使用会相对复杂些. 一.Hibernate概述 Hibernate是冬眠的意思,它是指动物的冬眠,但是本文讨论的Hibernate却与冬眠毫无关系,而是接下来要讨论的SSH2框架中的一员.

图文解析Struts2框架执行流程

struts的架构图 (1)提交请求 客户端通过HttpServletRequest向servlet容器(即tomcat)提交一个请求. 请求经过一系列的过滤器,例如图中的ActionContextCleanUp和Other filter(SlterMesh,etc)等,最后被struts的核心过滤器FilterDispatcher控制到. 注:核心控制器2.1.3版本之后,struts的filterDispatcher核心控制器变成了StrutsPrepareAndExecuteFilte,如

Struts2远程执行漏洞

第一种攻击方式:新建一个文件,在文件中写入一下自己的东西加上&data=要写入文件he1p.jsp文件中的内容 攻击地址?class.classLoader.jarPath=(  %23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D+new+java.lang.Boolean(false)%2C+  %23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2

Struts2命令执行各版本记录

Struts2命令执行集合 截止至S2-037 原文链接:http://blog.0kami.cn/2017/01/13/Struts2-history-payload/ Struts2框架的RCE远程命令执行的确是一个比较经典的漏洞,这个框架犹如一个筛子,一个人十个指头能按住几个洞-- 参考描述: Struts2 S2-001 影响版本:2.0.0 - 2.0.8具体详情:https://struts.apache.org/docs/s2-001.html该漏洞因为用户提交表单数据并且验证失败

struts2的执行原理(执行流程,过滤器和拦截器)

一个请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端发送请求:2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action.FilterDispatcher的功能如下: (1)执

走进Struts2(一) — Struts2的执行流程及其工作原理

 Struts2是一套很优秀的Web应用框架,实现优雅.功能强大.使用简洁.能够说是Struts2是一款很成熟的MVC架构. 在我们学习Struts2时,最好是先学习它的执行流程.核心概念.从中得到启示.提升自己,而不不过学习怎么怎么使用它. 在网上看到这样一句话: 你千万不要成为一个仅仅会熟练使用框架的程序猿.那样.你会疲于奔命,你或许永远仅仅会使用 Hadoop ,而写不出一个 Hadoop ,你仅仅是一个 Hadoop程序猿,而不是一个分布式project师. 你或许永远仅仅会使用 Str

struts2学习-执行流程

服务器启动 1.加载web.xml 2.创建struts核心过滤器对象,执行filter --> init struts-default.xml      核心功能初始化 struts-plugin.xml     相关插件初始化 struts.xml    用户配置文件 3.用户访问Action,服务器根据路径的访问名称访问action,创建 action对象 4.后面每次访问,都会创建action实例 struts-default.xml 详细分析 --源码 <!DOCTYPE strut

Struts2内部执行过程

首先是Struts2的流程图. 一.当有一个请求的时候.执行以下流程. 1 客户端初始化一个指向Servlet容器的请求: 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin). 3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action.(注: