【问题标题】:JSPExpression Language reading value from beanJSPExpression Language 从 bean 读取值
【发布时间】:2017-02-04 10:38:22
【问题描述】:

我有一个登录 servlet,它是工作流的开始

LoginServlet.java

doGet(...) throws ... {
    User user = new User();
    request.setAttribute("user", user);
    ServletContext sc = this.getServletContext();
    RequestDispatcher rd = sc.getRequestDispatcher("/Login.jsp");
    rd.forward(request, response);
}

User 是一个用于保存数据的 bean,我将用户名和密码都添加为 public 只是为了理解。我不确定我以后是否可以直接从 JSP 访问这些

**User.java**
public class User {
    public String username;
    public String password;
}

**Login.jsp**
...
<form action="/ProfileServlet" method = "post">
    Username: <input type="text" value = "${user.username}"/>
    Submit: <input type="submit" value="Submit"/>
</form>
...

所以没有写request.getAttribute("user")。我直接用了bean,不知道这里有没有遗漏

**ProfileServlet.java**
protected void doPost(..)..{
User user = (User) request.getAttribute("user");
System.out.println("logged in user "+user.username);
}

我正在尝试打印出给定的用户名。但不知何故我得到了 nullpointerexception,因为请求没有属性用户。

我尝试了跨网络的 EL 示例,但找不到令人满意的解决方案。

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    表达式语言使用 bean 的 getter 和 setter 来访问属性。
    属性甚至可以省略,根本不定义。

    当页面被请求时,JSP 和 EL 被编译成 java 代码。在生成的 java 类中,像 ${user.username} 这样的 EL 被转换为 user.getUsername();

    User.java

    public class User {
    
        // the properties are optional
    
        private String username;
        private String password;
    
        // the getters are needed for reading of bean values
    
        public String getUsername() {
            // the return data could be some on the fly calculation, DB data, etc
            return username;
        }
    
        public String getPassword() {
            // the return data could be some on the fly calculation, DB data, etc
            return password;
        }
    
        // the setters are for write access
    
        public void setUsername(String username) {
            // do something with the data, store it 
            // usually 
            this.username = username;
        }
    
        public void setPassword(String password) {
            // do something with the data, store it
            // usually
            this.password = password;
        }
    }
    

    Bean 中的 Getter 和 Setter 名称以及 EL-access-names 遵循一些规则。

    The JavaBean Documentation is here

    在某些情况下,CamelCase 中带有前导小写/大写字母的属性存在问题。
    更多内容:jsp:setproperty property=“*” not set all properties

    另一个问题是属性的生命周期/范围。

    在 (Login)Servlet 中,您在请求范围内定义用户属性并转发到 JSP。
    处理完 JSP 后,用户属性将无法再访问。请求得到了回应。结束。

    当用户提交Login.jsp时,这是另一个请求。
    ProfileServlet 可以使用request.getParameter("username") 访问表单域数据。

    验证用户名和密码后,您可以为会话设置user 属性,以便在所有后续页面中轻松访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2013-11-14
      相关资源
      最近更新 更多