在
JSP中使用JSTL,如需要使用<c:forEach></c:forEach>标签,则需要将list对象绑定到request中;
具体操作可以参见http://www.cnb
logs.com/lihuiyy/archive/2012/02/24/2366806.html在Struts2中获取request,最好使用
ServletRequestAware
接口,并实现setServletRequest
<h2>
<c:choose>
<!-- <c:when test="${page>1 }">表示if(page>1) -->
<c:when test="${page>1 }">
<a href="
projectlist.action?page=${page-1}"> 上一页</a>
</c:when>
<c:otherwise>上一页</c:otherwise>
</c:choose>
|第${page}页|
<c:choose>
<c:when test="${page<pagenum}">
<a href="projectlist.action?page=${page+1}">下一页</a>
</c:when>
<c:otherwise>下一页</c:otherwise>
</c:choose>
|共${pagenum}页
</h2>
OGNL
表达式
EL表达式把数据从四个范围(pageContext、request、session、application)中取出来显示或者计算。
EL表达式解决了Java代码和HTML的不匹配问题(让html页面中不再有java代码)。
EL表达式用字符串表达式替换Java代码,用来表示对数据的获取或计算。
【OGNL表达式类似EL表达式,但功能更强大】
1.基本类型属性(包括String)
例如: id,name
2.数组和List
例如:arry[0], list[1]
3.Map
例如:map['key'], map.key
4.基本运算
5.调用方法
6.调用
静态方法
7.
创建对象List,Map
创建List: {1,2,3,4,5}
创建Map: #{'one':'java','two':'javajava'}
8.关联属性(不常用,
理解即可)
empList[1].name
9.投影(不常用,理解即可)
empList.{name}
10.过滤(丌常用,理解即可)
empList.{?#salary>10000}
OGNL引擎:Ognl引擎、root对象、context对象
root对象:Ognl操作的对象
context对象:一个Map,用于存放一个和整个系统都相关的公共数据;【数据都是每一次访问都需要用到】
ValueStack
Struts2在请求到来时,首先会创建一个ValueStack;
然后,把当前的Action对象放入栈顶(CompoundRoot);
Struts2会把ValueStack存放在request中,属性为"
struts.valueStack", 所以,标记库可以访问到ValueStack
利用ValueStack获得数据
通过ognl从ValueStack取数据,并显示
<s:property value="ognl..."/>
省略value,取出ValueStack的栈顶
<s:property />
通过ognl从ValueStack取出集合,依次将集合中的对象置于栈顶,在
循环中,ValueStack栈顶即为要显示的数据
<s:iterator value="ognl...list"> <s:property value="name"/> </s:iterator>
使用<s:iterator>标签时,其value的值需要与action类中属性的getXXX方法的XXX相对应
其帮助文档可访问struts-2.3.16.3/docs/tag-developers-guide.html
Action
基本原理
1.每次请求都会创建一个新的Action的实例,因为每次请求都对应一个单独的Action,所以不需要考虑
线程安全问题。
2.Action对象将置于ValueStack的栈顶
3.Action的业务方法(默认为execute)根据输入算输出
Action访问Session和Application
1.ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
Map application = ctx.getApplication();
session和application存放在ValueStack的Context中
<s:property value="#session..."/>
<s:property value="#application..."/>
2.通过SessionAware接口访问session【更好】
新建BaseAction implements SessionAware
所有需要session的XXXAction extends BaseAction
类似的,还有: ServletRequestAware ServletResponseAware ServletContextAware
3.使用
通配符配置ACTION
{1}:表示第一个*的匹配的字符串;{2}表示第二个*匹配的字符串;{3}表示第三个*匹配的字符串
<action name="*_*_*"
class="com.tarena.outman.{1}Action" method="{2}">
<result name="success">/WEB-INF/jsp/day03/{3}.jsp</result>
</action>
4.给Action注入参数
<param name="rowsPerPage">5</param>
5.在result的配置中使用OGNL表达式【转发】
<result name="success" type="dispatcher">
/WEB-INF/jsp/day03/user.jsp?userId=${user.userId}
</result>
RESULT
生成视图
<result name="success" type="dispatcher">
/WEB-INF/jsp/day03/user.jsp?userId=${user.userId}
</result>
常用类型
dispatcher【转发】
redirect【重定向】
redirectAction【与redirect效果相同,只需在result节点写action的名字】
stream
json
struts中的form表单字段绑定
<input type="text" name="project.name" />
java.util.Date
cannot be cast to java.sql.Date如何转化
new Date(project.getEndDate().getTime())
给表单赋值
<%@ taglib prefix="s" uri="/struts-tags" %>
<input type="text" name="project.name" value="${Project.name}" />
利用标签做循环
<s:iterator value="Projectlist">
<tr>
<td><input type="checkbox" name="projects" value="${id}" /></td>
<td><a href="Project_load.do?id=${id }"><s:property value="id" /></a></td>
<td><s:property value="name" /></td>
<td><s:property value="startDate" /></td>
<td><s:property value="endDate" /></td>
</tr>
</s:iterator>
标记库
具体可以参见API:struts-2.3.16.3/docs/tag-reference.html
拦截器
API:struts-2.3.16.3/docs/interceptors.html
interceptor-stack:拦截栈,可包含若干个对与拦截器的引用
"basicStack"拦截器是Struts2的核心拦截器
拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口
<!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->
<constant name="struts.action.extension" value="action,do,go,xkk" />
Action中获取struts2标签<s:file>中的值注意事项
private File upload;上传的文件,就是<s:file name="upload"/>
private String uploadFileName;
文件名 private String uploadContentType;文件类型;
action里对应的getter和setter
如果你的s:file的name为file,就相应的fileFileName和fileContentType 请注意action配置加上<interceptor-ref name="fileUpload"/>
Struts2控制流程
1) 请求到来
2) 创建ValueStack(Action放栈顶),进行初始化
3) 调用拦截器Interceptor,在拦截器中是可以访问ValueStack的
4) 调用Action,执行execute()方法
5) 调用Result,Result负责把数据显示给用户
6) 最后到页面,通过标记库(Taglib)取出数据
Struts2国际化
资源文件的加载遵循从"就近原则"
遇到的问题点
1.Dispatcher initialization
failed【struts的jar包没有添加全】
具体可以参看struts文件夹的docs
create-struts-2-web-application-with-artifacts-in-web-inf-lib-and-use-ant-to-build-the-application.html页面
2.文件上传: Unable to find 'struts.multipart.saveDir' property setting.
struts.xml配置文件中增加如下:
<constant name="struts.multipart.saveDir" value="/tmp"/>