3

这是我的第一个 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。

4

2 回答 2

9

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


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

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

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

代替

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

也就是说,现在忘记 servlet!

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

那么,你应该怎么做?您应该将表单提交到操作 URL。为此,首先portlet在您的 JSP 中包含 taglib:

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

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

<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.
}

当对动作 URL 的请求(由 生成的<portlet:actionURL />)发送到服务器时,首先由processAction()方法处理,然后由doView(). 因此,您将在 servlet 中编写的代码应该放在您的processAction(). 结果应该是:

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

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

于 2011-12-13T02:41:58.087 回答
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) {}

这回答了你的问题了吗?

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

于 2011-12-13T16:05:25.753 回答