struts2使用教程,搭建struts2框架的步骤
一:支柱2运行机制:
雄猫一启动,一些信息就已经加载完成,例如StrutsPrepareAndExecuteFilter加载的那些strut.xml以及行动的班级类文件
1)客户端在浏览器中输入一个全球资源定位器(统一资源定位器)地址,例如http://本地主机:8080/用户!findUser.do。
2)这个全球资源定位器(统一资源定位器)请求通过超文本传送协议(超文本传输协议的缩写)协议发送给雄猫。
3)雄猫根据全球资源定位器(统一资源定位器)找到对应项目里面的web.xml文件。
4)在web.xml里面会发现有支柱2的配置。
5)然后会找到支柱2对应的struts.xml配置文件。
6)根据全球资源定位器(统一资源定位器)解析struts.xml配置文件就会找到对应的班级。
7)调用完班级返回一个字字符串,根据struts.xml返回到对应的jsp。
二:支柱2运行原理(网络摘抄)
上图来源于支柱2官方站点,是支柱2的整体结构。
一个请求在支柱2框架中的处理大概分为以下几个步骤:
1) 客户端初始化一个指向小型应用程序容器(例如Tomcat)的请求。
2) 这个请求经过一系列的过滤器(过滤器).
3) 接着滤器被调用,FilterDispatcher询问决定需要调用某个来决定这个请是否需要调用某个行动。
4) 如果决定需要调用某个决定需要调用某个滤器操作把请求的处理交给ActionProxy
5)动作代理通过配置管理器询问框架的配置文件,找到需要调用的行动类。
6)动作代理创建一个实例使用命名模式来调用的实例。
7)动作调用实例使用命名模式来调用,在调用行动的过程前后,涉及到相关拦截器(拦截机)的调用。
8) 一旦行动执行完毕,动作调用负责根据struts.xml中的配置找到对应的返回结果。
支柱2的核心就是拦截器Struts.xml中所有的包裹都要extends=struts-default 。同理与所有的爪哇类都要延伸自目标一样struts-default.xml里面就是要做以上事情。
三:下面带大家自定义简单的实现一下支柱2
1、创建存放解析支杆后的文件,保存里面的名字和班级以及结果结果的地图集合
包com。s . bean
导入Java。util。hashmap
导入Java。util。地图;
公共类操作Xml {
//对应存放的名字
私有字符串名称;
//对应存放的班级
私串班级
//对应存放的那些结果,保存结果Xml bean结果
私有映射结果=new HashMap();
公共字符串getName() {
返回名称;
公共void集合名称(字符串名){
this.name=name
公共字符串getClazz() {
返回班级
公共空集合分类(字符串分类){
这个。克拉兹=克拉兹
公共地图getResults() {
返回结果;
公共void setResults(地图结果){
this.results=结果;
2、创建存放解析支杆后的文件,保存里面的结果文件信息
包com。s . bean
公共类结果Xml {
//名称
私有字符串名称;
私有字符串值;
公共字符串getName() {
返回名称;
公共void集合名称(字符串名){
this.name=name
公共字符串getValue() {
返回值;
公共void setValue(字符串值){
这个值=值
3、创建解析可扩展置标语言的类文件
包com。解析;
导入Java。io。文件;
导入Java。util。hashmap
导入Java。util。列表;
导入Java。util。地图;
导入org。dom4j。文档;
导入org。dom4j。文档异常;
导入org。dom4j。元素;
导入org。dom4j。io。sax阅读器;
导入com。大豆。动作XML
导入com。大豆。结果XML
公共类ParseXml {
私有静态映射字符串,ActionXml map=new HashMap字符串,ActionXml
公共ParseXml(){
公共静态映射字符串,ActionXml getXML(){
SAXReader sax=new SAXReader();
文档文档=空;
尝试{
doc=sax。阅读(线程。当前线程().getContextClassLoader().getResourceAsStream( struts。XML’);
} catch (DocumentException e) {
//TODO自动生成的捕捉块
e。printstacktrace();
//得到根目录
元素根=doc。getrootelement();
//得到所有行为配置
list list=root。elements();
对于(对象对象:列表){
ActionXml ax=new ActionXml();
Element a=(Element)obj;
斧头。setname(一个.属性值( name ));
斧头。setclazz(a .属性值( class ));
//得到所有结果
列表结果=a . elements();
对于(对象obj1:结果){
结果XML rx=新结果XML();
Element r=(Element)obj 1;
rx。setname(r .属性值( name ));
rx。setvalue(r . gettext());
ax.getResults().put(rx.getName()、rx。getvalue());
//将所有的行为的配置读取出来,放入到一个地图中
map.put(ax.getName(),ax);
4、创建过滤器,雄猫启动后,struts.xml中的文件被解析,并且对应的班级文件实体被创建,使用了反射,相当于支柱2中的滤器
包com。美国过滤器;
导入Java。io。io异常;
导入Java。io。版画家;
导入Java。郎。反思。invocationtargetexception
导入Java。util。地图;
导入javax。servlet。过滤器;
导入javax。servlet。过滤链;
导入javax。servlet。过滤器配置;
导入javax。servlet。servlet异常;
导入javax。servlet。servlet请求;
导入javax。servlet。servlet响应;
导入javax。servlet。http。http servlet
导入javax。servlet。http。http servlet请求;
导入javax。servlet。http。http servlet响应;
导入com。大豆。行动;
导入com。大豆。动作XML
导入com。解析。解析XML
导入com。星期日org。阿帕奇。公地。豆制品。bean utils
公共类DispatherFilter实现筛选器{
//专门放配置的地图
私有静态映射字符串,ActionXml映射
公共void do过滤器(servlet请求arg 0,servlet响应arg1,
滤波器链arg2)引发IOException,ServletException {
//TODO自动生成的方法存根
http servlet请求request=(http servlet请求)arg 0;
//得到表单请求的名字,比如a
字符串actionName=request。getrequest uri().split(/)[2].拆分( . )[0];
//根椐表单请求的名字找到对应的处理类
动作XML ax=map。get(动作名);
string clazz=ax。get clazz();
字符串结果="";
尝试{
class cla=class。forname(clazz);
object obj=cla。新实例();//根椐班级产生接收和处理数据的对象
//将表单中的数据交给该目标文件
BeanUtils.populate(obj,request。getparametermap());
Action Action=(Action)obj;
结果=行动。执行();//执行方法后得到结果
//根椐结果找到对应的要跳转的界面
字符串结果页=(String)ax。获取结果().获取(结果);
//根椐结果页面跳转
请求。getrequestdispatcher(结果页).正向(arg0,arg 1);
} catch(ClassNotFoundException e){
//TODO自动生成的捕捉块
e。printstacktrace();
} catch(实例化异常e){
//TODO自动生成的捕捉块
e。printstacktrace();
} catch(IllegalAccessException e){
//TODO自动生成的捕捉块
e。printstacktrace();
} catch(InvocationTargetException e){
//TODO自动生成的捕捉块
e。printstacktrace();
public void destroy() {
//TODO自动生成的方法存根
公共void init(FilterConfig arg0)引发ServletException {
//TODO自动生成的方法存根
map=解析XML。获取XML();//读取配置
这样,一个小型的框架就完成了,它里面包含雄猫启动后对struts.xml文件的解析,以及行动类的实体化,这样我们只要定义我们的行为实现类和加入我们的struts.xml就可以灵活驾驭这个框架了。
5、定义struts.xml
?可扩展标记语言版本=1.0 编码=UTF八号?
支杆
动作名称=a
结果名称=success /success.jsp /result
结果名称=fail /fail.jsp /result
结果名称=ok /ok.jsp /result
/操作
/struts
6、定义我们的行动的实现类
包com。s . bean
导入Java。io。可序列化;
公共类用户实现可序列化的操作{
private static final long serial version uid=-4293478837686410970 l;
私有int uid
私有字符串显示操作系统信息
私有字符串upwd
public int getUid() {
返回用户界面设计(User Interface Design的缩写)
public void setUid(int uid) {
this.uid=uid
公共字符串getUname() {
返回显示操作系统信息
public void setUname(String uname){
this.uname=uname
公共字符串getUpwd() {
返回upwd
public void setUpwd(String upwd) {
this.upwd=upwd
//处理数据的方法
公共字符串执行(){
//在这里操作数据库
如果(uname。等于(管理){
返回"失败";
}否则{
返回“成功”;
7.测试页面,或者使用超链接测试:http://localhost:8080/a.do?uname=aaa upwd=bbb:
表单操作=a.do 方法=post
用户名:input type= text name= uname /br
密码:input type=text name=upwd/br
输入=提交值=提交/
/表单
解析:
Tomcat已经启动,执行DispatherFilter中的init方法,解析struts.xml文件,相应的信息保存在全局变量的映射中。
当用户访问http://localhost:8080/a.do?Uname=aaaaupwd=BBB,转到DispatherFilter并解析超链接request.getrequesturi()。split (/) [2]。拆分( . )[0]通过DispatherFilter,在动作中获取名称,然后通过parsexml类获取对应的class类,再利用反射机制创建其实体。系统默认执行其中的execute方法,获取相应的字符串信息。根据返回的字符串信息,通过解析XML找到对应的结果页面,然后通过Request。GetRequest调度程序(结果页)。正向(arg0,arg 1);跳转到相应的页面,得到相应的结果。
结合struts2的原理,我们发现struts2中的FilterDispatcher相当于我们的自定义Dispatcher,其中的ActionMapper是我们自己的全局变量map。至于struts2中的ActionProxy和配置管理器,这里不涉及动作调用和(拦截器),用户可以反过来自己实现。这里我们简单实现一下struts2的原理,仅供参考!
下载源代码:http://download..net/detail/harderxin/5229826