【SSH2(理论+实践)】--图说Struts2的运行
来源:互联网 发布:淘宝pc转换无线连接 编辑:程序博客网 时间:2024/06/05 02:23
一、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的映射机制那么它的执行流程是很容易理解的,这种方法谈不上高效,因为它的每个步骤都是使用的字符串名称匹配来完成的映射,它会影响执行的效率,因为在这种匹配工作上数字类型的效率是高于字符串类型的。
二、Struts2应用实例
上文一直在讨论Struts2的理论,理论是用来指导实践的,能够加深对事物的理解程度,另外有些部分的理论也可以通过实践获得,在实践中思考总结,同样可以获知理论。
2.1 一个form执行多个action
在程序开发的时候会碰到很多应用问题,其中常用到的当数一个form会有多种提交请求,这时候怎么解决呢?菜鸟可能会使用多添加action的方法来执行请求,但这样会使页面的布局混乱,所以要考虑使用其它的办法,这里提供两种方法。
2.1.1 使用!为相应的action指定要执行的方法
这种方法在开发时经常使用,它不但简单而且通俗易懂,这里!可以被理解为“的”,如:login!Method1,可以理解为login的Method1方法,使用简单并且容易读取。
具体如下代码:
<%@ 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,为按钮2添加不拦截的方法function method2(){var form=document.forms[0];form.action="loginaction!Method2";form.submit();}//方法3,为按钮3添加不拦截的方法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="按钮1" onclick="method1()"><input type="submit" name="ok1" value="按钮2" onclick="method2()"><input type="submit" name="ok2" value="按钮3" 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,为按钮2添加不拦截的方法function method2(){var form=document.forms[0];form.action="loginaction/AddUser";form.submit();}//方法3,为按钮3添加不拦截的方法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 {@Overridepublic 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>
上面两种方法配置完成后显示界面如下图:
分别单击三个按钮后执行的结果如下图:
分别执行了三种方法,证明上面的两种请求分配方法都是很正确的。
结语
Struts2的使用相较Hibernate来说简单的很,它的基本内容很少,核心也采用的是Webwork,所以在使用时只需要读WebWork了解清楚就可以很快上手开发,它的映射机制也很简单,下篇文章使用Struts2来做一个文件上传和下载的例子。
- 【SSH2(理论+实践)】--图说Struts2的运行
- 【SSH2(理论+实践)】--图说Struts2的运行
- 【SSH2(理论篇)】--Struts2配置详解
- 【SSH2(理论篇)】--Struts2配置详解
- 【SSH2(理论篇)】--Struts2配置详解
- 【SSH2(理论篇)】--Struts2配置详解
- 【SSH2(实践篇)】--Struts2拦截器精解
- 【SSH2(实践篇)】--Struts2拦截器精解
- 【SSH2(理论+实践)】--Hibernate步步为营(一)
- 【SSH2(实践篇)】--Struts2文件上传下载实例
- 【SSH2(实践篇)】--Struts2文件上传下载实例
- 【SSH2框架(理论篇)】--SSH2 Vs 经典三层
- 【SSH2框架(理论篇)】--SSH2 Vs 经典三层
- SSH2(Struts2、Spring3与Hibernate3)的整合
- 实践背后的理论
- SSH2 struts2 在线编辑器实现(一)
- SSH2之搭建struts2(一)
- 管理的理论与实践
- 基于xmpp openfire smack开发之openfire介绍和部署
- c++ 模拟浮点数运算
- rabbitmq初学之连接测试
- 格力与小米:谁将会赢
- 微软面试100题之第2题
- 【SSH2(理论+实践)】--图说Struts2的运行
- 面试啊面试
- 在php中,session退出
- 【操作系统】请求分页储存管理方式
- PHP socket编程案例,参照视频教程
- ``Accordian'' Patience
- 动态IP或无公网IP时外网访问内网ORACLE数据库
- COAP学习笔记2--Option
- 船