学习JavaWeb的第4天(2021-11-10)

学习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包。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值