Struts2 $,#,%详解及实例代码
作者:lqh 发布时间:2021-09-10 04:18:40
最近在学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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/u013762572/article/details/44540035
猜你喜欢
- C#与C++ dll之间传递字符串string wchar_t* char* IntPtr1、由C#向C++ dll 传入字符串时,参数直接
- 本文实例为大家分享了java实现简单年龄计算器的具体代码,供大家参考,具体内容如下制作一个如下图年龄计算器根据题目,我做了一个由Calend
- 目录1. List1.1 List 的常见方法1.2 代码示例2. ArrayList2.1 介绍2.2 ArrayList 的构造方法2.
- 在Java编程中,代码块就是指用“{}”括起来的代码。下面看一下这四种代码块。1、普通代码块就是指类中方法的方法体。public void
- 首先是.select在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段。其中要注意的细节:wrapper.s
- Math.PI 记录的圆周率Math.E 记录e的常量Math中还有一些类似的常量,都是一些工程数学常用量。Math.ab
- java ,javaw 和 javaws 的区别:首先,所有的这些都是java的启动装置,java.e
- 1、在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP、port、状态和
- 文件下载是一个软件开发中的常见需求。本文从最简单的下载方式开始步步递进,讲述了文件下载过程中的常见问题并给出了解决方案。并展示了如何使用多线
- 现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80
- 本文实例为大家分享了使用PageHelper插件实现Service层分页的具体代码,供大家参考,具体内容如下使用场景:平时分页我们可以直接使
- 今天有个项目需要使用redis,并且有使用脚本的需求。但是因为之前没有写过,所以还有一点点不熟悉,今天记录一下。原因:原子操作,redis会
- 昨天写了一篇Redis布隆过滤器相关的命令的文章,今天来说一说springboot中如何简单在代码中使用布隆过滤器吧。目前市面上也有好几种实
- [LeetCode] 159. Longest Substring with At Most Two Distinct Characters
- Java中List.of()和Arrays.asList()的区别及原因动手写一下,让自己更有印象1.Arrays.asList()可以插入
- 本节我们主要介绍 Ribbon 的一些常用配置和配置 Ribbon 的两种方式。常用配置1. 禁用 Eureka当我们在 RestTempl
- 本文实例为大家分享了java实现抽奖功能的具体代码,供大家参考,具体内容如下抽一个:输入抽奖人数,生成随机数字进行抽奖。比如:楼主抽幸运儿送
- 一、题目描述题目实现:使用网络编程时,需要通过Socket传递对象。二、解题思路创建一个类:Student,实现序列化Student类包含两
- 一、基本介绍 1、介绍学习很多算法知识,力争做到最优解的学习过程中,很多时候都会遇到PriorityQueue(优先队列)。一个基
- @ApiImplicitParam作用在方法上,表示单独的请求参数参数name:参数名。value:参数的具体意义,作用。required: