Structs修改后自动更新
<constant name="struts.devMode" value="true" />
Action执行的时候并不一定要执行execute方法<br />
<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction"
method="add">
<result>/user_add_success.jsp</result>
</action>
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />
<a href="<%=context %>/user/userAdd">添加用户</a>
<br />
<a href="<%=context %>/user/user!add">添加用户</a>
<br />
前者会产生太多的action,所以不推荐使用
必须使用绝对路径
<% String context = request.getContextPath(); %>
<a href="<%=context %>/actions/Studentadd">添加学生</a>
或者
<base href="<%=basePath %>"/>
通配符配置
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
Structs2接收参数的方式有三种:
ActionAttrParamInput
DomainModelParamInput
ModelDrivenParamInput
Structs 标签
<%@taglib uri="/struts-tags" prefix="s" %>
<s:debug></s:debug>
s:property 标签能把 Value Stack 和 Stack Context 里面的内容取出来
<s:property value="errors.name[0]"/> 直接写名字就行了
Stack Context 则需加#号<s:property value="#request.r1"/>
访问Web元素
使用依赖注入
首先implements RequestAware,SessionAware, ApplicationAware
然后实现他们的方法
最后把所要放入的值,put()进去
模块包含
<include file="login.xml" />
默认action引用(即使输入不存在的action,也可以显示默认的action)
<default-action-ref name="index"></default-action-ref>
Action 总结
1.实现一个Action的最常用方式:从ActionSupport继承
2.DMI动态方法调用
3.通配配置*{1}{2}
*-*
4.接引参数的方法(一般用属性或者DomainModel来接收)
5.简单参数验证
a)一般不使用Struts2的UI标签
6.访问Web元素
a)Map类型
i IOC
ii 依赖Struts2
b) 原始类型
i IOC
ii 依赖Struts2
7.饮食文件配置
8.默认action处理
Result type跳转
服务器跳转
<result type="dispatcher">/r1.jsp</result>
客户端跳转
<result type="redirect">/r2.jsp</result>
action跳转
<result type="chain">r1</result>
(
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
)
<result type="redirectAction">r2</result>
result里的包继承
<package name="admin" namespace="/admin" extends="user">
动态结果集(用的并不多)
<result>${r}</result>
r跟据Action里面的值动态决定
Result总结
1.常用四种类型
a) dispatcher(默认)
b) redirect
c) chain
d) redirectAction
2。全局结果集
a) global-results|extends
3.动态结果(了解)
a) 在action中保存一个属性,存储具体的结果location
4.传递参数
a)客户端跳转才需要传递
b)${}表达式(不是EL)
OGNL
1.user.xxx只有传值,才会构造,想初始化 domain model可以自己new,也可以伟值
但必须要有空的构造方法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
%的作用强制把{}里的东西不当字符串而是把它当成OGNL表达示
访问值栈中的值
Struts-Tags
1.通用标签
a)property
b)set(只使用value,var,scope)
c)bean
d)include(以后少用)
2.控制标签
a) if elseif else
b) iterator(var,status)
3.UI标签
a) theme
i. simple shtml(默认)css.xhtml.ajax
5.$#%的区别
a) $用于il8n和sturts配置文件
b) #取得ActionContext的值
c) %将原体的文本属性解析为ognl,对于本来就是ognl的属性不起作用。
i 参考<s:property>和<s:include>
定义自己的theme
1 css(覆盖 struts2原来的css)
2 覆盖单个文件
3 定义自己的theme
4 实战(把所有主题定义为simple,fielderror行列处理,自己控制期货标签的展现)
命名约定
EXT框架
mysql mangement lite
SQL> create table category(
2 id int primary key,
3 name varchar(50),
4 description varchar(200)
5 );
SQL> create sequence cateid
2 start with 1
3 increment by 1
4 nocache
5 nocycle
6 order;
1 create or replace trigger zizeng_zhang
2 before insert on category
3 for each row
4 begin
5 if :new.id is null then
6 select cateid.nextval into :new.id from dual;
7 end if;
8* end zizeng_zhang;
SQL> /
声明式异常处理
1.在Action中进行异常映射
2.在Package中进行全局异常映射
3.使用继承共用异常映射
4.Struts2中异常处理由拦截器实现(观察Struts-default.xml)
a)实际上Struts2的大多数功能都由拦截器实现
default-action-ref慎用
国际化问题
I18n
app_zh_CN.preperties
1.I18N原理
a) ResourcBundle 和Locale的概念
b)资源文件
c)Native2
2.Struts的资源文件
a) Action-Package-App级
b) 一般只用APP
<constant name="struts.custom.i18n.resources" value="bbs2009"></constant>
<s:text name="welcome.msg">
//传参数
<s:param value="username"></s:param>
</s:text>
c)动态语言切换
再写一个LangAction 传一个参数 request-local=en_US
类型转换
public class MyPointConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass)
{
Point p = new Point();
String[] strs = (String[])values;
String[] xy = strs[0].split(",");
p.x = Integer.parseInt(xy[0]);
p.y = Integer.parseInt(xy[1]);
return p;
}
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
return o.toString();
}
}
三种注册方式
1.局部:XXXAction-conversion.properties
1.p(属性名称)=converter
2.全局
xwork-conversion.properties
3.Annotation
如果遇到非常麻烦的映射转换
1.request.setAttribute();
2.session;