04-idea实现web项目
1、idea的web项目
第一步
正常新建一个java项目,该项目在idea中的名字叫idea-servletweb-01,编写的代码存放在这个路径下F:\Git_Repositories\J2EE-servelet\projects,该路径下有着之前没用集成开发工具写的三个项目
第二步
在工程上点击鼠标右键,选择添加框架支持Add Framework Support,
然后选择JavaEE的版本,具体选什么更具自己安装的Tomcat的版本选择,具体选择如下图
javaEE8的子规范是Servlet4.0,我们所安装的Tomcat9实现了Servlet4.0,JDK是1.8,所以选择javaEE8,然后勾选WebApplication,默认创建web.xml。点击OK。
这样就该项目就是一个web项目了。可以看到左边新生成了一个web,打开里面可以看到里面帮我们建好了WEB-INF文件夹,以及该目录下的一个web.xml文件。我们自己可以在web目录下新建目录如css、html和js,但这不是必须的。但是在WEB-INF目录下必须要建classes和lib目录,具体要不要手动创建,还是以后idea会自动生成还不确定,这里手动新建。
第三步
配置项目的Tomcat服务器。选择Run->Edit Configuration->左上角加号->Tomcat Server->Local
点开后,找到右边的Configure,选择自己Tomcat的路径
可以看到上面Tomcat Home跟我们之前配CATALINA_HOME一样,路径是找到Tomcat中的bin的上级目录就是Tomcat的家,Name那里可以自己命名,Tomcat 9。选好号点击OK。
该界面中可以设置项目调试的浏览器,不用管,以及端口号的设置。
第四步
回到Edit Configurations,选择第二个选项Deployment(部署),选中项目
我们可以修改部署到Tomcat服务器中该项目的名字,可以看到Application context中默认是/idea_servletweb_01_war_exploded,我们可以修改为taobao,这就是该项目部署到Tomcat里webapps中的项目的名字,到时候浏览器中请求路径中的项目名就是taobao,而不是我们之前创建项目时的Project Name:idea-servletweb-01,这个名字只是在本项目在idea中的项目名。
示例:
我们先在html目录下新建一个welcome.html,在里面写一个超链接,连接到该项目的一个Servlet实现类,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>welcome page</title>
</head>
<body>
<a href="/taobao/hello">hello</a>
</body>
</html>
然后点开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-name>HelloServlet</servlet-name>
<servlet-class>com.javaweb.servletstudy.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
复制其中的包名,在src下创建包
发现创建的包是如此显示
点击上面的小齿轮,将Flatten Packages和Compact Middle Packages的勾去掉
复制类名,新建一个Servlet实现类HelloServlet
package javaweb.servletstudy;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=UTF-8");
PrintWriter out = servletResponse.getWriter();
out.print("<html>");
out.print("<head>");
out.print("<title>hello servlet</title>");
out.print("<body>");
out.print("我正在学习中.....");
out.print("</body>");
out.print("</head>");
out.print("</html>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
还有一点需要注意,idea工具不提供JavaEE Libraries全套规范,我们要实现Servlet接口,需要导入Tomcat的lib目录中的servlet-api包。先点击右上角的文件图标,Project Structure。然后点击Libraries,点击加号,点击java,找到要导入的包,选中要加到哪个项目模块,点击OK,点击Apply应用,点击OK。完成
编写号代码后,在右上角选择Tomcat 9,然后运行
运行后就会调用之前设置的浏览器和默认的请求http://localhost:8080/taobao/
然后输入http://localhost:8080/taobao/html/welcome.html
点击hello,调转
我们可以看到Tomcat服务器启动的一些乱码问题,之后会解决
2、web项目连接数据库
1、首先创建普通的java项目,Project Name命名为idea-servletweb-02,保存在F:\Git_Repositories\J2EE-servelet\servletstudyproject下
2、点击工程名字,右键选择添加框架支持Add Framework Support,选择JavaEE8,选择WebApplication,应用Apply,OK。
3、在新生成的web中选择WEB-INF,打开web.xml文件,编写请求与资源的绑定,此次绑定一个类,命名为servlet jdbc query,完整的类名为com.servletstudy.jdbc.ListServletEmp,请求虚拟路径/query,保存
4、根据web.xml文件中的信息,建包com.servletstudy.jdbc,建ListServletEmp类,实现Servlet规范。
5、配置Tomcat服务器。Run->Edit Configurations->左边点击+号->选择Tomcat->Local->在Application server选项点击Configure->Tomcat Home中选择下载的Tomcat,选择到lib目录的上一级,点击ok。然后点击部署选项Deployment,选择要部署到服务器的项目,没有选择就右边+号点击第一个。注意选择的项目是这样的(项目名:war exploded),而不是单单一个项目名,下面Application context中修改部署到服务器中的程序名为/JDBCQuery
6、添加Servlet规范jar包。File->Project Structure->Libraries->点击+号->java->从Tomcat的lib中选择servlet-api.jar->Apply->ok。重复一遍添加MySQL驱动。
7、编写一个数据库连接工具类JDBCUtil,方便连接数据库。
8、把查询结果按照下面的HTML输出到浏览器
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>员工信息</title>
</head>
<body>
<h3 align="center">员工列表</h3>
<hr width="60%">
<table border="1" align="center" width="50%">
<tr align="center">
<th>序号</th>
<th>员工编号</th>
<th>员工姓名</th>
<th>员工薪资</th>
</tr>
<tr align="center">
<td>1</td>
<td>111</td>
<td>ccc</td>
<td>13232</td>
</tr>
</table>
</body>
</html>
9、所以实现类这样写,将从标签到的所有内容复制到类中,批量编辑,按下 alt+caps lock ,用鼠标左键拖动,前面添加out.print("
package com.servletstudy.jdbc;
import com.servletstudy.utils.JDBCUtil;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ListServletEmp implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
servletResponse.setContentType("text/html;charset=UTF-8");
PrintWriter out = servletResponse.getWriter();
out.print("<html>");
out.print( " <title>员工信息</title>");
out.print( "<body>");
out.print( "<h3 align=\"center\">员工列表</h3>");
out.print( "<hr width=\"60%\">");
out.print( "<table border=\"1\" align=\"center\" width=\"50%\">");
out.print( " <tr align=\"center\">");
out.print( " <th>序号</th>");
out.print( " <th>员工编号</th>");
out.print( " <th>员工姓名</th>");
out.print( " <th>员工薪资</th>");
out.print( " </tr>");
try {
conn = JDBCUtil.getConnection();
stmt = conn.createStatement();
String sql = "select empno,ename,sal from emp";
rs = stmt.executeQuery(sql);
int i = 1;
while (rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
Double sal = rs.getDouble("sal");
out.print( " <tr align=\"center\">");
out.print( " <td>"+(i++)+"</td>");
out.print( " <td>"+empno+"</td>");
out.print( " <td>"+ename+"</td>");
out.print( " <td>"+sal+"</td>");
out.print( " </tr>");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JDBCUtil.close(conn,stmt,rs);
}
out.print( "</table>");
out.print( "</body>");
out.print( "</html>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
写好代码,点击Tomcat部署运行。出现如下异常
我们该项目是导入了MySQL驱动jar包的,而且在web目录下新建了一个lib类库目录,同时也将MySQL驱动粘贴进去了,但是还是报了类没找到异常,百度了一下,有一种方法是将MySQL驱动jar报放进Tomcat的lib目录里,没试过。另一种是到Project Structure->Artifacts->选中要部署的项目->选中WEB-INF->鼠标右键->Add Copy Of->Libraries->选择要添加的数据库驱动->Apply应用:因为我们是在idea项目中添加了数据库驱动,确保在idea中有这个驱动可以用,不报红,但是部署到Tomcat服务器中的的项目是没有这个驱动jar包的,Tomcat的的lib全局依赖中也没有,所以我们要将这个数据库驱动放到打包到项目中。
最后我把项目中web目录中lib里的数据库驱动删了也报异常,所以需要两者都存在驱动才行。而且是在lib中先添加MySQL驱动后才能打开Project Structure中在WEB-INF中添加数据库驱动,lib中的删除了得把Project Structure中在WEB-INF中的数据库驱动移除,先在lib加,然后WEB-INF。