Struts2 $,#,%详解及实例代码
最近在学ssh,一直搞不懂$,%,#的区别,做了点小练习,慢慢也懂了一点,将自己所学的也记录下来吧。
存在一下一个实体entity:
public class Person { private int id ; private String Name ; public int getId() { return id; } public Person(int id, String name) { super(); this.id = id; Name = name; } public Person() { super(); } public void setId(int id) { this.id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } }
在struts2的Action中,写了如下代码:
@Override public String execute() throws Exception { //application Person p = new Person(1,"zhangsan") ; ActionContext.getContext().getApplication().put("person", p); //session Person p1 = new Person(3,"wangwu"); ActionContext.getContext().getSession().put("person", p1); //request Person p2 = new Person(2,"lisi"); ActionContext.getContext().put("person", p2) ; //servletContext Person p3 = new Person(5,"xiaoming"); ActionContext.getContext().getContextMap().put("person", p3); Person p4 = new Person(3,"wangwu"); ActionContext.getContext().getValueStack().push(p4); return "success"; }
分别在application,session,request,servletContext,valueStack中存入一个person对象,那么在JSP中我们可以按照一下方式获取:
person: <input type="text" name="name" value="${person }" /><br /> id: <input type="text" name="name" value="${person.id }" /><br /> name: <input type="text" name="name" value="${person.name }" /><br /> <hr>
以上代码所得出的person信息时xiaoming的,即ActionContext.getContext().getContextMap()中存放的信息,通过查询$的用法,发现$获取对象的方式是有方式的,即
ActionContext.getContext().getContextMap() > ActionContext.getContext() >ActionContext.getContext().getSession() >ActionContext.getContext().getApplication(),对于不同的scope(范围)中存在同名对象时,$的查找方式将会按照以上步骤进行,找到即输出,没有找到继续上一级查找,到顶不存在时将输出null。
那么$的用法为:${scope.object.attribute}
scope的属性值为request,session,application,默认不写时将按照上述所说的方案查找,找到即输出相关属性值。
在struts标签中,存一个这样的:
<s:property value="#application.person"/>
可以看出,此时用到了#号,个人认为,其实#和$的用法完全是一样的,只要你将需要输出的对象装进不同范围的map(servletContext,request,session和application),在view中展示时,使用<s:property value="#scope.object.attribute">跟$理解完全是一样的。但是你在使用struts的标签时,比如:
<s:textfield name="person.name"></s:textfield>
完全可以理解为
<input type="text" name="persom.name" id="person.name" value="<s:property value="#person.name"/>" />
即struts的标签已经在HTML的text中给我们封装了<s:property value="#target.name"/>,可以给我省去很多代码的。
同理,那么#的用法为:<s:property value="#scope.object.attribute" />
当然完全可以使用struts2给我们定义的标签,这样完全可以省去写过多重复代码的麻烦。其实#还有其他的用法,比如用来构造map等对象,但是个人觉得在view中写过多代码的时代已经过去,这种用法已经没有太多的意义,况且这次我只写出在view展示的过程,因此其它地方不扯了。
最后,扯一点%的用法,简单的看,%{}就是字符串计算表达式,举个例子,view中存在某个环节,一般都存在CRUD等基本功能,对于add和uppdate功能,完全可以在同一个页面完成,不同的是我们提交的地址是不同的,比如可能只这样的:对于add方法,地址为user_add.action,对于udpate方法,地址为user_update.action,那么在form中,可以使用%进行判断:
<s:form action="user_%{ id == 0 ? 'add' : 'update' }"></form>
呵呵,这样以前的两个页面现在完全一个页面可以解决掉。
同理,%与struts中的if,ifelse等判断标签联合起来用得比较多,毕竟是比较的吗。。。。
<s:if test="%{false}"> <div>Will Not Be Executed</div> </s:if> <s:elseif test="%{true}"> <div>Will Be Executed</div> </s:elseif> <s:else> <div>Will Not Be Executed</div> </s:else>
最后,说说这个%很有用的做法,假设存在一个列表展示student全部及格的成绩(即不及格的成绩将不会展示在上面),如果使用的%将是非常简单的。不扯,先上代码:
public class Stduent implements java.io.Serializable{ private static final long serialVersionUID = -691038814755396419L; private int id ; private String name ; private int score ; private String subject ; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } /** * 此处判断成绩是否及格 * @param socre * @return */ public boolean isPast(int socre){ return getScore() > 60 ; } }
那么,现在数据库中查找学生成绩,放到list中暂时存放起来,在JSP页面,我们可以使用以下代码来控成绩制输出是否及格:
<s:iterator value="#allUser"> <!-- 判断是否过线,过线即输出,否则舍去! --> <s:if test="#session.user.isPast(score)"> name: <s:textfield name="name"></s:textfield> score: <s:textfield name="score"></s:textfield>\ subject:<s:textfield name="subject"></s:textfield> </s:if> </s:iterator>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- struts2+spring+hibernate分页代码[比较多]
- ajax+json+Struts2实现list传递实例讲解
- 关于Struts2的类型转换详解
- java中struts2实现文件上传下载功能实例解析
- 使用maven+eclipse搭建struts2开发环境
- struts2单个文件上传的两种实现方式
- struts2+jquery实现ajax登陆实例详解
- Java(基于Struts2) 分页实现代码
- Struts2的s:radio标签使用及用jquery添加change事件
- java Struts2 在拦截器里的跳转问题
- struts2中一个表单中提交多个请求的例子(多个提交按钮)
- struts2 jquery 打造无限层次的树
相关文章
SpringBoot使用Logback进行日志记录的代码示例
在开发Web应用程序时,日志记录是非常重要的一部分,在SpringBoot中,我们可以使用Logback进行日志记录,Logback是一款高性能、灵活的日志框架,它可以满足各种不同的日志需求,在本文中,我们介绍了如何在SpringBoot中使用Logback进行日志记录2023-06-06在IntelliJ IDEA 搭建springmvc项目配置debug的教程详解
这篇文章主要介绍了在IntelliJ IDEA 搭建springmvc项目配置debug的教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09浅谈Java中实现深拷贝的两种方式—clone() & Serialized
这篇文章主要介绍了Java中实现深拷贝的两种方式—clone() & Serialized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-03-03
最新评论