Servlet(知识点+实例项目)

前情回顾

文章目录

1.什么是API:

①API是应用程序编程接口(Application Programming Interface);
②其包括源码,字节码和帮助文档(注意版本号一致)。

2.JavaSE和JavaEE:

① JavaSE:
<1>javaSE是java的标准版本,有一套基本类库;
<2>源码储存在JAVA_HOME\src.zip下;
<3>字节码储存在JRE_HOME\lib\rt.jar下;
②JavaEE:
<1>javaEE是java的企业版本,有一套企业项目类库;

3.B/S架构和C/S架构:

C/S架构:

<1>C/S架构是Client/Server(客户端/服务器);(APP)
<2>C/S架构优缺点:
优点:
①速度快,用户体验好;
②大部分数据继承到客户端,相对安全;
缺点:
①升级时升级部分较多;
②需要安装特定的软件,才能访问服务器。

B/S架构:

<1>B/S架构是Browser/Server(浏览器/服务器);(网页);
<2>B/S架构优缺点:
优点:
①无需安装,有浏览器就行;
②升级仅需要升级服务器端;
缺点:
①所有数据继承在服务器端,相对不安全;
②速度慢,用户体验差;

Servlet

"serv"代表服务器端,“let”代表小程序;
本机IP地址为:127.0.0.1或者localhost;

1.准备工作

配置环境变量:

①新建JAVA_HOME变量,值为jdk安装路径;
②将①加入到path中;
③新建CATALINA_HOME变量,值为Tomcat安装路径;
④将③加入到path中。

Tomcat:

①Tomcat 服务器是一个免费的开放源代码的Web 应用服务器;
②Tomcat的开启和关闭:
开启:TomcatX/bin/startup.bat(windows),startup.sh(linux);
关闭:TomcatX/bin/shutdown.bat(windows),shutdown(linux);

2.开发过程

(1)文本文件开发流程:

搭架:

①在任意处建立文件夹;
②在文件夹内可建立html等前端文件夹存放前端文件;
③在文件夹内建立WEB-INF文件夹(必须);
WEB-INF中必须包含:
<1>classes文件夹:用于存放字节码文件;
<2>lib文件夹:用于存放jar包;
<3>web.xml文件:存放“书写规范”;

web.xml文件书写规范:

<servlet>
	<servlet-name>(实现类变量)</servlet-name>
	<servlet-class>(实现类路径)</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>(实现类变量)</servlet-name>
	<url-pattern>(/+别名)</url-pattern>
</servlet-mapping>

部署:

将总文件夹拷贝到TomcatX/webapps包下;

访问:

<1>startup操作运行tomcat;
<2>访问localhost:8080/(文件夹名+路径名)。

(2)Servlet接口:

Servlet接口:(javax.servlet.Servlet)

①Tomcat服务器下的lib文件有一个jar包存放Servlet接口;
②Http服务器只能调用【动态资源文件】,即Servlet的实现类;

HttpServlet抽象类:

①HttpServlet是一个抽象类,是Servlet的子类;
②与Servlet的对比:
<1>Servlet是一个接口,调用需实现内部的五个抽象方法;
<2>HttpServlet是一个抽象类,调用它仅需重写内部的service()方法;
<3>HttpServlet相比Servlet的好处:降低接口中实现类的难度;
其同时也是抽象类相比接口的好处。

(3)Servlet对象的生命周期:

概述:

①其实现类实例对象仅能由Http服务器创建;
②默认情况下,Http服务器收到Servlet第一个请求时创建实例对象;
③Http运行时,一个Servlet仅能创建一个实例对象(进程),不同用户访问是多线程;
④Http关闭时,自动将所有的Servlet对象销毁。

修改创建实例对象时机为网页开启执行:

<servlet>
	...
	<load-on-startup>(大于0的整数)</load-on-startup>
</servlet>

(4)HttpServletResponse接口:

HttpServletResponse概述:

①该接口来自于Servlet接口中;
②该接口实现类由Http服务器负责提供;
③负责将doGet或doPost等方法写入响应体并交给浏览器。

HttpServletResponse功能:

①将相应结果以二进制写入响应体:
print和write的对比:
<1>write()方法会把传入的int类型数据转换为ASCII码对应字符;
<2>print()方法会正常输出传入的int类型数据。

protected void doGet(HttpServletResponse response,HttpServletRequest){
	//执行结果
	String result = "...";	
	//拿到输出流
	PrintWriter pw = response.getWriter();	
	//用write(...)将执行结果打印到浏览器
	pw.write(result);
	
	//用print(...)将执行结果打印到浏览器
	pw.print(result);			
}

②修改输出到浏览器的编译模式:
在拿到输出流前:

//可以在浏览器上打印html语句
response.setContentType("text/html");

//可以在浏览器上打印中文
response.setContentType("text;charset=utf-8");

③控制浏览器向指定服务器发送请求:

response.sendRedirect("(网址路径)");

(5)HttpServletRequest接口:

HttpServletRequest概述:

①来自Servlet接口中;
②该接口的实现类由Http负责提供;
③该接口负责在doGet()或者doPost()方法运行时读取Http协议包中的信息。

HttpServletRequest功能:

①读取Http协议包中【请求行】信息;

//读取URL信息
String url = request.getRequestURL().toString();
//读取method信息
String method = request.getMethod();
//读取URI信息(URL的字符串截取)
String uri = request.getRequestURI();

②读取请求对象获得【请求头】中请求参数和名称;

//获得所有参数名称(返回枚举类)
Enumeration paramNames = request.getParameterNames();
//遍历枚举类(类似迭代器遍历集合)
while(paramNames.hasMoreElements()){
	String paramName = (String)paramNames.nextElement();
	//获取请求参数值
	String value = request.getParameter(paramName);
}

③从【请求体】中获取参数信息:(doPost()方式)

//获取参数值
String value = request.getParameter(paramName);

④修改请求体的解码方式为utf-8:

request.setCharacterEncoding("utf-8");

Response和Request生命周期:

①在Http服务器接收到浏览器发送到“请求协议包”时,自动生成一个【请求对象】和一个【响应对象】;
②在Http调用do…()方法时。负责将【请求对象】和【响应对象】作为实参传入方法中;
③在do…()方法后,Tomcat服务器负责将其二者销毁。

(6)互联网通信详解(B/S架构):

B/S架构简图
Servlet(知识点+实例项目)
互联网通信图
Servlet(知识点+实例项目)

(7)项目实战----考试信息管理系统

<1>.项目架构:

任务:
在线考试管理吸系统----用户信息管理模块
分支任务:
> 用户信息注册
>用户信息查询
> 用户信息删除
> 用户信息更新
文件架构:
Servlet(知识点+实例项目)

准备工作:
1.创建用户信息表 t_users.frm

 drop table if exists t_users;
    create table t_users(
        userId int primary key auto_increment,       #用户编号(自增操作)
        userName varchar(255),        #用户名称
        password varchar(255),        #用户密码
        sex      varchar(10),             #用户性别
        email    varchar(255)         #用户邮箱
    )

2.插入用户信息

insert into t_users(userName,password,sex,email)
    values('shawn','666','man','shawn@126.com');
    ...

3.新建一个实体类Users(entity包下)。

public class Users {
    //用户实体类的属性
    private Integer userId;
    private String userName;
    private String password;
    private String sex;
    private String email;

    //构造方法(无参)
    public Users(){}

    //构造方法(有参)
    public Users(Integer userId,String userName,String password,String sex,String email){
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.sex = sex;
        this.email = email;
    }

    //set方法和get方法
    public void setUserId(Integer userId){
        this.userId = userId;
    }

    public Integer getUserId(){
        return userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

4.web下WEB-INF目录下,创建lib文件夹,存放mysql提供的JDBC实现jar包。

<2>项目流程:

a.前端网页代码(user_Add.html):
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UserTestInformationManage_System</title>
</head>
<body>
    <center>
        <form action="/myWeb/user/add" method="get">
            <table border="2">
                <tr>
                    <td>用户姓名</td>
                    <td><input type="text" name="userName"/></td>
                </tr>
                <tr>
                    <td>用户密码</td>
                    <td><input type="password" name="password"/> </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><input type="submit" value="用户注册"/> </td>
                    <td><input type="reset" name="重置"/> </td>
                </tr>
            </table>
        </form>
    </center>
</body>
</html>

效果:
Servlet(知识点+实例项目)

b.在UserDao类中书写插入数据的JDBC代码(dao包下):
package com.shawnWeb.dao;

import com.shawnWeb.entity.Users;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class UserDao2 {
    public UserDao2(){}

    public int add(Users users){
        Connection conn = null;
        PreparedStatement ps = null;
        int result = 0;

        String url = "jdbc:mysql://localhost:3306/bjpowernode";
        String user = "root";
        String password = "123456";

        //注册驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //获取数据库连接
            conn = DriverManager.getConnection(url,user,password);
            //获取数据库操作对象
            String sql = "insert into t_users(userName,password,sex,email)"+
                    " values(?,?,?,?)";
            ps = conn.prepareStatement(sql);
            //给?传值
            ps.setString(1,users.getUserName());
            ps.setString(2,users.getPassword());
            ps.setString(3,users.getSex());
            ps.setString(4,users.getEmail());

            //执行sql语句
            result = ps.executeUpdate();

            //
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (ps != null){
                try {
                    ps.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            return result;
        }
    }
}
c.书写doGet(…)方法(模拟互联网通信流程):
package com.shawnWeb.controller;

import com.shawnWeb.dao.UserDao2;
import com.shawnWeb.entity.Users;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class UserAddServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userName,password,sex,email;
        //创建User对象,用于存储从浏览器传送过来的用户信息
        Users user = null;
        //创建Dao对象,用于下述调用注册方法
        UserDao2 dao2 = new UserDao2();
        //插入数据的返回值
        int result = 0;
        //创建输出流,便于将结果打印到浏览器中
        PrintWriter out = null;

        //1.调用请求对象读取请求头参数信息,得到用户的信息
        userName = request.getParameter("userName");
        password = request.getParameter("password");
        sex = request.getParameter("sex");
        email = request.getParameter("email");

        //2.使用JDBC将用户信息填充到MySQL数据库
        //将用户信息存储到user中
        user = new Users(null,userName,password,sex,email);
        result = dao2.add(user);
        //3.调用响应对象将处理结果以二进制形式传入响应体中
        //更该浏览器的编码方式,以便能编译其html和中文
        response.setContentType("text/html;charset=utf-8");
        //拿到响应器的输出流
        out = response.getWriter();
        if (result == 1){
            out.print("<font style='color:red;font-size:40'>用户信息注册成功</font>");
        }else{
            out.print("<font style='color:red;fond-size:40'>用户信息注册失败</font>");
        }

    }
    //doGet结束后,Tomcat负责销毁请求对象和响应对象
    //tomcat负责将HTTP协议包推送到发起请求的浏览器上
    //浏览器根据响应头content-type指定编译器对响应体二进制内容编辑
    //浏览器将编辑后的结果在窗口中展示给用户  【互联网通信结束】
}
结果展示:

Ⅰ.在输入框输入注册数据:
Servlet(知识点+实例项目)
Ⅱ.点击用户注册按钮,弹出注册成功:
Servlet(知识点+实例项目)
Ⅲ.打开数据库中的t_users表,验证数据插入:
Servlet(知识点+实例项目)
Ⅳ.插入数据成功,插入功能实现完毕!

上一篇:网易某歌曲参数JS逆向分析,多图预警


下一篇:C语言-结构体