struts2 之前没用过,也没打算学习,应为听大家说效率好像有点慢而且使用起来比较麻烦,但是换了工作后发现公司使用的是struts2所以只能用了,因为之前没学过(一点不了解)所以怎么访问的都会不,怎么办问人呗还好同时比较好,说了一通似懂非懂的用起来了,用着用着也就了解了怎么使用(不是说学会了Struts2),下面是个人感觉:
一、
Struts2 中的配置文件 package name 、namespace 以及 对象方法调用
在struts2 struts.xml 配置中
<struts>
<package name="caixuedong" extends="struts-default" namespace="/core">
<action name="greeting" class="com.tarena.struts2.action.GreetingAction" >
<result name="success">/core/greeting.jsp </result>
</action>
</package>
</struts>
1.package中的name只是一个标识,你可以随意命名,可以用作继承用 如
<package name="struts-default" abstract="true"></package>
extends="default";
2.action中的name对应你页面中的一个action跳转,比如你页面有个表单提交: <form action="/core/greeting" /> greeting 对应struts.xml中action里的name
3.namespace是用于区分包中相同的类,如果没写,说明该包为默认空间,如果写了(如你的这个例子),那么就说明包caixuedong的空间为/core。
============================================================
调用action 中的方法
配置方法一:直接配置方法路径
<package name="user" namespace="/user" extends="struts-default">
<action name="save" class="com.puckasoft.web.action.UserAction" method="saveUser"></action>
<action name="update" class="com.puckasoft.web.action.UserAction" method="updateUser"></action>
<action name="delete" class="com.puckasoft.web.action.UserAction" method="deleteUser"></action>
<action name="show" class="com.puckasoft.web.action.UserAction" method="showUser"></action>
</package>
用户添加 /user/save.action
用户更新 /user/update.action
用户删除 /user/delete.action
用户查看 /user/show.acton
配置方法二: action动态方法调用DMI
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="index" class="com.puckasoft.web.action.UserAction"/>
</package>
运行路径格式:包的命名空间/Action的名字!Action类中定义的方法名
用户添加 /user/index!saveUser.action
用户更新 /user/index!updateUser.action
用户删除 /user/index!deleteUser.action
用户查看 /user/index!showUser.acton
配置方法三:使用通配符定义Action
使用通配符,将配置量降到最低。
在action元素的name属性中可以使用*通配符,它可以匹配除了/以外的多个连续字符,在action元素的class和method属性以及 result元素中可以引用*通配符在访问期间实际匹配的内容
<package name="user" namespace="/user" extends="struts-default">
<action name="*" class="com.puckasoft.web.action.UserAction" method="{1}User"/>
</package>
运行路径路径格式: 包的命名空间/Action的名字
用户添加 /user/save.action
用户更新 /user/update.action
用户删除 /user/delete.action
用户查看 /user/show.acton
项目中具体使用列子如下:
<package name="hrd" extends="hrd-handler,error-handler">
<action name="staff_*" class="com.beizhi.hrd.web.action.StaffAction" method="{1}">
<result name="list">/jsp/hrd/staff/staff.jsp</result>
<result name="staff_list">/jsp/hrd/staff/staff_list.jsp</result>
<result name="add">/jsp/hrd/staff/add_staff.jsp</result>
<result name="examine">/jsp/hrd/staff/staff_examine.jsp</result>
<result name="sview">/jsp/hrd/staff/staff_sview.jsp</result>
<result name="birthday">/jsp/hrd/staff/birthday.jsp</result>
<result name="birthdayList">/jsp/hrd/staff/birthdayList.jsp</result>
<result name="staff_portrait">/jsp/hrd/staff/staff_portrait.jsp</result>
</action>
其中的package 中的name随便定义
action 的定义就有意义了,name="staff_*" class ="" 当我们访问这个class对应的action层的方法是,方法的开始必须是staff_而完整的路径就是 staff_methodName ,其中“methodName”就是action中的对应的方法名称。
看到下面的result 标签我们看到了name属性,name的值就是action层中的方法返回的值,而这个名称的值对应着一个页面的路径,也就是action层的方法将数据返回到这个name指定的页面去。
这样这个访问返回就了解了一些。
具体代码如下:
这里就以<result name ="list">/jsp/hrd/staff/staff.jsp</result>为列
当 <form action="staff_list.do"> 请求发送后被Struts2的控制器指定到了StaffAction层的list(){}方法
<span style="font-size:14px;">public String list(){
time = new Date().getTime()+"";
Staff staff = (Staff) session.getAttribute(Constants.USER_SESSION);
departList = departmentService.list("from Department where status=0 and company=?", staff.getCompany());
List<Object> list = new ArrayList<Object>();
Map<String, Object> mapNo = new HashMap<String, Object>();
mapNo.put("id", "10000");
mapNo.put("name", "未分类");
mapNo.put("child", new ArrayList<Map<String,Object>>());
list.add(mapNo);
for(Department dp:departList){
if(dp.getParent() == null || "".equals(dp.getParent())){
Map<String, Object> map = new HashMap<String, Object>();
List<Map<String, Object>> listChild = new ArrayList<Map<String,Object>>();
map.put("id", dp.getId());
map.put("name", dp.getName());
map.put("child", listChild);
list.add(map);
}
}
objList = get_child(list,departList);
return "list";
}</span>
这个就是action层的方法。最后return "list";方法中的"list" 和配置文件中的<result name="list">是对应的,这样就返回到了result 的name对应的页面去了,然后就是使用struts2标签来添加数据。
Staff.jsp页面部分代码:
<span style="font-size:14px;"><s:iterator value="objList" var="ol">
<span style="white-space:pre"> </span><option value="${ol.id}">${ol.name}</option><span style="white-space:pre"> </span>
</s:iterator>
</span>
这样数据就添加了……
请求参数和返回数据:
从页面传参有两种方式,一种是同步一种是异步:
1、同步:
(1)、提交数据:
同步提交数据和使用其他框架或者不使用是一样的,直接提交,但是struts2action接收数据的方法和springmvc或者Servlet有很大的区别,Struts2有个共享数据,也就是在action层定一些成员变量,这些变量的名称要和前面页面的参数一样的。当前台提交了数据后action层就不用想springmvc 获取servlet的方式自己去获取值,而是struts2会给你定的成员变量赋值你可以拿着他直接使用。
(2)、返回数据:
当我们页面提交的数据后会做一些业务处理,当业务处理完后会把获取的数据传到页面,springmvc向前台传递数据的方式也是很多,但是不管哪种方式都学要我们自己去给变量赋值在返回页面获取,而在struts2中你只需要将获取的数据赋值给你之前定义的那些成员变量然后你返回页面,使用struts2的标签就可以展示了
这样同步相关的就完了,你可能返现了,这个和springmvc 和servlet 的区别还是挺大的。之前的获取参数还是返回的数据都是在方法中定义变量但是现在struts2中都是在类中定义成员变量,整个页面可以共用这些成员变量。
2、异步
(1)、提交数据
提交数据还是和之前一样没有什么区别,唯一要注意的就是名称要和action层定义的变量名称一样,不然接收不到数据。
(2)、返回数据
返回数据有两种情况,如果你将获取的数据复制给那些action层的成员变量,你在页面使用struts标签是能获取值的,而如果将值直接out.print()打印出来,则ajax的success:function(data){ }能获取值,而且这里返回的值你可以使用方法中定义的变量来赋值。
ok简单了解了一下struts2,了解了和Action层的交互。