学习JavaWeb的第4天(2021-11-10)
一、实现能够在cmd上敲命令startup.bat来方便的启动Tomcat服务器
我们现在启动Tomcat非常的麻烦,需要到它的家目录里面找到startup.bat,然后双击。我们希望以后无论在哪里打开cmd都可以通过输入命令startup.bat来启动Tomcat。
现在输入:
配置:
1、配置tomcat的家目录在Path的环境变量里面:
D:\install\apache-tomcat-10.0.12\apache-tomcat-10.0.12\bin
2、
发现这个错误之后,还需要配置:
去系统变量里面新建:CATALINA_HOME
3、现在又发现有乱码的情况:
找到conf目录下面的配置文件:logging.properties
修改:改成GBK
再次输入startup.bat
二、总结相关Servlet的知识点:
Servlet知识点:
1、谁去编写这些具体的Servlet的类,那么就由谁来编写请求路径和具体调用哪个类的映射关系。
2、现在Servlet的接口规范已经由sun公司的一帮人帮我们写好了。
Tomcat服务器也已经安装好了,我们javaweb程序员只需要编写好具体的Servlet的类和写好对应的映射文件。
对于javaweb程序员来说,我们只需要做两件事:
1、编写一个类去实现Servlet接口
2、写好配置文件,在配置文件里面指定请求路径和类名之间的关系。
注意:
Tomcat里面的代码已经全部写好了,所以我们对于配置文件的命名和位置不能乱起和乱放。
配置文件的命名和位置都是sun公司规定的,是Servlet规范中的明细。
严格意义上来说,Servlet其实不是简单的一个接口:
Servlet规范中规定了:
1、一个合格的web应用开发的时候应该有一个怎样的目录结构
2、一个合格的web应用开发的时候配置文件应该怎么写
3、一个合格的web应用开发的时候的配置文件应该放在哪里。
4、一个合格的web应用开发的时候java程序应该放在哪里。
这些都是Servlet规范中规定的。
Tomcat服务器要遵循Servlet规范,JavaWeb的程序员也要遵循这个规范,只有这样开发出来的webapp才能和Tomcat服务器解耦合。
从浏览器发送数据到服务器叫请求;
从服务器发送数据给浏览器叫响应。
三、开发一个带有Servlet程序的Web应用
1、在webapps里面新建一个目录叫做crm
2、在crm目录下新建一个目录:WEB-INF
这个目录的名字必须是这个。
3、在WEB-INF目录下面新建一个目录叫做classes,必须是这个。这里存放的是java程序编译后的字节码文件。
4、在WEB-INF目录下面新建一个目录叫做lib。这个目录不是必须的。但是如果你的web项目里面需要引入第三方的jar的话,就需要把jar包放在这个目录下面。例如连接数据库需要的驱动包。这也是Servlet规范
5、在WEB-INF目录下面新建一个文件:web.xml
注意这个文件必须叫做web.xml,且位置一定是放在WEB-INF目录下的。在这个配置文件里面写好了请求路径和servlet类之间的映射关系。这个最好从其他的webapps里面去拷贝,不要自己手写。
这个是web.xml里面最基本的内容。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">
</web-app>
6、编写一个java小程序,这个小程序也不能随意开发,这个小程序必须实现Servlet接口。
问:这个Servlet接口是sun公司制定的,那这个东西在哪里呢?
Servlet不在JDK里面,因为Servlet不是javaSE,而是数据javaEE,属于另外一套类库了。
之前也说了,tomcat是纯java语言编写的,它也实现了Servlet的接口,所以在Tomcat的lib下面应该有servlet的jar包
问:这个servlet接口的全类名是多少?
将这个jar解压缩:
我们下载的tomcat是10.0版本的,这个版本的tomcat支持的是javaEE9的规范,它的包名不是javax.servlet了,而是jakarta.servlet
注意:Oracle把javaEE捐献给Apache了,以后不叫javaE了,叫做jakarta
javaEE8升级之后不叫javaEE9,而是jakartaEE9
javaEE8的时候对应的Servlet接口的全类名是:javax.servlet.Servlet
现在到了jakarta9的时候,全类名变成了:jakarta.servlet.Servlet
现在的Tomcat10+的版本只认识jakarta.servlet.Servlet。不认识javax。
如果还是使用javax.servlet,那就需要使用Tomcat9或者以下的版本
重点:从jakartaEE9开始Servlet接口的全名变了:jakarta.servlet.Servlet
7、编写java源代码的位置可以随便放,但是这个源代码编译之后的字节码文件需要放在classes里面。
代码:
package com.rtl.servlet;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;
public class HelloServlet implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse)throws ServletException,IOException{
System.out.println("My First Servlet,Hello Servlet!!!");
}
public void destroy(){
}
public String getServletInfo(){
return "";
}
public ServletConfig getServletConfig(){
return null;
}
}
编译这个类:
javac -d . HelloServlet.java
发现报错,说找不到Servlet这个jar包:
解决办法:
新建系统变量
去加环境变量
CLASSPATH=D:\install\apache-tomcat-10.0.12\apache-tomcat-10.0.12\lib\servlet-api.jar
重新开一个cmd
编译成功:
在这个路径下就会多出这个文件夹:
因为写源代码的时候,定义了一个这个包。
8、现在就是把com整个文件夹拷贝到WEB-INF目录下面的classes目录下。因为classes就是专门放字节码文件的。
9、在web.xml文件中编写配置信息。让请求路径和HelloServlet的全类名映射在一起。
专业属于叫做:注册Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
metadata-complete="true">
<servlet>
<servlet-name>aaabbbccc</servlet-name>
<servlet-class>com.rtl.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>aaabbbccc</servlet-name>
<url-pattern>/ascac/acac/acsa</url-pattern>
</servlet-mapping>
</web-app>
10、开始在浏览器的地址栏上输入URL来调用我们自己写的HelloServlet小程序
http://localhost:8080/crm/ascac/acac/acsa
现在的情况就是:浏览器没刷新一次,在cmd上就会打印这句话执行service()方法。
注意:浏览器上的请求路径不能随便写,这个请求路径必须和web.xml文件中的url-pattern一致。url-pattern那里不用写项目名。
浏览器上编写的路径太长太复杂,所以可以使用超链接。
注意:html文件只能放在WEB-INF目录之外。
再新建一个网页,里面放置超链接,点击整个超链接来执行Servlet的小程序。
点击Servlet这个超链接,就会调用service(),就会在Tomcat的控制台上打印。
注意:这个写超链接的形式可以省略IP和端口,但是一定要有项目名。
以后,我们不需要编写main方法了。tomcat服务器负责调用,main方法,在tomcat服务器启动的时候,执行的就是main方法,我们javaweb程序员只需要编写Servlet接口的实现类,然后将其注册到web.xml文件中即可。
现在只能找到tomcat的家目录的bin下面,双击startup.bat才能启动Tomcat。这个很麻烦,我们希望直接在cmd任意路径下输入startup就可以启动tomcat了
浏览器发送请求,到最终服务器调用Servlet的方法是一个怎样的过程?
1、用户输入URL,或者点击超链接http://localhost:8080/crm/ascac/acac/acsa
2、然后Tomcat服务器收到请求,截取路径/crm/ascac/acac/acsa
3、Tomcat找到crm这个web app
4、在web.xml配置文件里面找到/ascac/acac/acsa这个url对应的Servlet
com.rtl.servlet.HelloServlet
5、Tomcat服务器通过反射己指创建这个类的对象
6、服务器调用这个对象的service方法。
webapp项目大致的目录结构:
1、apachetomcat
2、webapps
3、项目名 :crm
4、
5、WEB-INF
之前我们的service里面是将那句话打印在Tomcat的控制台上,现在准备展示在浏览器上。这个怎么弄呢?
1、找到这个index.html是jakarta9的帮助文档
2、找到ServletResponse的帮助:
在service()方法里面使用第二个参数ServletResponse
PrintWriter out = servletResponse.printWriter();
得到的这个输出流out,可以负责将服务器的一些文字输出到浏览器。而且,这个输出流是不需要我们刷新和关闭的,这些都是由Tomcat来维护。
整个HelloServlet代码的源代码:
package com.rtl.servlet;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse)throws ServletException,IOException{
// System.out.println("My First Servlet,Hello Servlet!!!");
PrintWriter out = servletResponse.getWriter();
out.println("Hello Servlet You are my first servlet");
}
public void destroy(){
}
public String getServletInfo(){
return "";
}
public ServletConfig getServletConfig(){
return null;
}
}
由于涉及到源代码的修改,所以我们需要重新编译:
还是将编译好的字节码文件放到classes文件夹里面。
启动Tomcat服务器:
打开cmd(任意位置)
输入命令:startup.bat
在浏览器上输入:
http://localhost:8080/crm/index.html地址访问index页面
index页面里面有超链接,点击超链接会调用我们实现类HelloServlet里面的service()方法。
这就是service()方法。
点击超链接之后,会出现下面的画面:
这就实现了,将数据打印在浏览器上,而不只是输出到Tomcat的控制台上。
设想:现在我们已经实现了在浏览器上输出文字,那可不可以输出HTML代码呢?
答案是可以的。
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException,IOException{
// System.out.println("My First Servlet,Hello Servlet!!!");
PrintWriter out = servletResponse.getWriter();
out.println("Hello Servlet You are my first servlet");
out.println("<h1>Hello servlet!!!</h1>");
}
第一次尝试:
发现并没有达到我们想要的效果。
我们还需要在service()方法里面
通过第二个参数的response来设置响应的内容的类型是text或者html
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException,IOException{
servletResponse.setContentType("text/html")
// System.out.println("My First Servlet,Hello Servlet!!!");
PrintWriter out = servletResponse.getWriter();
out.println("Hello Servlet You are my first servlet");
out.println("<h1>Hello servlet!!!</h1>");
}
再试一次:
编译:
现在就可以输出HTML文件到浏览器了。
注意:我们设置响应内容的类型这句话的代码需要放在getWriter的前面。
传输HTML语言的同时有中文:
在Servlet中连接数据库怎么做?
在servlet里面直接编写JDBC的java代码。
前面准备工作:
1、创建数据库 servlet
2、创建表t_student
3、给表加入四条数据
新建一个java类
StudentServlet
package com.rtl.servlet;
import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.ServletConfig;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class StudentServlet implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException,IOException{
servletResponse.setContentType("text/html");
PrintWriter out = servletResponse.getWriter();
Connection conn = null ;
PreparedStatement ps =null ;
ResultSet rs = null;
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/servlet?useSSL=false";
String user = "root";
String password = "root";
conn = DriverManager.getConnection(url,user,password);
String sql = "select no,name from t_student";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()){
String no = rs.getString("no");
String name = rs.getString("name");
System.out.println("no="+no+",name="+name);
out.print("no="+no+",name="+name+"<br>");
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(conn!=null){
try {
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(ps!=null){
try {
ps.close();
}catch(Exception e){
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public void destroy(){
}
public String getServletInfo(){
return "";
}
public ServletConfig getServletConfig(){
return null;
}
}
尝试将查出来的数据到tomcat控制台打印一份,也在浏览器上进行输出
我们新建了一个Servlet的实现类,这个时候,需要编辑web.xml,来映射请求路径和类的关系。
添加数据库的连接jar包进入lib目录下。
修改index.html
注意:这两处发生了变化
之前时这样写的:
如果WEB-INF里面的lib包的mysql连接器换成了8.0.27版本的话,那么加载驱动包的时候,就可以写新版的类名:
加上cj
解压jar包之后:
新版本建议使用:
com.mysql.jdbc.cj.Driver
总结几个路径:
在web.xml文件里面
写url-pattern里面,不需要写项目名。
在超链接里面写href的时候,需要写上项目名。
使用IDEA的开发工具开发Servlet程序:
1、新建一个Empty Project
2、然后再在这个空工程下面new Module
新建一个普通的模块
这是一个非常普通的javaSE的工程。
如何将这个普通的javaSE的工程变成javaEE的工程呢?
1、模块servlet01右键:
选择了这个之后,IDEA就会很智能的帮我生成一个符合Servlet规范的webapp的目录结构。
重点需要注意的: 在IDEA工具中根据选择的Web Application模板生成的目录中有一个web目录,这个目录就代表webapp的根。
根是什么意思呢?
比如:项目crm的根就在这里:
项目oa的根在这里:
对等关系:
4、自动生成的index.jsp文件删除。
5、写StudentServlet.java实现Servlet
但是我们发现在JDK里面没有Servlet的jar包。