【问题标题】:grammar and syntax语法和句法
【发布时间】:2018-02-02 03:57:35
【问题描述】:

我有足够的知识使用 Java SE/JavaFX(桌面)进行开发,但这是我第一次使用 Java EE(WEB)。我想构建一个基本应用程序,仅在 HTML/JSP 中获取登录名和密码,调用 Servlet(在 Java 中)并向 HTML/JSP 返回一条消息。这次我想用“艰难的方式”做到这一点,没有任何 IDE。所以,我已经安装了 Tomcat 7.0,并且拥有了这些模块:

Java(本例仅从 HTML/JSP 接收)

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class loginServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        out.println("<html>");
        out.println("<body>");
        out.println("Hello " + "  " + userName + "welcome to my blog");
        out.println("Your password is : " + "  " + password + "<br>");
        out.println("</body></html>");
    }
}

HTML/JSP

<!DOCTYPE html>
<html lang ="pt-br">        
   <head>
      <title> loginServlet </title>
      <meta http-equiv = ”Content-Type” content=”text/html; charset=UTF-8”>
      <link rel="stylesheet" type="text/css" 
            href="c:/java/html/css/estilo.css"/>                     
   </head>

   <body>
      <h2> Login Page </h2>

      <p>Please enter your username and password</p>

      <form method="GET" action="loginServlet">
         <p> Username <input type="text" name="userName" size="50"> </p>

     <p> Password <input type="text" name="password" size="20"> </p>

     <p> <input type="submit" value="Submit" name="B1"> </p>
      </form>
   </body>
</html>

WEB.XML

<?xml version="1.0" encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <display-name>loginServlet</display-name>
    <description>
        This is a simple web application with a source code organization
        based on the recommendations of the Application Developer's Guide.
    </description>

    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>java.loginServlet.WebContaint.WEB-
                       INF.classes.loginServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>

</web-app> 

路径和文件夹

  • loginServlet.classC://java/loginServlet/WebContaint/WEB-INF/classes/

  • loginServlet.jspC://java/loginServlet/WebContaint/

  • web.xmlC://java/loginServlet/WebContaint/WEB-INF/

  • loginServlet.warC:\Program Files\Apache Software Foundation\ Tomcat 7.0\webapps

当我尝试使用本地主机 (http://localhost:8080/loginServlet) 调用 Chrome 时,我收到 404 错误。

【问题讨论】:

  • Javascript 问题在哪里?
  • 我认为我的问题可能是在我的 HTML 和我的 Servlet Java 之间的某个地方,或者可能是 Tomcat。我不知道。
  • 查看此示例以获取带有 Tomcat 的 web.xml 文件,看看您可能缺少什么:wiki.metawerx.net/wiki/Web.xml 对我来说,您似乎缺少 部分,并且我认为你的包名包含太多信息,删除“WEB-INF”的东西

标签: java html web-services servlets


【解决方案1】:

你的 Servlet 类名看起来不对:

<servlet-class>java.loginServlet.WebContaint.WEB-
               INF.classes.loginServlet</servlet-class>

我什至不确定是否可以将用户代码放在 java 命名空间中(它可能受到保护),尽管我不建议这样做。在包名中也有WEB-INF.classes 是不对的。将名称拆分为多行也是不对的。

实际上,在你的代码中,你甚至没有包名,所以你应该可以这样写:

<servlet-class>loginServlet</servlet-class> 

阅读此tutorial on creating servlets,它解决了 servlet 类的命名以及从 web.xml 文件中交叉引用它们。

注意,对于这样的简单示例,您甚至不需要 web.xml 文件,您只需 use an @WebServlet annotation


旁白:

  • Tomcat 的当前版本是 9.x,我不建议使用 7.x 等旧版本。
  • 坚持 Java 命名约定(例如,将您的类称为 LoginServlet,而不是 loginServlet)。
  • 要学习 JEE,我建议使用 official JEE tutorial

发生了一件奇怪的事情:似乎只(直接)调用了 servlet (loginServlet.class)。 HTML (loginServlet.jsp) 没有显示可以通知登录名和密码的页面。我看到了由 Servlet (loginServlet.class) 生成的消息“Hello userName welcome to my blog”。当然,登录名和密码为空。

根据您之前的问题,您说您正在像这样调用应用程序:

http://localhost:8080/loginServlet

这不会告诉应用程序使用您创建的 jsp 文件,您将其命名为 loginServlet.jsp。您拨打的电话的故障是您正在使用端口 8080 上的 http 协议来访问您的 tomcat 服务器。您提供路径/loginServlet,它用于标识您的Web 应用程序(默认情况下,它的名称来自您部署的war 文件,您称之为loginServlet.war)。一旦进入应用程序,它会尝试打开一个欢迎文件(如果有的话)。但是您没有为 servlet 提供欢迎文件或空名称映射,因此,通常情况下,我只希望该 url 出现 404 not found 错误。

你的 servlet 的 url 将是

http://localhost:8080/loginServlet/loginServlet  

第一个loginServlet 标识您的应用程序,第二个loginServlet 标识servlet 本身。因此,访问该 url 将直接访问 servlet 处理。

但是,您不希望您的用户直接调用它。相反,您希望显示您的 jsp 文件,然后让它向服务器 http://localhost:8080/loginServlet/loginServlet 发送数据以触发 servlet 处理。

访问 jsp 的两个选项是提供欢迎文件或在请求字符串中提供完全限定名称。

一个完全限定的名称请求是:

http://localhost:8080/loginServlet/loginServlet.jsp

如果您想分配 welcome file,则可以将以下部分添加到您的 web.xml:

<welcome-file-list>
    <welcome-file>loginServlet.jsp</welcome-file>
</welcome-file-list>

那么下面的访问字符串应该会弹出loginServlet.jsp 页面:

http://localhost:8080/loginServlet

【讨论】:

  • jewelsea,谢谢您的回答。实际上,我在类和 html/jsp 中使用相同的名称作为测试。在现实世界中,我将使用约定,就像我在桌面应用程序中所做的那样。
  • 所以,正如你所建议的,我改变了我的 WEB.XML 并且只使用了“loginServlet”而不是整个路径。发生了一件奇怪的事情:似乎只(直接)调用了 servlet (loginServlet.class)。 HTML (loginServlet.jsp) 没有显示可以通知登录名和密码的页面。我看到了由 Servlet (loginServlet.class) 生成的消息“Hello userName welcome to my blog”。当然,使用登录名和密码为空。我做错了什么?浏览器是否可以直接调用 Java 类?谢谢。
  • 查看更新的答案以解决您关于如何从浏览器调用 jsp 文件的其他问题。
  • jewelsea,你就是那个人!我已经在我的 web.xml 中进行了更改,包括“欢迎文件列表”,现在一切正常。非常感谢!
猜你喜欢
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多