简体   繁体   English

在Servlet中访问请求范围的Bean

[英]Accessing request scoped bean inside servlet

I have a jsp page where i am using a bean as request scope bean. 我有一个jsp页面,我在其中使用一个bean作为请求范围bean。 I have an input text whose value is the attribute of the bean. 我有一个输入文本,其值是Bean的属性。 On the form submit my action is someServlet. 在表单上提交我的操作是someServlet。 Now in that someServlet i want to access the bean that i used in my jsp page. 现在在someServlet中,我想访问我在jsp页面中使用的bean。 here is sample code i am using. 这是我正在使用的示例代码。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:useBean id="userBean" scope="request" class="com.iceman.bean.UserBean">
<jsp:setProperty property="*" name="userBean"/></jsp:useBean>
    <form action="action.do" method="post">
        Type Your Name:<input type="text" name="userName"/><br/>
        <input type="submit" value="Submit"/> 
    </form>
</body>
</html>

Servler Servler

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        UserBean userBean = (UserBean)request.getAttribute("userBean");
        response.getWriter().print(userBean.getUserName());
    }

When i run this i get a null pointer exception on servlet line where i call bean getter method. 当我运行它时,我在servlet行上得到一个空指针异常,在这里我调用bean getter方法。

Where am i doing wrong? 我在哪里做错了?

It is simply because the render request and the post request are different requests: 仅仅是因为渲染请求和发布请求是不同的请求:

  • client sends a first request, and server side a jsp is used to build a response. 客户端发送第一个请求,服务器端使用jsp建立响应。 Request scope beans created in JSP exist only in that one 在JSP中创建的请求范围Bean仅存在于那个
  • user fills in the form and posts a new requests 用户填写表格并发布新请求

The only ways to have information to persist between requests are: 在请求之间保留信息的唯一方法是:

  • the session (and the flash that is provided by some frameworks like ruby on rails or Spring MVC) 会话(以及一些框架(如Rails上的ruby或Spring MVC)提供的Flash
  • form fields (including hidden ones) 表单域(包括隐藏域)
  • URL parameters 网址参数

For clarity , you need to take your bean declaration <jsp:useBean id="userBean" scope="request" class="com.iceman.bean.UserBean"></jsp:useBean> outside form element , and change definition to 为了清楚起见,您需要将bean声明<jsp:useBean id="userBean" scope="request" class="com.iceman.bean.UserBean"></jsp:useBean> form元素之外,并将定义更改为

<jsp:useBean id="userBean" scope="request" class="com.iceman.bean.UserBean">
<jsp:setProperty name="userBean" property="*" />
</jsp:useBean>

Star ( * ) means that all bean properties with names that match request parameters sent to the page are set automatically. 星号(*)表示将自动设置名称与发送到页面的请求参数匹配的所有bean属性。 ( As per O`Reilly book ) (根据O`Reilly的书)

then you need to change line <input type="text" value="${userBean.userName}"/> to <input type="text" name="one of field names as per your UserBean class "/> 那么您需要<input type="text" name="one of field names as per your UserBean class "/> ,将行<input type="text" value="${userBean.userName}"/>更改为<input type="text" name="one of field names as per your UserBean class "/>

You have not shared details of UserBean class but I guess field name is userName 您尚未共享UserBean类的详细信息,但我想字段名称为userName

Regarding bean being NULL in request , please refer answer by Jan Zyka for question jsp useBean is NULL by getAttribute by servlet 关于request Bean为NULL ,请参阅Jan Zyka的回答以获取问题jsp useBean的servlet为getAttribute的NULL

Hope it helps !! 希望能帮助到你 !!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM