开发者学堂课程【Java Web开发系列课程 - Struts2框架入门:自定义框架配置解析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/537/detail/7329
自定义框架配置解析
首先创建一个 new web project 名为 20myframework。
主要是模拟框架,学习一个框架主要是了解它、使用它、理解他的原理、查看他的源码,最后来实现它,是这样一个学习曲线。
至于掌握等级,如果掌握等级满级是5的话,这节课的掌握等级在1就可以了。
需要模拟的事情为:
req--->filter—do something—action
filter—解析配置文件(映射用户请求---action 中)---将用户提交的数据设置到 action 中。
首先创建一个 java package 名为 cn.sxt.filter,在创建一个名为 cn.sxt.util,再创建一个 new XML 名为 framework.xml 。
先写好配置文件:
<
framework>
<action
name
=
"he
l
lo"
class
=
"cn.sxt.action.HelloAction"
method= "he
l
lo">
</action
<result name="success" type= "redirect">/ index. jsp</result>
<result name="failed" type="redirect ">/index. jsp</result>
</action>
<
framework>
首先要解析这样的配置文件,在配置文件中 action 是一个实体类。现在就再写一个实体类。
创建 java package 名为 cn.sxt.core,在里面写一个实体类又名为 action。
Action 中源码为:
public class ActionMapper {
private String name;
private String classes;
private String method ;
}
在这个 action 里面有很多个 result,现在要把这些 result 写出来:
public class Result {
private String name;
private String type;
private String location;
}
现在把他们全部生成一下。
再通过无参的构造方法和有参的构造方法去构造配置。在 result 里面 Name 和 type 都是可以省略的。
但是要省略必须做一些事情,比如设置 name 的默认值为 success,type 的默认值为 dispatcher,给它值就是可以省略,但是如果怕麻烦可以每次都配置好,配置好就不用省略了,解析她的时候就会更加简单。如果它有默认值就不需要再赋值了,但是有默认值解析时就会多一道工序。
回到 action 中,补完代码:
public class ActionMapper {
private String name;
private String classes;
private String method ;
private Map<String, Result> resultMap=new HashMap<String,
Result>();
}
为什么在 result 里面放 map 进去,非常简单,在 action 执行完了之后反回了一个 result 回来,对于 action 来说,会直接根据 result 去跳转一个位置,对于 result 来说一个名称是唯一的,加入 map 进去查找会变得更加简单。
然后也生成一下他的构造方法,不要 resultmap,method 也可以让他设置一个默认值,查看 method 有没有这个属性,有没有默认值,如果没有也可以设置一个默认值为 execute,全都写好之后可以去解析配置文件 framework.xml。
创建一个 java 为 actionmapper,在 actionmapper 里面进行解析,得到解析出来的结果。把 dom4j 的 jar 包拷贝过来,查看文档。在 dom4j里面可以看到一系列的配制方法。
Actionmapper 代码为:
public class ActionMapper i
public static Map<String, Action> actionMap = new HashMap<String,
Action>(
);
public static void parser( ){
InputStream is=ActionMapper . class . getClassLoader() .
getResourceAsStream( "framework. xml") ;
Document document = new SAXReader().read(is);
Element
root
= document . getRootElement();
System. out . println( root. getName());
}
}
Inputstream 是读取文件 src 里面的内容。写完之后测试一下,先写一个测试包 cn.sxt.test。
Test 代码:
public class Test {
public static void main(String[ ] args) throws
DocumentException {
ActionMapper . parser();
}
}
执行一下可以看到取出的结果 framework。
然后还要取 action,要在 actionmapper 里处理 action 的节点。
//处理 action 节点
List<Element> actions=root. elements( );
for( Element element: actions ){
Action action = new Action( );
System. out . println( "name="+element .
attributeValue( "name"));
System. out . println( "method= "+element . attributeValue( "method"
));
}
在迭代里面创建 action 的对象,在里面获取对象的属性,最后结果得到了 name=hello,mathod=mull。
Method 假如不去处理它,得到的是空值 null,意思就是不为空的时候我们才去处理它。
//获取 action 的属性值
action. setName( element . attributeValue( "name") ) ;
action. setClasses( element. attributeValue("class"));
String method=element . attributeValue( "method");
if (method ! =null)
action. setMethod (method) ;
这里只是做一个其中的案例,具体的试验需要同学们自己去处理。
//处理 Action 中的结果集
List<Element> results = element. elements();
for( Element e: results){
Result result = new Result( ) ;
String resultName = e. attributeValue("name")
string resultType = e. attributeValue("type")
if(resultName !=null )
result . setName ( resultName );
if( resultType ! =null )
result. setType(resultType);
result. setLocation(e. getStringValue());
}
注意凡是有默认值的都应该像 name 和type 一样去处理。
//将 Result 对象添加到 Action 中
action. getResultMap() . put (result. getName(), result);
}
//将 Action 放入到 actionMap 中
actionMap. put (action. getName(), action);
}