jsp:UseBean与Struts <bean>标记</bean>

时间:2014-08-22 19:55:36

标签: java jsp struts2 javabeans

我正在了解Struts2,但我并不完全清楚如何以及何时使用标记<jsp:UseBean>与Struts标记。

我发现了一篇概述差异的文章,但没有提供任何示例。

http://struts.apache.org/development/1.x/struts-taglib/tlddoc/bean/define.html

<bean:define>标记在几个方面与<jsp:useBean>不同,包括:

  • 无条件地创建(或替换)指定的bean 标识符。
  • 可以使用属性返回的值创建bean 不同bean的getter(包括用a引用的属性) 嵌套和/或索引属性名称)。
  • 可以创建一个bean contents是文字字符串(或运行时表达式的结果) 由value属性指定。
  • 不支持嵌套内容 (例如标签)仅在bean出现时执行 实际创建。

这是我使用UseBean标记的快速测试代码。有谁能请给我一个例子如何/为什么(或者如果)我应该在display.jsp中使用Struts标签呢?

谢谢!

的index.jsp

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!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=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>

        <form name="input" action="TestServlet" method="post">
            <input type="text" name="txtFirstName" placeholder="First Name">
            <input type="text" name="txtLastName" placeholder="Last Name">
            <input type="submit" value="Submit">
        </form>
    </body>
    </html>

TestServlet.java

    package com.website.servlets;

    import java.io.IOException;

    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import com.website.models.Person;

    /**
     * Servlet implementation class TestServlet
     */
    @WebServlet("/TestServlet")
    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

        /**
         * @see HttpServlet#HttpServlet()
         */
        public TestServlet() {
            super();
        }


        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            String fname = request.getParameter("txtFirstName");
            String lname = request.getParameter("txtLastName");

            Person p = new Person();        

            p.setFirstName(fname);
            p.setLastName(lname);

            request.setAttribute("myPersonObj", p);

            RequestDispatcher rd = request.getRequestDispatcher("display.jsp");
            rd.forward(request, response);      
        }

    }

display.jsp

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>

    <!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=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>

        <jsp:useBean id="myPersonObj" class="com.website.models.Person" scope="request"></jsp:useBean>

        <p> 
            Full Name : <jsp:getProperty property="firstName" name="myPersonObj"/>
                        <jsp:getProperty property="lastName" name="myPersonObj"/>
        </p>

    </body>
    </html>

2 个答案:

答案 0 :(得分:3)

因为您实际上是在servlet中创建bean,并将其放在请求属性中,所以可以替换:

    <jsp:useBean id="myPersonObj" class="com.website.models.Person" scope="request"></jsp:useBean>

    <p> 
        Full Name : <jsp:getProperty property="firstName" name="myPersonObj"/>
                    <jsp:getProperty property="lastName" name="myPersonObj"/>
    </p>

使用(使用EL):

    <p> 
        Full Name : ${myPersonObj.firstName}
                    ${myPersonObj.lastName}
    </p>

请参阅此处的Servlets info page

  

如果您已经使用servlet处理模型,请不要使用<jsp:useBean>。它只会导致混淆和维护问题,因为<jsp:useBean>遵循不同级别的MVC方法,而不是使用servlet时。它是servlet或<jsp:useBean>,而不是两者。

因为<jsp:useBean>与servlet不兼容,并且你需要使用servlet进行任何正常的编码,<jsp:useBean>是完全过时的&#34; (正如JB Nizet在第一条评论中所说的那样)。

答案 1 :(得分:1)

你应该使用struts2标签,它们支持OGNL。 OGNL有一个上下文和一个值栈,它是一个根对象。因此,您的请求范围对象显示为

<p> 
    Full Name : <s:property value="#request.myPersonObj.firstName"/>&nbsp;
                <s:property value="#request.myPersonObj.lastName"/>
</p>

为了更好地理解OGNL概念,请参阅docs