【问题标题】:How to call servlet class from HTML form如何从 HTML 表单调用 servlet 类
【发布时间】:2011-01-24 14:43:08
【问题描述】:

我创建了一个 Web 应用程序项目。它包含一个 servlet 类和一个 HTML 表单。如何从 HTML 表单调用 servlet 类?

【问题讨论】:

    标签: html forms servlets


    【解决方案1】:

    只需创建一个扩展 HttpServlet 的类,并在特定 URL 模式上使用 @WebServlet 对其进行注释。

    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {}
    

    或者当您仍在使用 Servlet 2.5 或更早版本时(注释是自 Servlet 3.0 以来的新注释),然后在 web.xml 中将 servlet 注册为 <servlet> 并通过 <servlet-mapping> 将其映射到特定的 URL 模式。

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.example.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    

    然后,只需让 HTML 链接或表单操作指向与 servlet 的 url-pattern 匹配的 URL。

    <a href="${pageContext.request.contextPath}/login">Login</a>
    
    <form action="${pageContext.request.contextPath}/login" method="post">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit">
    </form>
    

    使用提交按钮时,请确保使用type="submit" 而不是type="button"。关于${pageContext.request.contextPath}部分的解释可以在这个相关问答中找到:How to use servlet URL pattern in HTML form action without getting HTTP 404 error

    带有method="get" 的链接和表单将调用servlet 的doGet() 方法。您通常使用此方法在“页面加载”时预处理请求。

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // ...
    }
    

    带有method="post" 的表单将调用servlet 的doPost() 方法。您通常使用此方法对包含用户提交的表单数据的请求进行后处理(收集请求参数、转换并验证它们、更新模型、调用业务操作并最终呈现响应)。

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // ...
    }
    

    要了解有关 servlet 的更多信息并查找更多具体示例,请访问 our Servlets wiki page。应该注意的是,您也可以使用 JSP 文件而不是纯 HTML 文件。 JSP 允许您在生成 HTML 输出的同时通过 EL 表达式与后端交互,并使用 JSTL 之类的标记库来控制流程。另见our JSP wiki page

    【讨论】:

    • 抛出异常。阅读堆栈跟踪/日志并相应地修复代码。
    【解决方案2】:

    例如,我创建了一个类似的 login.html

    <div class="container">
    
        <form method = "post" class="form-signin" role="form" action="LoginServlet">
        <h2 class="form-signin-heading">Please sign in</h2>
        <input type="text" class="form-control" name = "username" placeholder="User Name" required autofocus>
        <input type="password" class="form-control" name = "password" placeholder="Password" required>
        <div class="checkbox">
          <label>
            <input type="checkbox" value="remember-me"> Remember me
          </label>
        </div>
        <input type="submit" class="btn btn-lg btn-primary btn-block" value="Sign in">
      </form>
    
    </div> 
    

    在标签之间,我通过将方法定义为“post”来调用 LoginServlet。

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多