Liferay:如何从JSP页面调用Servlet

3

这是我的第一个Portlet。我无法在我的servlet中获取值。请查看程序。在我的自定义端口类的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个回答

9

注意: 这是对一个相对复杂问题的回答。如果您想学习portlet创建的基础知识,我在另一个问题中发布了一个更好的答案


你正在使用POST方法提交表单,但你的servlet只实现了doGet(),这个方法用于处理GET请求。你应该使用GET方法提交表单或实现doPost()方法(在其他情况下更可取)。
另外,如果<url-pattern>是绝对模式,必须在内容前加一个斜杠。也就是说,它应该是:
<url-pattern>/formServlet</url-pattern>

替代

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

话虽如此,现在忘记Servlets吧!

你正在使用最糟糕的方法之一。编写调用Servlet的Portlet真的是个坏主意。在与Liferay长期合作后,我可以想象出一些情况,在这些情况下这样做可能是比较合理的,但大多数情况下都不是。

那么,你应该怎么做呢? 你应该将表单提交到一个操作URL。要实现这一点,首先在你的JSP中包含portlet标签库:

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

现在,用 <portlet:actionURL /> 替换你的表单中的 action。这个标签将被门户生成的特殊 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);
}

尝试一下,你会发现它能很好地工作。


2
非常感谢您宝贵的时间。请问一下,<form action="<portlet:actionURL />" 这段代码如何与我编写的自定义Portlet类联系起来? - Pawan
1
要联系您的自定义Portlet类(假设它扩展了GenericPortlet或其子类),您需要将portlet.xml中<portlet-class>的值更改为您的自定义Portlet类的包和类名,例如com.mypackage.MyCustomPortlet。 - Jonny
这是我的 portlet.xml 文件中的内容,<portlet-class>com.test.GreetingPortlet</portlet-class>。在这个类中,我有几个方法,如 adduser、deleteuser 等等,所以应该是 <form action="<portlet:actionURL />" method="adduser">。这样正确吗? - Pawan
yyy,我已在下面添加了对这条评论的回答。 - Jonny

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门户中,您将为每个端口都有以下内容:
public void addUser (ActionRequest actionRequest, ActionResponse actionResponse) {}

这个回答是否解决了你的问题?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接