【SSH2(理论+实践)】--图说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来做一个文件上传和下载的样例。
【SSH2(理论+实践)】--图说Struts2的执行的更多相关文章
- [Java并发编程(四)] Java volatile 的理论实践
[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...
- ref:Struts2 命令执行系列回顾
ref:http://www.zerokeeper.com/vul-analysis/struts2-command-execution-series-review.html Struts2 命令执行 ...
- PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)
本文转自:自己的微信公众号<集成电路设计及EDA教程> <PT教程 - 应用系列 - ECO修复Timing(理论+实践+脚本分享)> 这篇推文讲一下数字IC设计中的post ...
- ICC教程 - Flow系列 - 概念系列 - ECO (理论+实践+脚本分享)
本文转自:自己的微信公众号<集成电路设计及EDA教程> <ICC教程 - Flow系列 - 概念系列 - ECO (理论+实践+脚本分享)> 这篇推文讲一下数字IC设计中的po ...
- 四、Struts2的执行过程和原理
执行过程和原理(可能面试题) 学习目标:熟知struts2的执行过程(下图记住).源码可以不看 a.过滤器的初始化 .StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有 ...
- Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)
本文转自:自己的微信公众号<集成电路设计及EDA教程> <Innovus教程 - Flow系列 - MMMC分析环境的配置概述(理论+实践+命令)> 轻轻走过,悄悄看过,无 ...
- java之struts2的执行流程讲解(1)
1.struts2的执行流程 请求--->Tomcat(判读项目是否存在)--->项目的web.xml--->struts2的核心过滤器 --->判读请求的资源(hello.a ...
- 【SSH2(理论+实践)】--Hibernate步步(一个)
前几个博客讨论SSH2该框架Struts,它代表层,集成封装.和使用WebWork作为核心处理,依赖映射是它的处理核心.在使用时需要Struts.xml配置相应Action和Interceptor够完 ...
- ADO.NET理论+实践
题记: 每一事物的产生和存在都有其特定的理由. 理论:ADO.NET是一组与数据源进行交互的面向对象类库.通常情况下数据源就是数据库,当然同样也能是文本文件,Excel表格或XML文件,我们知道的数 ...
随机推荐
- Xamarin开发手机聊天程序
使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载) 如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是 ...
- 1.1 Introduction中 Kafka as a Messaging System官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka as a Messaging System kafka作为一个消息系统 ...
- Android RecyclerView嵌套RecyclerView
原理 RecyclerView嵌套RecyclerView的条目,项目中可能会经常有这样的需求,但是我们将子条目设置为RecyclerView之后,却显示不出来.自己试了很久,终于找到了原因:必须先设 ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
摘要 本文将简要介绍这个文章系列的目的.形式及大体内容.并且完成开始学习这个系列前所必要的准备工作. 前言 ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了.可 ...
- [React] Animate your user interface in React with styled-components and "keyframes"
In this lesson, we learn how to handle CSS keyframe animations in styled-components, via the 'keyfra ...
- GO语言学习(五)Go 语言基础语法
Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Hello, World!") ...
- 原生js大总结二
011.if语句的优化 1.把次数多的条件和执行结果放到最前面 2.减少第一次无用的判断,可以用嵌套判断 3.判断语句禁止出现三次嵌套 012.谈谈你对switch的理解 1. ...
- async和await在项目中的应用
Async基础知识: async函数是ES7标准引入的语法,基于Generator函数实现的,也就是说是Generator函数的语法糖.什么是Generator函数?(留个坑) 返回值是Promise ...
- EL表达式.md
操作符 描述 . 访问一个Bean属性或者一个映射条目 [] 访问一个数组或者链表的元素 ( ) 组织一个子表达式以改变优先级 + 加 - 减或负 * 乘 / or div 除 % or mod 取模 ...
- 1、opencv3.3.0和cmake安装步骤(按照以下步骤安装后仅能在PC上运行,动态库也是PC端的属性)
1.下载安装CMake for Linux 下载地址:https://cmake.org/download/ 我下载的版本是,下载文件cmake-3.11.1.tar.gz ./bootstrap m ...