使用Struts2框架实现用登陆的功能,使用struts2标签和ognl表达式简化了试图的开发,而且利用struts2提供的特性对输入的数据进行验证,以及访问ServletAPI时实现用户会话跟踪,其简单的程序运行流程图以下java
Struts2的Action类颇有意思,你可使用3种方式来实现具体的Action类:编程
以上三种Action的实现方式均可以被struts2框架自动识别,若是你在struts.xml里面配置了一个action块可是没有配置action类的路径,这样框架默认使用ActionSupport来处理请求。浏览器
可是在实际使用struts2的过程当中我发现了一个问题,一个Action只有一个execute方法来处理一类请求,若是我开发的某块功能有100个不一样的请求那我岂不是要写100个Action类,每一个类实现一个execute方法,这样虽然知足了一个类一个责任的设计原则,可是会不会形成“类爆炸”?后来看了struts2的文档才知道,其实咱们可使用struts2灵活的通配符配置来达到减小action类的目的:服务器
方式一:数据结构
继承ActionSupport类,若是使用了数据校验功能,则必须继承ActionSupport。上面那个Action类就是继承了ActionSupport类。框架
方式二:jsp
实现Action接口,实现execute()方法编程语言
package lps.servletAPI; import com.opensymphony.xwork2.Action; import javax.xml.registry.infomodel.User; public class LoginThirdActionContextAction implements Action { private User user; @Override public String execute() throws Exception { return null; } }
方式三:ide
:既不继承ActionSupport也不实现Action接口.(ActionSupport实现了Action接口)测试
public class UserAction3 { private String userName; public void setUserName(String userName) { this.userName = userName; } public String login(){ System.out.println("UserAction3.login()"+":"+userName); return "success"; } }
Struts2的result结果集
Struts2的Action处理用户请求后,返回一个普通字符串-------逻辑视图名,必须在Struts.xml文件中完成逻辑图
和物理视图资源的映射,才可让系统转到实际的视图资源。
结果就是告诉Struts2框架,当Action处理结果时,系统下一步作什么。当Action返回一个普通的字符串时,系统下一步作什么。
Struts2经过在struts.xml文件中使用<result…/>元素来配置结果。根据<result…/>元素所在位置的不一样,struts2提供了两种结果:
(1) 局部结果:将<result…/>做为<action…/>元素的子元素配置。
(2) 全局结果:将<result…/>做为<global-result…/>元素的子元素配置。
首先来介绍一下局部结果,局部结果是经过在<action../>元素中指定<result…/>元素来配置的,一个<action…/>元素能够有多个<result…/>元素。这表示一个Action能够对应多个结果。
<!--登录的action--> <action name="login" class="lps.demo.LoginAction"> <result name="success"> /success.jsp </result> <result name="login"> /login.jsp </result> </action>
(1) location:该参数指定了该逻辑视图对应的实际视图资源。
(2) parse:该参数指定是否容许在实际视图名字中使用OGNL表达式,该参数默认值为true。若是设置该参数值为false,则不容许在实际视图名中使用表达式。一般无需修改该属性值。由于一般无需指定parse参数的值。
<action name="login" class="lps.demo.LoginAction"> <result name="login"> /login.jsp </result> </action>
如下Struts2支持处理结果类型为转载☞:https://blog.csdn.net/fujiakai/article/details/51897533
struts2支持的处理结果类型
Struts2内建支持结果类型以下:
(1) chain结果类型:Action链式处理的结果类型。
(2) chart结果类型:用于整合JFreeChart的结果类型。
(3) dispatcher结果类型:用于FreeMarker整合的结果类型。
(4) httpheader结果类型:用于控制特殊的HTTP行为的结果类型。
(5) jasper结果类型:用于JasperReports整合的结果类型。
(6) jsf结果类型:用于与JSF整合的结果类型。
(7) redirect结果类型:用于直接跳转到其余URL的结果类型。
(8) redirect-action结果类型:用于制直接跳转到其余Action的结果类型。
(9) stream结果类型:用于向浏览器返回一个InputStream(通常用于文件下载)。
(10) tiles结果类型:用于与Tiles整合的结果类型。
(11) velocity结果类型:用于与Velicity整合的结果类型。
(12) xslt结果类型:用于与XML/XSLT整合的结果类型。
(13) plaintext结果类型:用于显示某个页面的原始代码的结果类型。
---------------------
堆栈ValueStack
valueStack是struts2的值栈空间,是struts2存储数据的空间
Strut2的Action类经过属性能够得到全部请求相关的值,要在Action类中声明与参数同名的属性或者以类名小写加属性名如:user.name,就能够得到这些参数值,在Struts2调用Action类的Action方法(默认是execute方法)以前,就会为相应的Action属性赋值。这项功能Struts2要依赖于ValueStack对象来实现,每一个Action类的对象实例会拥有一个ValueStack对象,这个对象贯穿整个Action的生命周期,
当Struts2接收到一个请求后,会先创建Action类的对象实例,但并不会当即调用Action方法,而是先将Action类的相应属性放到ValueStack实现类ONGLValueStack对象root对象的顶层节点。只是全部的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。在处理完上述工做后,Struts 2就会调用拦截器链中的拦截器,这些拦截器会根据用户请求参数值去更新ValueStack对象顶层节点的相应属性的值,最后会传到Action对象,并将ValueStack对象中的属性值,赋给Action类的相应属性。当调用完全部的拦截器后,才会调用Action类的Action方法。ValueStack会在请求开始时被建立,请求结束时消亡
值栈ValueStack
在基于HTTP协议的Web应用中
客户端请求的全部内容都以文本编码方式传输到服务器端,服务器端的编程语言却有着丰富的数据类型
Servlet中,类型转换工做由开发者本身完成,eg
3.valueStack底层相关的数据结构
CompoundRoot是继承了Arraylist的集合,里面存放Action的实例、代理对象、自定义对象(Student)等数据。