IDEA创建第一个javaweb项目——包含Java代码的项目

这篇文章我们主要介绍:
1.如果html文件中需要使用Java代码应如何做。
2.如何不通过html就能访问Java代码(其中包含了web项目中使用MySQL)。

一、前言(基础知识,可以直接跳过)

以上两个问题,都需要通过配置web.xml来实现。
我们先来了解一下web.xml中的内容,以及各个内容的含义。
web.xml

1.XML概述和HTML的区别

XML 指可扩展标记语言(eXtensible Markup Language)。
XML和HTML的区别:
1)在大多数 Web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。
2)XML 允许创作者定义自己的标签和自己的文档结构(如<to> 、 <from>)。
HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如 <p>、<h1> )。

2.XML格式介绍

IDEA中刚刚新建时web.xml中的代码如下:

<?xml version="1.0" encoding="UTF-8"?> //1)XML声明,定义XML的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。

<web-app //2)描述文档的根元素。XML文档必须包含根元素。该元素是所有其他元素的父元素。

	//3)以下4行是XML元素的属性
	 xmlns="http://xmlns.jcp.org/xml/ns/javaee" //3.1)为元素定义默认的命名空间,防止两个带有不同内容和定义的 <web-app> 元素XML文档被一起使用,发生命名冲突。
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"//3.2)含有前缀的命名空间声明。前缀是“xsi”,之后在xml中就可以使用<xsi:table>而不会和其他xml文档中的<table>冲突。
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         //3.3)xsi命名空间对应的验证文件的地址,也就是xml书写时需要遵循的语法。两部分组成,1.命名空间的名字;2.验证文件的地址,表示把定义这个命名空间的schema文件给引用进来,好让工具能够解析和验证xml文件是否符合语法规范。
         version="4.0">//3.4)web.xml的版本,也是servlet的版本
	
	//<child> 4)根的第1个子元素
		//<subchild>.....</subchild> 5)根的第2个子元素
	//</child>
	
</web-app>//6)根元素的关闭标签。在XML中,所有元素都必须有关闭标签。

如果有小伙伴想详细了解XML,参见 菜鸟教程|XML教程

3.Servlet介绍

Servlet是一种运行在支持Java语言的服务器(如Tomcalt)上的组件。Servlet最常见的用途是扩展Java Web服务器功能,处理请求和发送响应。详见:Java Web----Servlet详解(其中的“三、编写Servlet”对理解Servlet很有帮助)

二、如果html文件中需要使用Java代码应如何做

下面我们以“提交表单”为例。

1.修改hello.html中的内容为:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这里是一个标题</title>
</head>
<body>
<form action="HelloForm" method="GET">
    姓名:<input type="text" name="name">
    <br />
    年龄:<input type="text" name="age" />
    <input type="submit" value="提交" />
</form>
</body>
</html>

2.注意到<form action="HelloForm" method="GET">,我们需要新建一个Java类,名为HelloForm。
1)右键src新建Java类。
12)命名为HelloForm,并确定。
3)复制以下代码到HelloForm.java。

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

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

**
 * Servlet implementation class HelloForm
 */
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置响应内容类型
    response.setContentType("text/html;charset=UTF-8");

    PrintWriter out = response.getWriter();
    String title = "使用 GET 方法读取表单数据";
    // 处理中文
    String name =new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
    String docType = "<!DOCTYPE html> \n";
    out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "  <li><b>姓名</b>:"
            + name + "\n" +
            "  <li><b>年龄</b>:"
            + request.getParameter("age") + "\n" +
            "</ul>\n" +
            "</body></html>");
}
   // 处理 POST 方法请求的方法
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

4)复制后,会有好多红色,这是没有导入相关的jar包导致的。按提示下载就行。

3.此时,我们运行一下项目,输入hello.html并提交相应内容后,会出现如下: 这是因为服务器不知道“/webTestFinal_war_exploded/HelloForm”是什么意思,不知道遇到这个它该怎么做。
error
4.下面就需要配置web.xml,来使服务器认得“/webTestFinal_war_exploded/HelloForm”。
将web.xml修改如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <!-- 类名 ,随便,一般是Servlet类名-->
        <servlet-name>HelloForm</servlet-name>
        <!-- 所在的包 ,Servlet的位置-->
        <servlet-class>HelloForm</servlet-class>
    </servlet>
    <servlet-mapping>
        <!-- 跟上面名字相同 -->
        <servlet-name>HelloForm</servlet-name>
        <!-- 访问的网址 ,浏览器通过该url找到Servlet,一定要加-->
        <url-pattern>/HelloForm</url-pattern>
    </servlet-mapping>
</web-app>

5.下面我们再运行一下。当当当当!!!成功啦!!!
成功啦!!!

三、如何不通过html就能访问Java代码

做项目时,访问数据库是必不可少的,下面我们以Javaweb项目如何使用MySQL为例,介绍如何不通过html就能访问Java代码。

1.IDEA连接数据库。
请见 后端开发配置全过程(IDEA中使用MySQL)。完成后,项目中会出现:

在这里插入图片描述

进行以下操作时,请确保数据库已打开,并确认数据库中有websites表。

2.新建一个名为DatabaseAccess的Java类,并将以下代码复制:

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

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

/**
 * Servlet implementation class DatabaseAccess
 */
@WebServlet("/DatabaseAccess")
public class DatabaseAccess extends HttpServlet {
    private static final long serialVersionUID = 1L;
    // JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/footbed";

    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "xxxx";
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DatabaseAccess() {
        super();
        // TODO Auto-generated constructor stub
    }
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Connection conn = null;
    Statement stmt = null;
    // 设置响应内容类型
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String title = "这是一个title";
    String docType = "<!DOCTYPE html>\n";
    out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n");
    try{
        // 注册 JDBC 驱动器
        Class.forName(JDBC_DRIVER);

        // 打开一个连接
        conn = DriverManager.getConnection(DB_URL,USER,PASS);

        // 执行 SQL 查询
        stmt = conn.createStatement();
        String sql;
        sql = "SELECT id, name, url FROM websites";
        ResultSet rs = stmt.executeQuery(sql);

        // 展开结果集数据库
        while(rs.next()){
            // 通过字段检索
            int id  = rs.getInt("id");
            String name = rs.getString("name");
            String url = rs.getString("url");

            // 输出数据
            out.println("ID: " + id);
            out.println(", 站点名称: " + name);
            out.println(", 站点 URL: " + url);
            out.println("<br />");
        }
        out.println("</body></html>");

            // 完成后关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
}

其中,这段代码非常重要,对应浏览器路径。
url
在web.xml中,我们也配置过一个浏览器路径,通过这两个路径都可以访问到DatabaseAccess.java,因此只配置一个就可以。切记:两个路径不要重名,否则反而会让Tomcat启动不了。也不要同时使用,不然有一个会用不了。
我们把两个路径配成不一样的,一会儿尝试一下是否都可以使用。

//web.xml
<url-pattern>/test/DatabaseAccess</url-pattern>
//DatabaseAccess.java
@WebServlet("/DatabaseAccess")

3.现在,我们运行一下项目,先尝试第一个。
修改url为http://localhost:8080/webTestFinal_war_exploded/test/DatabaseAccess
并没有出现我们预想的效果。
19
回过头来看看IDEA是否报错,发现真的报错了。
数据库出错

Class.forName(JDBC_DRIVER);

提示是这一行代码报错了,但是web项目的数据库连接和只有一个Java文件时的数据库连接,确实是按着同一个过程来的,为什么这里不行呢。

原来是tomcat找不到MYSQL JAR包!
必须把mysql-connector-java-8.0.19-bin.jar导入到tomcat的lib目录下面
java项目中,只需要引入mysql-connector-java-8.0.19-bin.jar就可以运行java项目。  
web项目中,当Class.forName(“com.mysql.cj.jdbc.Driver”);时,IDEA是不会去查找驱动的。所以要把mysql-connector-java-8.0.19-bin.jar拷贝到tomcat下lib目录。

4.移动好位置后,我们再来运行一下。成功啦!!!
访问数据库成功啦
5.修改一下web.xml中的类名,这次我们用第2个url尝试一下,也是可以的。
第二个url

到这里使用IDEA创建第一个javaweb项目——包含Java代码的项目,就结束啦。
如果哪里有错误,欢迎大家批评指正。
如果能帮到您,麻烦小手点个赞哦~~~

发布了11 篇原创文章 · 获赞 9 · 访问量 2265

猜你喜欢

转载自blog.csdn.net/dear_jing/article/details/104106249