JSP useBean равен NULL для getAttribute сервлетом - PullRequest
4 голосов
/ 17 февраля 2011

пользователь пуст в сервлете. Пожалуйста, дайте мне, если делаете ошибку.

я пытаюсь получить все элементы HTML в bean rateCode.jsp

<%@page import="com.hermes.data.RateCode_" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <head>
        <title>Rate Code</title>
    </head>
    <body>      
         <jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="request" >
            <jsp:setProperty name="user" property="*"/></jsp:useBean>
            <form  id="f_rateCode" action="/ratePromoCodes" method="post"  >
                <table align="center" border="1" cellspacing="0">
                    <tr>
                        <td colspan="2" align="center" class="header">Rate Code Administrations</td>
                    </tr>
                    <tr>
                        <td align="right" style="border-style: solid;">Rate Code:</td>
                        <td align="left" style="border-style: solid;">
                            <input type="text" id="code" name="code" value="${user.code}"  size="10" maxlength="32" style="width: 100px"/>
                    </td>
                </tr>

                <tr>
                    <td align="right" style="border-style: solid;">Rate Description:</td>
                    <td align="left" style="border-style: solid;">
                        <input type="text" id="description" name="description" value="<%=user.getDescription()%>" maxlength="128" size="40"></td>
                </tr>              
                <tr><td><input type="submit" value="ok" /></td> </tr>
            </table>
        </form>

Servlet - ratePromoCodes

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        RateCode_ rc = (RateCode_) req.getAttribute("user");
        Enumeration an = req.getAttributeNames();
        Enumeration pn = req.getParameterNames();
        Object o = null;
        while (an.hasMoreElements()) {
            o = an.nextElement();
            System.out.println(o);
        }
        while (pn.hasMoreElements()) {
            o = pn.nextElement();
            System.out.println(o);
        }
    }

RateCode.java (javaBean)

public class RateCode_  {    
    private String code ;
    private String description;
    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Ответы [ 3 ]

7 голосов
/ 17 февраля 2011

Вы, кажется, неправильно поняли работу и цель jsp:useBean.

Прежде всего, вы объявили, что компонент находится в области действия сеанса, и заполняете его всеми параметрами текущего запроса.

<jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="session">
    <jsp:setProperty name="user" property="*"/>
</jsp:useBean>

Таким образом, этот компонент сохраняетсякак атрибут сеанса с именем user.Вам нужно получить его в сервлете как атрибут сеанса, а не как атрибут запроса.

RateCode_ user = (RateCode_) request.getSession().getAttribute("user");

(кстати, user это ужасное и запутанное имя атрибута, я быпереименуйте это rateCode или что-то, без этого нечетного _ в конце)

Однако, это не будет содержать ничего.getCode() и getDescription() вернут null.<jsp:setProperty> имеет , а не , заполнил его всеми параметрами запроса, но в тот момент вы пытаетесь получить к нему доступ в сервлете.Это будет сделано только тогда, когда вы отправите запрос, содержащий параметры, обратно на страницу JSP.Однако это происходит за пределами бизнес-логики в сервлете.

Вы должны собрать их как параметры запроса самостоятельно.Сначала избавьтесь от всей вещи <jsp:useBean> в JSP и выполните следующие действия в методе doPost() сервлета:

RateCode_ user = new RateCode_();
user.setCode(request.getParameter("code"));
user.setDescription(request.getParameter("description"));
// ...
request.setAttribute("user", user); // Do NOT store in session unless really necessary.

, а затем вы можете получить к нему доступ в JSP, как показано ниже:

<input type="text" name="code" value="${user.code}" />
<input type="text" name="description" value="${user.description}" />

(это чувствительно только к атакам XSS , вы хотите установить JSTL и использовать fn:escapeXml)

Нет, вам не нужно <jsp:useBean> в JSP.Не делайте этого, это практически не имеет значения, когда вы используете подход MVC (уровень 2) с реальными сервлетами.<jsp:useBean> полезен только для проектирования MV (MVC level 1).Чтобы сохранить стандартный код сбора параметров запроса, рассмотрите возможность использования инфраструктуры MVC или Apache Commons BeanUtils.См. Также ссылки ниже для подсказок.

См. Также:

4 голосов
/ 17 февраля 2011

Проблема (и ее решение) таковы:

Вы создаете бин области действия запроса user, но как только страница загружена, запрос завершается и уходит - неудивительно, что в следующем запросе null совершенно не связан с этим. Что вы, вероятно, хотели сделать, это следующее:

1) Полностью удалите <jsp:useBean ...> со страницы jsp, чтобы она выглядела следующим образом:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="com.hermes.data.RateCode_" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head><title>Rate Code</title></head>
<body>
<form id="f_rateCode" action="/forwarder.jsp" method="post">
    <table align="center" border="1" cellspacing="0">
        <tr>
            <td colspan="2" align="center" class="header">Rate Code Administrations</td>
        </tr>
        <tr>
            <td align="right" style="border-style: solid;">Rate Code:</td>
            <td align="left" style="border-style: solid;"><input type="text" id="code" name="code" value=""
                                                                 size="10" maxlength="32" style="width: 100px"/></td>
        </tr>
        <tr>
            <td align="right" style="border-style: solid;">Rate Description:</td>
            <td align="left" style="border-style: solid;"><input type="text" id="description" name="description"
                                                                 value="" maxlength="128"
                                                                 size="40"></td>
        </tr>
        <tr>
            <td><input type="submit" value="ok"/></td>
        </tr>
    </table>
</form>
</body>
</html>

2) Ваша форма теперь перенаправляет на другой jsp, экспедитор. Это выглядит следующим образом:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:useBean id="user" class="com.hermes.data.RateCode_" scope="request"/>
<jsp:setProperty name="user" property="*" />
<jsp:forward page="/ratePromoCodes" />

Что это делает: он создает бин в области запроса - запрос, который отправил форму . Затем он заполняет свойства bean-компонента данными из формы и, наконец, перенаправляет их ( В ОДНОМ ОДНОМ ЗАПРОСЕ, ЗДЕСЬ ТОЧКА ) сервлету, который выполняет некоторую работу.

3) Наконец-то сделайте что-нибудь в вашем сервлете, я сделал это для целей тестирования:

public class TestServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        RateCode_ code = (RateCode_) request.getAttribute("user");
        System.out.println(code);
    }
}
0 голосов
/ 17 февраля 2011

Вы используете bean-объект в JSP.Этот JSP передается, и сервлет отвечает.

Когда сервлет выполняется, запускается новый «жизненный цикл», и область действия запроса не содержит никакого bean-объекта в области запросов, используемого / созданного в JSP.*

Вы должны передать свойства компонента в качестве параметров запроса и прочитать их один за другим в сервлете.

...