【问题标题】:Liferay : How to call a Servlet from a JSP PageLiferay:如何从 JSP 页面调用 Servlet
【发布时间】:2011-12-12 19:20:51
【问题描述】:

这是我的第一个 Portlet。我没有在我的 servlet 中获取值。请看节目。在我的自定义 portlet Java 类 doView() 方法中,我显示了一个 JSP 页面

public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {            
    include(viewJSP, renderRequest, renderResponse);
}

view.jsp 页面中,我引用了一个servlet 来接收值:

<form action="formServlet" method="post">
    <h1>Please Login</h1>
    Login:    <input type="text" name="login"><br>
    Password: <input type="password" name="password"><br>
    <input type=submit value="Login">
</form>

web.xml 文件内:

<servlet>
    <servlet-name>formServlet</servlet-name>
    <servlet-class>FormServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>formServlet</servlet-name>
    <url-pattern>formServlet</url-pattern>
</servlet-mapping>

在我的 servlet 中

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {  
    String name = (String)request.getParameter("login");
    System.out.println("The Name is "+name);    
}

但我不知道为什么没有调用 servlet。

【问题讨论】:

    标签: java servlets liferay portlet liferay-6


    【解决方案1】:

    注意这是对一个有点复杂的问题的回答。如果您正在尝试学习 portlet 创建的基础知识,我在另一个问题中发布了 better answer


    您正在使用POST method 提交表单,但您的servlet 只实现了doGet(),它为GET 方法提供服务。您应该使用 GET 提交表单或实现 doPost() 方法(在其他情况下更可取)。

    此外,如果&lt;url-pattern&gt; 是绝对模式,则必须在内容前面加上斜线。也就是应该是

    <url-pattern>/formServlet</url-pattern>
    

    而不是

    <url-pattern>formServlet</url-pattern>
    

    也就是说,现在忘记 servlet!

    您正在以最糟糕的方式之一这样做。编写一个调用 servlet 的 portlet 确实是个坏主意。在与 Liferay 合作了很长时间之后,我可以想象在某些情况下它或多或少是合理的,但它不在这里,而且大多数时候都不会。

    那么,你应该怎么做?你应该将你的表单提交到一个action URL。为此,首先在您的 JSP 中包含 portlet 标签库:

    <%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
    

    现在,替换表单的 action&lt;portlet:actionURL /&gt;。此标记将被门户生成的特殊 URL 替换。此外,每个输入名称之前加上标签&lt;portlet:namespace /&gt;;然后你的&lt;input type="text" name="login"&gt; 应该变成&lt;input type="text" name="&lt;portlet:namespace /&gt;login"&gt;。该标签将被替换为仅与您的 portlet 相关联的字符串;因为您可以在一个页面中有很多 portlet,所以每个输入都应该指定它来自哪个 portlet。这是最终结果:

    <form action="<portlet:actionURL />" method="post">
        <h1>Please Login</h1>
        Login:    <input type="text" name="<portlet:namespace />login"><br>
        Password: <input type="password" name="<portlet:namespace />password"><br>
        <input type=submit value="Login">
    </form>
    

    现在您将正确地提交数据 - 但是如何获取提交的数据?当然没有必要使用 servlet!相反,添加到您的自定义 portlet 类中称为 processAction() 的方法。此方法应返回void 并接收两个参数,时间为javax.portlet.ActionRequestjavax.portlet.ActionResponse。这是一个空processAction()的例子:

    public void processAction(ActionRequest request, ActionResponse response) {
        // Nothing to be done for now.
    }
    

    当一个action URL的请求(由&lt;portlet:actionURL /&gt;生成的)被发送到服务器时,它首先被processAction()方法处理,然后被doView()处理。因此,您将在您的 servlet 中编写的代码应该放在您的processAction() 中。结果应该是:

    public void processAction(ActionRequest request, ActionResponse response) {
        String name = (String)request.getParameter("login");
        System.out.println("The Name is "+name);
    }
    

    试一试,你会发现它会很好用。

    【讨论】:

    • 非常感谢您宝贵的时间。您能否告诉我
    • 要联系您的自定义 Portlet 类(假设它扩展了 GenericPortlet 或其子类),您需要将 portlet.xml 中的 的值更改为您的自定义 Portlet 类,例如com.mypackage.MyCustomPortlet
    • 这是在我的 portlet.xml 文件中,com.test.GreetingPortlet,在这个类中我有几个方法,比如 adduser , deleteuser --etc ,所以它将是
      这是正确的吗??
    • yyy,我在下面添加了对此评论的答案。
    【解决方案2】:

    yyy - 这是您评论的答案:

    在您的 JSP 页面中,您需要为希望该 portlet 执行的每个操作添加以下内容:

    <portlet:actionURL var="addUserURL">
    <portlet:param name="<%= ActionRequest.ACTION_NAME %>" value="addUser" />
    </portlet:actionURL>
    
    <form method="post" action="<%= addUserURL %>">
    

    然后在您的 com.test.Greeting portlet 中,您将拥有其中的每一个:

    public void addUser (ActionRequest actionRequest, ActionResponse actionResponse) {}
    

    这能回答你的问题吗?

    另外,通常最好开始一个新问题而不是添加评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      相关资源
      最近更新 更多