在JSP页面使用OGNL表达式

   最近学习了OGNL表达式,这里和大家分享MyEclipse中用OGNL完成的一个实例。在这个实例中会用到上面介绍的大部分语法,有变量的访问,有操作列表Lists,有操作映射Maps,还有选择操作等等。会在JSP中完成这个实例。

 项目概述

整个项目的控制逻辑比较简单,重心将放在页面JSP文件使用OGNL。在这个项目中有一个User类的定义,其中包含三个成员变量:username、sex、age。然后在Action中定义一个链表List的对象,向链表中增加三个User类的对象,最后在页面上对List进行操作。同时在Action中还会获取当前Action的请求request,以及会话session,然后在其中分别添加一对键值,在页面上再通过OGNL表达式进行访问。最后还会在页面上定义一个MAP对象,然后对其进行读取操作。整个项目要完成的功能就是这么多了。下面先了解一下整个工程目录,

图7-2整个工程的目录

从工程的目录示意图中可以看出这是一个相对简单的项目,包含五个源文件,分别是:User.java、OgnlExeAction.java、OgnlExe.jsp、struts.xml、web.xml。这些文件的意义与前述工程的一致,因此在这里不再重复。在下面的小节里将按顺序分别进行详细讲解OGNL在JSP页面中的使用方法。

 工程代码编写

首先看看模型User类的定义文件User.java,这个JavaBean风格的类一共有三个成员变量,这个类用来为页面提供数据模型,具体的代码如下:

User.java

package action;

public class User {

   /*三个成员变量的定义*/

         private String username;

         private String sex;

         private int age;

     /*下面是构造函数*/

         public User(String username, String sex, int age) {

                   super();

                   this.username = username;

                   this.sex = sex;

                   this.age = age;

         }

     /*省略Get、Set方法*/

}

这个类定义了三个私有成员变量以及它们各自的Get、Set方法,还有一个显示定义的构造函数,是为了方便在Action中生成User类实例。再看看Action的具体代码:

OgnlExeAction.java

package action;

/*省略导入的包*/

@SuppressWarnings("serial")

public class OgnlExeAction extends ActionSupport {

private HttpServletRequest request;

    private HttpSession session;

    private List<User> users;

         public String  execute() throws Exception {

              /*获取request和session*/

            request = ServletActionContext.getRequest();

            session=request.getSession();

             /*在request和session中添加一对键值*/

            request.setAttribute("userName","Xxp From request");

            session.setAttribute("userName","Xxp From session");

               /*在List对象添加三个User类的对象*/

            users = new LinkedList<User>();

            users .add(new User("xuxinpeng", "man", 20));

            users .add(new User("wangzhen", "man", 21));

            users .add(new User("liudongdong", "man", 21));

            return SUCCESS;

         }

      /*省略Get、Set方法*/

}

为了使用在前述小节中提到的OGNL的种种语法功能,在Action中一开始就定义了HttpServletRequest和HttpSession类的对象以期为页面提供数据,同时为了演示对List的各种操作,故又增加了一个用来存放User类对象的List的成员变量。定义了这些工具类之后,接下来便为它们赋值,request和session分别赋值为当前Action的请求和会话,在List中也添加了三个User对象。

有了这些准备之后,就可以在页面上通过OGNL表达式对值栈进行访问。JSP文件将是该示例项目的核心文件,通过这个JSP文件将演示前述的OGNL语法特性是如何应用到具体的页面中的,下面就重点阐述一下OgnlExe.jsp文件,该页面文件的代码如下:

OgnlExe.jsp

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>

<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <title>Struts OGNL Exemple</title>

</head>

<body>

<center>  

    <h3><font color="blue">访问Action上下文</font></h3>

    <!--   对request和session中的值进行访问   -->

    request.userName: <s:property value="#request.userName" /><br/>

    session.userName: <s:property value="#session.get('userName')" /><br/>

    <hr />

    <h3><font color="blue">用于过滤和投影集合</font></h3>

    <p>年龄小于21岁的名单</p>

    <ul>

        <!--   在List中选择年龄小于21的User对象   -->

        <s:iterator value="users.{?#this.age <21}">

            <li><s:property value="username" /> 年龄是 <s:property value="age" />岁!</li>

        </s:iterator>

</ul>

<!--   显示List中userneme值为wangzhen的User对象的年龄   -->

    <p>

                  <font color="green">

                             "wangzhen" 的年龄是:

<s:property value="users.{?#this.username=='wangzhen'}.{age}[0]"/>

                  </font>

         </p>

    <hr />

    <h3><font color="blue">构造Map</font></h3>

    <!--   定义Map,然后选择对应的键进行访问   -->

    <s:set name="xu" value="#{'xxp':'xuxinpeng', 'wz':'wangzhen'}" />

    <p>键名"xxp" 是 <s:property value="#xu['xxp']" />的缩写</p>

    </center>

</body>

</html>

开始的两句代码显式的申明了页面对中文的支持,申明了使用Struts的标签库。后续的是一系列使用OGNL对List的操作,这些语法特性在前述的小节已经详细阐述,在这里不再重复,为了使用OGNL对List进行操作,借助了Struts的s:value标签,类似的标签还有s:iterator,s:set等等,关于标签的知识第六章将会有详细的讲解。

在这里要引起读者注意的是下面这句代码:

users.{?#this.username=='wangzhen'}.{age}[0]

users.{?#this.username=='wangzhen'}.{age}这个投影表达式正是用来获得链表List中姓名为'wangzhen'的User对象中的age属性,但是这个表达式返回的是一个集合,所以要用“[索引]”来访问其值,读者可以参考前述小节的语法讲解。

页面完成之后,最后就是配置文件struts.xml,其具体的内容就是:

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.devMode" value="true" />

    <package name="Struts2_OGNL_Exe" extends="struts-default">

    <default-interceptor-ref name="completeStack"></default-interceptor-ref>

        <action name="OgnlExe" class="action.OgnlExeAction">

        <result name="success">OgnlExe.jsp</result>

    </action>

    </package>

</struts>

整个工程就只有一个Action,因而配置文件也相应简单,即只要配置一个Action。在这里也就不用再多做解释。

 运行

完成上面所有代码之后,项目就算竣工了,然后把整个项目部署到Tomcat下,打开火狐,地址栏输入:http://localhost:8080/OgnlExe/OgnlExe.action

 

小结

本章对在使用Struts2编写页面代码过程中经常要使用的表达式语言进行了详细的探讨,详细的讲述了OGNL中变量的声明,对象的属性的访问,静态方法的调用,以及各种集合类型的使用。同时也介绍了OGNL中的高级特性包括类型转换,lamuda表达式,集合的投影,选择等操作。但正如在一开始就指出的,对于OGNL表达式语言其实只要掌握:属性访问、方法调用、下标运算以及链式表达式就可以应付绝大部分的应用需求。高级的特性使得代码能够更加简洁,同时表达更多的操作,例如集合的投影操作就可以省去大约10多行的常规代码。在讲述了OGNL的所有语法细节之后,给出了一个JSP的实例来指导读者如何进行现实的页面开发。虽然没有覆盖所有的语法特性,必定给读者以启示。

OGNL的这些丰富的特性,使得程序员可以在无类型的Web世界构建起强类型的对象,并且给程序员提供了丰富的类型转换机制。这些特性无疑都给开发工作带来了极大的便利。相信读者通过这一章节的学习,在编写动态页面代码的时候可以更加的得心应手

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是修改后的代码: 登录页面 login.jsp: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Login Page</title> </head> <body> <s:form action="login" method="post"> <s:textfield name="username" label="Username"/> <s:password name="password" label="Password"/> <s:submit/> </s:form> </body> </html> ``` 登录成功页面 success.jsp: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Login Success</title> </head> <body> <h1>Welcome, <s:property value="username"/>!</h1> <p>You are the <s:property value="rank"/>-th user who logged in successfully.</p> </body> </html> ``` 修改后的 LoginAction.java: ```java package com.example.actions; import com.opensymphony.xwork2.ActionSupport; import java.util.ArrayList; import java.util.List; public class LoginAction extends ActionSupport { private String username; private String password; private static List<String> users = new ArrayList<>(); private static int count = 0; public String execute() { if ("admin".equals(username) && "admin".equals(password)) { count++; users.add(username); return SUCCESS; } else { return ERROR; } } // Getter and Setter methods public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRank() { return String.valueOf(users.indexOf(username) + 1); } } ``` 在 LoginAction 中,我们使用一个 static 的 List 来记录所有登录成功的用户,同时使用一个 static 的计数器 count 记录登录成功的用户数量。在 execute 方法中,如果用户名和密码都为 admin,则说明登录成功,将该用户添加到 users 列表中,并返回 SUCCESS。在 success.jsp 中,我们使用 OGNL 表达式 `<s:property value="username"/>` 显示登录用户的名称,使用 `<s:property value="rank"/>` 显示登录用户是第几位登录成功的用户。 ### 回答2: 要修改实验1的登录系统代码,我们需要使用Struts2标签来构建页面,以便实现更方便的表达式展示和用户登录信息的显示。 首先,在登录页面中,我们可以使用Struts2标签来展示表单和输入框,如<s:form>和<s:textfield>等标签。这样可以让页面更加简洁和具有良好的可读性。 接下来,在登录成功的页面中,我们可以使用OGNL表达式来显示登录用户的名称,并且显示该用户是系统中第几位登录成功的用户。OGNL表达式可以通过<s:property>标签来展示。 在修改后的代码中,我们可以在登录成功后,将登录用户的名称保存在Action中的一个变量中。然后在登录成功页面中,使用<s:property value="变量名称"/>来展示用户名称。 为了显示用户是系统中第几位登录成功的用户,我们可以在Action使用一个全局变量来记录登录次数。每次用户登录成功后,全局变量加1。然后在登录成功页面中,使用<s:property value="全局变量"/>来展示是系统中第几位登录成功的用户。 通过使用Struts2标签和OGNL表达式,我们可以在修改后的代码中实现页面的构建和用户信息的展示。这样可以提升系统的用户体验和可读性,同时也方便了后续的维护和扩展工作。 ### 回答3: 要修改实验1登录系统的代码,首先需要使用Struts2标签来构建登录页面。可以使用Struts2的标签库中的<s:form>标签来创建登录表单,其中包含用户名和密码的输入框以及登录按钮。通过<s:submit>标签可以实现点击按钮提交表单的功能。 在登录成功后的页面中,需要使用OGNL表达式来显示登录用户的名称。可以使用<s:property>标签将登录用户名属性的值显示在页面上。例如,如果登录用户的名称保存在一个名为username的属性中,可以使用<s:property value="username"/>来将其显示在页面上。 此外,还需要显示该用户是系统中第几位登录成功的用户。可以在用户登录成功后,将登录用户的信息保存在一个用户列表中,并记录用户登录的顺序。然后使用<s:iterator>标签遍历这个用户列表,在迭代过程中判断当前遍历到的是第几个用户,并将其显示在页面上。 总结起来,修改实验1登录系统的代码需要进行以下步骤: 1. 使用Struts2标签构建登录页面,包括<s:form>标签和<s:submit>标签; 2. 在登录成功页面中使用OGNL表达式<s:property>标签显示登录用户的名称; 3. 在用户登录成功后,将登录用户的信息保存在用户列表中,并记录用户登录的顺序; 4. 使用<s:iterator>标签遍历用户列表,并使用逻辑判断确定用户的登录顺序,并在页面上显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值