获取后台数据:
1.<s:property value="name"/>前提是后台action中有name这个属性
2.
后台中:
this.addActionMessage(" ");
this.addActiionError(" ");
this.addFieldError("name", "name is error");
前台用:
<s:actionmessage/>
<s:actionerror/>
<s:fielderror fieldName="name" theme="simple"/>
<s:property value="errors.name[1]"/>
3.(一般用IoC代替)
后台用:
private Map request;
private Map session;
private Map application;
request = (Map)ActionContext.getContext().get("request");
session=ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
request.put("name", user.getName());
session.put("name", user.getName());
application.put("sex", user.getSex());
前台用:
<s:property value="#request.name"/>
如:UserDao().select()返回所有user对象,其有属性name,sex,password,eamil
private Map request = (Map)ActionContext.getContext().get("request");
List<User> list = new UserDao().select();
request.put("user", list);
<s:iterator value="#request.user">
<s:if test="sex.equals(\"female\")">
<s:property value="name" /> <s:property value="sex" /> <s:property
value="email" /> <a href="http://dusiguxia.blog.163.com/blog/work3/work2/update.jsp">修改用户信息</a>
<br />
</s:if>
<s:else>
<s:property value="name" /> <s:property value="sex" />
<a href="http://dusiguxia.blog.163.com/blog/work3/work2/update.jsp">修改用户信息</a>
<br/>
</s:else>
</s:iterator>
获取前台url中的参数:
<%String name=request.getParameter("age");%>
提交表单:后台的action中有user对象属性,user对象有属性name,sex,password,eamil
<form name="myform" action="<%=path%>/work3_2_2" method="post">
<s:textfield name="user.name" label="用户名" ></s:textfield><br>
<s:password name="user.password" label="密码"></s:password><br>
<s:radio list="#{'male':'男', 'female':'女'}" name="user.sex" label="性别" listKey="key" listValue="value"></s:radio><br>
<s:textfield name="user.email" label="邮箱"></s:textfield>
<s:submit value="提交"></s:submit>
</form>
IoC: inverse or control 控制反转(DI:dependency inject 依赖注入)
客户端请求到来,Struts2调用相应的action。查询其是否实现了RequestAware,SessionAware,ApplicationAware,如果实现了,就把自己获取到的Request,Session,Application赋给action中的Request,Session,Application。
Domain model:真正存在的实体概念
Action里的属性就是user对象,从前台user.name,user.age中获取user对象的属性,然后通过action的setUser()方法生成user对象,getUser()方法返回对象,至此一个对象便可以放到实体数据库中。
DTO :data transfer object
Action里的属性就是userDTO对象,从前台userdto.name,userdto.age,userdto.password中获取userDTO对象的属性,然后通过action的setUserDTO()方法生成userDTO对象,getUserDTO()方法返回对象,然后再在userDTO对象所属的类通过已经获取的userDTO对象(利用其user所需要的属性),生成一个use对象,至此一个对象便可以放到实体数据库中。
Struts.xml常用配置:
<struts>
<constant name="struts.devMode" value="true">
<constant name="struts.i18n.encoding" value="gbk">
<package name="" namespace="" extends="struts-default">
<default-action-ref name=""></default-action-ref>
<action name ="" class="" method="">
<result>
</result>
</action>
</package>
</struts>
Result属性:
<result type=""> type有dispatcher(默认)redirect chain redirectAction前两个是跳转到jsp文件,后两个是跳转到action(即action的名字)。
</result>
全局result
<global-results>
<result name=""></result>
</global-results>
Action里的属性值放在值栈里,可以通过<s:property value="属性名">获取,如果result的type="dispatcher",那么它访问的jsp文件共享这个值栈,如果type="redirect",那么它访问的jsp文件不共享这个值栈,也就不能在该jsp文件中通过<s:property value="属性名">来获取action中的属性值,只能通过<s:property value="#parameters.属性名">来获取。
OGNL object graph navigation language
初始化domain model:
在action里直接new
从前台传参数初始化,此时需要保持domain model要有参数为空的构造方法,同时传参数是要用对象名.参数的方式传。
访问普通方法:(action中有name属性和domain model user)
<s:property value="name.length()"/>
<s:property value="user.age"/>
<s:property value="user.getName()"/>
<s:property value="user.loginuser.getName()"/>
访问静态方法:
<s:property value="@com.yjx.struts.UserAction@getName()"/>
<s:property value="@com.yjx.struts.UserAction@age"/>
访问构造方法:
<s:property value="new com.yjx.struts.User("hellen")"/>
过滤:(users是list类型,里面放的是domain model user)
<s:property value="users.{?#this.age==1}[0].age"/>
<s:property value="users.{^#this.age>1}{age}"/>
<s:property value="users.{$#this.age>1}{age}[0]"/>
对于<reusult type="dispatcher">的服务器端跳转,struts会把跳转后用到的action按先后顺序压进值栈中,这样就会在值栈中出现多个action。
Struts标签:
Property tags:
<s:property value="username"/><br>
<s:property value="'username'"/><br>
<s:property value="admin" default="管理员"/><br>
<s:property value="'<hr/>'" /><br>
<s:property value="'<hr/>'" escape="false"/><br>
set tags:
<s:set var="name" value="'yjx'" scope="session"/><br>
<s:property value="#session.name"/><br>
<s:set var="name" value="'username'"/><br>
<s:property value="#request.name"/><br>
bean tags:
<s:bean name="com.bjsxt.struts2.action.domainmodel.User" var="user"><br>
<s:param name="name" value="'yjx'"></s:param><br>
</s:bean><br>
<s:property value="#user.name"/><br>
include tags:
<s:set var="include" value="'/Hello.jsp'"/><br>
<s:include value="%{#include}"/><br>
iterator tags:
<s:iterator value="{'aaa','bbb','ccc'}" var="t" status="status"><br>
<s:property value="#t.toUpperCase()"/>
<s:property value="#status.count"/>
<s:property value="#status.index"/>
<s:property value="#status.odd"/>
<s:property value="#status.even"/>
<s:property value="#status.first"/>
<s:property value="#status.last"/><br>
</s:iterator>
<s:iterator value="#{1:'a',2:'b',3:'c'}">
<s:property value="key"/>|<s:property value="value"/><br>
</s:iterator>
Action中的异常处理:
在struts.xml的action中:
<exception-mapping result="error" exception="java.sql.SQLException"></exception-mapping>
<result name="error">error.jsp</result>
也可以定义全局exception-mapping和全局result:
<global-exception-mappings result="error" exception="java.lang.Exception">
</global-exception-mappings>
<global-results>
<result name="error">error.jsp</result>
</global-results>
类型转换:
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<base href="<%=basePath%>">
response.setHeader("Refresh","1; URL=http://localhost:8080/mybbs1.1/admin/index.html");