Java知识点复习 ------- Servlet篇

目录

WEB

Web服务器

服务器软件

Web服务器软件

常见Java相关的Web服务器软件

Tomcat的目录层次

JavaWeb应用程序

 web项目的三层结构介绍

Tomcat的体系结构

Servlet

Servlet的实现类

tomcat是如何将请求定位到具体的Servlet的

Servlet的生命周期: 

HttpServletRequest对象

HttpServletRequest简介

HttpServletRequest获取表单参数

常见的请求方式 (get/post)

GET请求

GET优点

POST请求

POS优点

注册案例

注册功能分析

注册页面register.html

注册的Servlet


WEB

WEB:即网页的意思:它用于表示Internet主机上供外界访问的资源。

Internet上供外界访问的Web资源分为:

  •         静态web资源如html 页面):一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件(直接响应),返回给客户端,客户端(浏览器)解析并渲染显示出来。
    •         动态web资源:一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,服务器将动态资源转换成静态资源后,再返回给客户端解析渲染处理。
  • 简单区别:

    其实简单来说,静态资源是客户端请求服务器,服务器直接响应内容,例如Html,css,js等。静态资源并不会根据时间点的不同而会有所变化,跟数据库不打交道。而动态资源跟数据库关联,在不同的时间点访问,服务端返回的展现效果是不同的,例如Servlet,jsp等,浏览器只能接收静态资源。

Web服务器

安装了服务器软件的计算机,本质上也是硬件,只是配置比较好。硬盘比较大,CPU核数比较多,CPU更加高级,反正就是比一般的电脑要好。

服务器软件

接收处理用户的请求,并响应用户请求的计算机软件。

Web服务器软件

  • 将web项目部署到web上,让用户通过浏览器访问到这些项目。
  • Web服务器接收用户的浏览器发出的Http请求,处理并响应用户请求。

常见Java相关的Web服务器软件

webLogic:oracle,大型的JavaEE服务器,支持所有的JavaEE规范,收费。

webSphere:IBM,大型的JavaEE服务器,支持所有的JavaEE规范,收费。

JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,使用免费,一些文档和服务是收费的。

Tomcat:Apache基金组织,中小型JavaEE服务器,仅仅支持少量的JavaEE规范,开源免费。

Tomcat的目录层次

  • Bin:存放二进制文件,启动和关闭tomcat
  • Conf:配置文件,配置端口,配置数据库连接池,web.xml
  • Lib:jar文件,支撑tomcat运行
  • Logs:存放tomcat运行日志信息
  • Temp:临时目录,给tomcat自己用的
  • Webapps:存放我们要部署的项目
  • Work:工作目录,区别(jsp)
  • JavaWeb应用程序

WEB应用程序指供浏览器访问的程序,通常也简称为web应用。

一个web应用由多个静态web资源和动态web资源组成,如:html、css、js文件、Jsp文件、java程序、支持jar包、相关的配置文件等等

Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。

 web项目的三层结构介绍

一般web项目的结构分为三层,即DAO层,Service层、Web层。下面对这三个层次进行详细介绍:
1、DAO层又叫持久层,是用来与数据库进行交互的,即对数据库进行增删改查操作;一般会有一个BaseDAO其中包含对数据库进行纯粹的增删改、查询对象(集)、查询特殊数据等三种方法。然后对于项目中的具体业务在进行设置相应的xxxDAO,例如BookDAO,此时BookDAO是继承了BaseDAO的一个接口,然后提供一个此接口的实现类,即BookDAOImpl来具体实现BookDAO中的抽象方法。(注意在xxxDAO的实现类中,就要提供具体的sql语句了,来进行具体的查询)
2、Service层又叫业务层,是用用来连接DAO层和Web层的。在Service中提供项目具体需要的方法(比如登陆,注册等),然后通过调用对应得DAOImpl中的方法操作数据库,返回需要的数据。
3、Web层又叫视图展示层,调用Service层来处理业务,相应数据给客户端。
 

MVC与三层架构理解_iqqcode的博客-CSDN博客_三层架构和mvc

servlet合并

法一:html里面使用隐藏域的方法

 法二:使用映射的方法

Tomcat的体系结构

详细说明:

Server代表整个Servlet容器组件,是最顶层元素,包含多个Service元素。

Service包含一个Engine元素以及多个Connector元素

Connector元素代表和客户端程序交互的组件,负责接收客户端请求和向客户端返回响应。

Engine中可以包含多个Host,Host表示一个虚拟主机,他可以包含多个web应用

Context代表运行在虚拟主机上的单个web应用

使用idea创建一个JavaWeb项目

Servlet

Servlet是sun公司提供的一门用于开发动态web资源的技术,可以实现和客户端的交互,接收客户端请求和给客户端返回响应。Servlet是Java编写的一种特殊的Java类,用于处理Web应用程序中的HTTP请求和响应。它们运行在Web服务器中,如Tomcat等,通过Servlet容器调用。Servlet可以接收来自客户端的HTTP请求并生成动态的Web内容作为响应。Servlet通常用于创建Web应用程序的后端逻辑,并与数据库或其他Web服务进行交互。Servlet还可以通过Java EE规范中的各种API实现各种功能,如会话管理、安全性和持久性。Servlet在Web开发中扮演着重要的角色,是Java Web应用程序开发的核心技术之一。

Sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源需要完成以下2个步骤:

  1. 编写一个Java类,实现servlet接口。
    public class Servlet01 extends HttpServlet {
    
        private String code;
    
        public Servlet01() {
            System.out.println("Servlet01的构造方法被调用了");
        }
    
        @Override
        public void init() throws ServletException {
    
            System.out.println("Servlet01的init方法被调用了");
    
            ServletConfig servletConfig = this.getServletConfig();
            //获取配置对象中的数据
            code = servletConfig.getInitParameter("code");
        }
    
        //客户端发送的请求是Get时,就会调用doGet()
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req,resp);
        }
    
        //客户端发送的请求是Post时,就会调用doPost()
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            System.out.println("Servlet01的doPost方法被调用了");
    
        }
    
        @Override
        public void destroy() {
            System.out.println("Servlet01的destroy方法被调用了");
        }
    }
    
  2. 把开发好的Java类部署到web服务器中。
       <servlet>
            <servlet-name>RegisterServlet</servlet-name>
            <servlet-class>com.qf.servlet.RegisterServlet</servlet-class>
            <init-param>
                <param-name>code</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>RegisterServlet</servlet-name>
            <url-pattern>/register</url-pattern>
        </servlet-mapping>

Servlet的实现类

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServletHttpServlet

  • GenericServlet是Servlet接口的实现类,但它是一个抽象类,它唯一的抽象方法就是service()方法,我们可以通过继承GenericServlet来编写自己的Servlet。
  • HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。并且HttpServlet extends GenericServlet

 HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法

tomcat是如何将请求定位到具体的Servlet的

Tomcat是一个Web服务器和Servlet容器,负责接收客户端请求并将其路由到正确的servlet处理。下面是Tomcat如何将请求定位到具体的Servlet的简要流程:

  1. 当Tomcat启动时,它将扫描Web应用程序的部署描述符(web.xml)和注解,以确定所有可用的Servlet。

  2. 当客户端发送一个HTTP请求时,Tomcat将根据请求的URL路径和web.xml中的servlet-mapping配置来确定请求的目标Servlet。如果请求的URL与servlet-mapping的url-pattern匹配,则Tomcat将将请求发送给相应的Servlet。

  3. Servlet容器会创建一个HttpServletRequest对象,其中包含了请求的所有信息,例如请求参数、请求头、请求体等。

  4. Tomcat将HttpServletRequest对象和一个HttpServletResponse对象传递给目标Servlet的service()方法。

  5. Servlet容器在调用service()方法之前还会调用init()方法(如果Servlet尚未初始化),并在处理完请求后调用destroy()方法(如果Servlet被销毁)。

  6. Servlet使用HttpServletRequest对象中的信息处理请求,并生成一个HttpServletResponse对象,其中包含要发送给客户端的响应内容。

  7. Tomcat将HttpServletResponse对象中的响应头和响应体发送回给客户端。

通过这个流程,Tomcat能够将客户端请求定位到正确的Servlet,并生成相应的响应。这使得开发人员能够使用Servlet来处理各种类型的HTTP请求,并生成动态的Web页面。

Servlet的生命周期: 

第一次发送请求时:创建Servlet对象

             调用构造方法

             调用init方法

            根据请求方式分别调用doGet、doPost方法

第二次、第三次、第n次发搜请求时:

         根据请求方式分别调用doGet、doPost方法

服务器正常关闭时:destroy-销毁方法

小结:Servlet是通常情况下是单例的(该Servlet只创建一个对象)

Servlet何时被创建?

1.第一次发送请求时被创建

2.在web.xml的Servlet标签中配置了<load-on-startup>1</load-on-startup>,表示项目启动时就会创建Servlet对象,数字最小优先级越高

3.不在web.xml中配置servlet,直接在Servlet类名上添加注解的方式来配置Servlet,在注解中添加loadOnStartup = 1表示项目启动时就会创建Servlet对象,

@WebServlet(value = "/ser01",initParams=@WebInitParam(name="code",value="UTF-8"),loadOnStartup = 1)

Servlet是否是单例的? 

通常情况下是单例的; 如果Servlet实现了SingleThreadModel,当该Servlet阻塞时,会新创建Servlet对象 

HttpServletRequest对象

HttpServletRequest简介

在这里插入图片描述 定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service方法。 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

小结: 客户端请求协议都是基于HTTP所以我们选用HttpServletRequest来操作用户发送过来的请求的数据 跟请求相关信息都是去找HttpServletRequest对象!

HttpServletRequest获取表单参数

  • html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
  <h2>用户注册</h2>
  <hr/>
  <form action="UserServlet.do?action=register" method="post">
          账号:<input type="text" name="username"/><br/>
          密码:<input type="password" name="password"/><br/>
          性别:<input type="radio" name="sex" value="1" checked="checked"/>男
        <input type="radio" name="sex" value="0"/>女<br/>
          爱好:<input type="checkbox" name="hobby" value="足球"/>足球
          <input type="checkbox" name="hobby" value="篮球"/>篮球
          <input type="checkbox" name="hobby" value="排球"/>排球
          <input type="checkbox" name="hobby" value="悠悠球"/>悠悠球<br/>
    <input type="submit" value="注册"/>
    <input type="reset" value="取消"/>
  </form>
</body>
</html>
  • Servlet程序

// 接收表单的值
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String[] hobby = request.getParameterValues("hobby");
​
// 封装成一个对象
Student s = new Student(username, password, sex, hobby);
System.out.println(s);

常见的请求方式 (get/post)

表单如果不指定,默认的请求方式是GET请求 点击超链接,直接浏览器输入地址 都属于get请求

GET请求

  • 参数传递方式 GET请求在浏览器地址栏传参数,以?分割URL和传输数据,参数之间以&相连 在这里插入图片描述

  • 数据量限制 GET提交的数据大小有限制(因为浏览器对URL的长度有限制)

  • 安全问题 GET方式提交数据,会带来安全问题(地址栏显示出来)

  • 乱码处理方式 每个参数都要处理 在这里插入图片描述

Tomcat8的版本中GET基本就不会乱码了,因为服务器对url的编码格式可以进行自动转换

GET优点

  • 效率高

  • 使用get场合:传递少量的非敏感的参数

POST请求

  • 参数传递方式 POST方法是把提交的数据放在HTTP包的Body中(地址栏看不到)

  • 数据量限制 POST方法提交的数据没有限制 (文件上传必须是POST)

  • 安全问题 POST提交的数据相对安全

  • 乱码处理方式 统一处理所有 在这里插入图片描述

POS优点

  • 安全性好

  • 传递数量大

  • 文件上传必须是POST请求(后期讲)

注册案例

注册功能分析

注册的本质:将用户填写的数据添加到数据库的过程。 在这里插入图片描述

注册页面register.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>
    <style type="text/css">
        *{font-size:14px;}
        td:first-child{text-align:right;}
        td:last-of-type a{vertical-align:middle;}
        a:ACTIVE,a:VISITED {color:blue;}
        #checkImg{vertical-align: middle;}
    </style>
  </head>
  <body>
    <center>
        <form action="/register/regServlet" method="post">
            <table>
                <tr>
                    <td>用户名:</td>
                    <td>
                        <input type="text" name="username"/>
                        <font color="red"> *</font>
                    </td>
                </tr>           
                <tr>
                    <td>密码:</td>
                    <td>
                        <input type="password" name="password"/>
                        <font color="red"> *</font>
                        <font id="passwordMsg" color="red"></font>
                    </td>
                </tr>           
                <tr>
                    <td>确认密码:</td>
                    <td>
                        <input type="password" name="repassword"/>
                        <font color="red"> *</font>
                        <font id="repasswordMsg" color="red"></font>
                    </td>
                </tr>   
                <tr>
                    <td>年龄:</td>
                    <td><input type="text" name="age"/></td>
                </tr>           
                <tr>
                    <td>性别:</td>
                    <td>
                        <input type="radio" name="sex" value="男"/>男
                        <input type="radio" name="sex" value="女"/>女
                    </td>
                </tr>           
                <tr>
                    <td>邮箱:</td>
                    <td><input type="text" name="email"/></td>
                </tr>   
                <tr>
                    <td>生日:</td>
                    <td><input type="text" name="birthday" /></td>
                </tr>           
                <tr>
                    <td>擅长的技术:</td>
                    <td>
                        <input type="checkbox" name="hobby" value="C"/>C
                        <input type="checkbox" name="hobby" value="C++"/>C++
                        <input type="checkbox" name="hobby" value="Java"/>Java
                        <input type="checkbox" name="hobby" value="IOS"/>IOS
                        <input type="checkbox" name="hobby" value="PHP"/>PHP
                        <input type="checkbox" name="hobby" value="Android"/>Android
                    </td>
                </tr>           
                <tr>
                    <td>地址:</td>
                    <td>
                        <select name="address">
                            <option value="none">--请选择地址--</option>
                            <option value="北京">北京</option>
                            <option value="上海">上海</option>
                            <option value="南京">南京</option>
                            <option value="广州">广州</option>
                            <option value="深圳">深圳</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>自我描述:</td>
                    <td>
                        <textarea cols="50" rows="5" name="description"></textarea>
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td style="text-align:left;padding-top:10px;">
                    <input type="submit" value="注册" />
                    <a href="login.jsp">登录</a></td>
                </tr>
            </table>        
        </form>
    </center>
  </body>
</html>

注册的Servlet

package servlet.request;
​
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
​
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
import util.JDBCUtils;
​
@SuppressWarnings("all")
public class RegisterServlet extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 解决响应乱码问题
        response.setContentType("text/html; charset=UTF-8");
        
        // 解决请求中的中文乱码问题:只能解决post请求的乱码
        request.setCharacterEncoding("UTF-8");
        
        // 1. 获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String age = request.getParameter("age");
        String sex = request.getParameter("sex");
        String email = request.getParameter("email");
        String birthday = request.getParameter("birthday");
        // 爱好是多值,需要使用getParameterValues获取
        String[] hobby = request.getParameterValues("hobby");
        String hobbies = "";
        for (String h : hobby) {
            hobbies += "," + h;
        }
        // ,1,2,3
        hobbies = hobbies.substring(1);
        String address = request.getParameter("address");
        String description = request.getParameter("description");
        
        // 将数据入库
        // 获取连接对象
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = JDBCUtils.getConnection();
            pstmt = conn.prepareStatement("insert into user values(null,?,?,?,?,?,?,?,?,?)");
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            pstmt.setString(3, age);
            pstmt.setString(4, sex);
            pstmt.setString(5, email);
            pstmt.setString(6, birthday);
            pstmt.setString(7, hobbies);
            pstmt.setString(8, address);
            pstmt.setString(9, description);
            
            pstmt.executeUpdate();
            String appName = request.getContextPath();
            response.getWriter().write("注册成功!<a href='"+appName+"/login.html'>立即登录</a>");
            
        } catch (SQLException e) {
            e.printStackTrace();
            response.getWriter().write("系统正在维护,请稍后再试...");
        } finally {
            JDBCUtils.release(conn, pstmt, null);
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李仙桎

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值