Liferay:如何从JSP页面调用Servlet

Paw*_*wan 3 java portlet servlets liferay liferay-6

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

public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {            
    include(viewJSP, renderRequest, renderResponse);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

内部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>
Run Code Online (Sandbox Code Playgroud)

在我的servlet里面

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

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

bra*_*zzi 9

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


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

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

<url-pattern>/formServlet</url-pattern>
Run Code Online (Sandbox Code Playgroud)

代替

<url-pattern>formServlet</url-pattern>
Run Code Online (Sandbox Code Playgroud)

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

你是以最糟糕的方式之一做到的.编写一个调用servlet的portlet真是个坏主意.经过很长一段时间与Liferay合作,我可以想象它或多或少会合理的情况,但它不在这里,也不会在大多数时候.

那么,你应该怎么做?您应该将表单提交到操作URL.要做到这一点,首先portlet在JSP中包含taglib:

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>
Run Code Online (Sandbox Code Playgroud)

现在,取代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>
Run Code Online (Sandbox Code Playgroud)

现在您要正确提交数据 - 但如何获取提交的数据?当然没有必要使用servlet!而是向您的自定义portlet类添加一个名为的方法processAction().这个方法应该返回void并接收两个时间javax.portlet.ActionRequest和参数javax.portlet.ActionResponse.这是一个空的例子processAction():

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

当对操作URL的请求(如生成的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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 非常感谢你宝贵的时间.你能不能告诉我<form action ="<portlet:actionURL />"这将如何联系我的自定义Portlet类? (2认同)