Liferay:如何从JSP页面调用Servlet

时间:2011-12-12 19:20:51

标签: java servlets liferay portlet liferay-6

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

2 个答案:

答案 0 :(得分:9)

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


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

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

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

而不是

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

那就是说,现在忘记servlets了!

您正在以最差的方式进行此操作。编写一个调用servlet的portlet真是个坏主意。经过很长一段时间与Liferay合作,我可以想象它或多或少会合理的情况,但它不在这里,也不会在大多数时候。

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

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

现在,通过action 替换表单的<portlet:actionURL />。此标记将替换为门户网站生成的特殊URL。此外,位于每个输入名称前面,标记为<portlet:namespace />;那么您的<input type="text" name="login">应该成为<input type="text" name="<portlet:namespace />login">。此标记将替换为仅与您的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.
}

当对操作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);
}

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

答案 1 :(得分: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) {}

这会回答你的问题吗?

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