目录:
1)ognl:Object Graph Navigation Language
简介:ognl工作在视图层,可以简化数据的访问操作。struts2框架用ognl作为默认的表达式语言,用来从框架的不同区域用一种同样的语言来引用数据。与jsp内置的EL语言相比,他们都属于表达式语言, 但是ognl的功能更加强大,提供了EL不具备的功能。
ognl常用符号:
- #:
- 获取非根对象,如OGNL上下文,Action上下文等。
- 用于过滤和投影集合,如:person.{?#this.age>50}
- 在jsp页面中创建Map集合
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <%--ognl表达式:在jsp页面中创建List集合 --%> <s:iterator value="{'reic','rose','lisa'}" var="name"> <s:property value="#name" /> <br> </s:iterator> <hr> <%--在jsp页面创建Map集合 --%> <s:iterator value="#{1:'reic',2:'rose',3:'lisa'}" var="entry"> 编号:<s:property value="#entry.key"/>--姓名:<s:property value="#entry.value"/> <br> </s:iterator> </body> </html>
- %{ } : 把内容引入Ognl运行环境
<%--模拟从action传入userName的值 --%> <s:set var="userName" value="rose" scope="request"></s:set> <%--jsp页面获取userName的值 --%> <s:textfield name="username" value="#request.userName"></s:textfield>
直接这么写,jsp页面不会把textfield中的“#request.userName”当作ognl表达式,会直接在jsp页面中显示为#request.userName,如下所示
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:iterator value="{'rose','lisa','jack'}" var="name"> <s:property value="#name"/> </s:iterator> <hr> <%--模拟从action传入userName的值, value值要写ognl表达式 --%> <s:set var="userName" value="#request.name"></s:set> <%--jsp页面获取userName的值 --%> <s:textfield name="username" value="%{#request.userName}"></s:textfield> </body> </html>
- $:
- 在国际化资源文件中,引用ognl表达式。
- 在struts2的配置文件中,引用ognl表达式。
常用struts2标签:
常用的逻辑标签:参考文档
- <s:component>标签:当需要多次使用同一段代码时,就可以考虑使用改标签将重复代码定义为一个自定义组件。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:form> <s:component template="TemplateComponent.jsp"> <s:param name="interestlist"></s:param> <s:param name="booklist" value="{'Java', 'Python'}"></s:param> </s:component> </s:form> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head></head> <body> <s:checkboxlist name="interestlist" label="你的兴趣爱好" list="{'Sing', 'Programmer'}"></s:checkboxlist> <s:select list="parameters.booklist" labelposition="left" label="你喜欢的书"></s:select> </body> </html>
***注意:TemplateComponent.jsp必须放在WebRoot/template/xhtml文件夹下。
- property标签:用于输出指定值。输出value指定的值。
- set:用于将某个值放入指定范围
- push标签:将对象存入栈顶,不能放入其他范围,当标签结束,会从栈顶删除
- bean标签:实例化一个符合JavaBean规范的class,标签体内可以包含几个param元素,用于调用set方法给class对象赋值
-
action标签:通过指定命名空间和action名称,该标签允许在jsp页面中直接调用action。executeResult用于指定action的result是否需要被执行(即是否跳转到视图),默认为false。
-
iterator:用于对集合(List,Set, 数组)进行迭代。
-
<s:iterator value="{'java','python'}" var="name"> <s:property value="name"/><br> </s:iterator>
-
-
url标签:该标签用于创建url,可以通过param标签提供request参数。
常用UI标签:
- 表单标签: 表单标签将在html文档中被呈现为一个表单元素(代替html代码,帮助简化代码编写)
(在struts.xml中通过配置常量可以更改struts2表单标签的默认模板:<constant name="struts.ui.theme" value="simple"></constant>, 也可以在jsp页面任何struts2标签通过theme属性进行特定指定。)
- 非表单标签:用于生成页面上的树,Tab等的标签。
- Ajax标签
表单数据回显:
在一些编辑数据需求下要用到数据回显(从后台取数据,显示到页面),只需与后台变量同名即可,不需要自己写value值
防止重复提交:
通过token拦截器实现防止用户重复提交表单,它会得到页面的token值并放入session中,再次刷新时会将新一次的token与session中的token比较,如果一致则为重复提交。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="model" extends="struts-default" namespace="/model"> <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref> <global-allowed-methods>register</global-allowed-methods> <action name="user_*" class="c_modelDriver.UserAction" method="{1}"> <result>/success.jsp</result> <result name="invalid.token">/register.jsp</result> </action> </package> </struts>
<form action="${pageContext.request.contextPath}/model/user_register" method="post"> <s:text name="user"></s:text> <input type="text" name="name"> <s:text name="password"></s:text> <input type="password" name="password"> <%--在当前页面生成token --%> <s:token></s:token> <input type="submit" value='<s:text name="login"></s:text>'> </form>