IDEA创建第一个javaweb项目——包含Java代码的项目
IDEA创建第一个javaweb项目——包含Java代码的项目
这篇文章我们主要介绍:
1.如果html文件中需要使用Java代码应如何做。
2.如何不通过html就能访问Java代码(其中包含了web项目中使用MySQL)。
一、前言(基础知识,可以直接跳过)
以上两个问题,都需要通过配置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类。
2)命名为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”是什么意思,不知道遇到这个它该怎么做。
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);
}
}
其中,这段代码非常重要,对应浏览器路径。
在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
并没有出现我们预想的效果。
回过头来看看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尝试一下,也是可以的。
到这里使用IDEA创建第一个javaweb项目——包含Java代码的项目,就结束啦。
如果哪里有错误,欢迎大家批评指正。
如果能帮到您,麻烦小手点个赞哦~~~
上一篇: 国内PaaS概述及EEPlat定位
下一篇: EEPlat执行引擎运行流程
推荐阅读
-
Java--IDEA创建多服务模块的SpringCloud微服务项目
-
IntelliJ IDEA 创建 Java 项目及创建 Java 文件并运行的详细步骤
-
IDEA创建第一个javaweb项目——包含Java代码的项目
-
Java--IDEA创建多服务模块的SpringCloud微服务项目
-
Java Web项目使用IntelliJ IDEA 15与Maven创建的图文详解
-
IntelliJ IDEA 创建 Java 项目及创建 Java 文件并运行的详细步骤
-
IDEA使用Gradle创建一个简单的java项目 & SpringBoot项目
-
Java Web项目使用IntelliJ IDEA 15与Maven创建的图文详解