1、Servlet

a)概念
	a)SUN提供专门用来开发动态Web资源的一个中技术
b)Servlet定义
	a)写一个类继承HttpServlet
	b)复写父类中的doPost,doGet方法
c)Servlet配置(web.xml)
	1)<servlet>
		a)<servlet-name>
		b)<servlet-class>
	2)<servlet-mapping>
		a)<servlet-name>
		b)<url-pattren>

2、请求和响应的对象

a)Request:请求对象(封装了浏览器给服务器的数据)
	a)请求报文
		1)请求行:HTTP协议版本,请求的地址,请求方式
		2)请求头:key-value形式
		3)空
b)Responce:响应对象(封装了服务器给浏览器响应的数据)
	a)响应报文
		1)响应行:HTTP协议版本
		2)响应头:key-value形式
		3)空

3、Servlet生命周期

  • Servlet实例化的时候调用构造器
  • Servlet初始化-->init
  • 处理业务逻辑调用-service方法
  • 当web容器关闭或者servlet长时间没有使用后调用destory方法

4、Servlet初始化的过程

1608260708853

1)Tomcat启动加载webapps下面的项目
2)解析WEB-INF/web.xml
3)判断servlet优先级,如果优先级高就在这里实例化(调用构造器)
4)tomcat启动成功。。。。。。
5)用户通过地址栏访问:http://localhost:8080/Web-Demo/HelloServlet
6)localhsot代表的是本机的
7)8080:服务器处理业务逻辑监听的端口号
8)Web-Demo就是访问tocmat中发布的Web-Demo的项目
9)HelloServlet是否和当前项目中的<servet-mapping>中的<url-pattern>匹配
	a)如不不匹配就返回404
	b)如果匹配到了就找当前<servlet-mamping>对应的<servlet-name>
	c)再去找<servlet>标签下面的<servlet-name>
	d)实例化<serlvet>标签下面<servlet-class>
	e)初始化servlet,调用init方法
	f)调用service方法进行业务的处理
	g)服务器响应数据给浏览器
10)Web容器重启或者servlet长时间不适用就会销毁

5、Servlet的结构

a)Servlet(接口)
	1)GenericServlet(抽象类)
		1)HttpServlet(抽取类)
			a)doGet()
			b)DopPost();

6、HTTP状态码

a)4xx客户端错误
b)5xx服务器错误

Servlet第一个Demo

构建一个javaweb空项目导入相关依赖(jar包)

注:

在servlet中jar包必须放在web/WEB-INF/lib否则依赖无法被正常使用

1、编写Servlet层


package cn.hm1006.studentmanager.servlet;

import cn.hm1006.studentmanager.entity.User;
import cn.hm1006.studentmanager.service.UserService;
import cn.hm1006.studentmanager.service.impl.UserServiceImpl;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @author : Two
 * @version : v1.0
 * @description TODO
 * @date : 2020/12/18 17:08
 */
public class ManagerServlet extends HttpServlet {

    static UserService userServiceImpl = new UserServiceImpl();

    /**
     * doPost(HttpServletRequest req, HttpServletResponse resp)
     *     接收页面发送的post请求
     * @param req 请求
     * @param resp 响应
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        //  req.getParameter("name");
        //  	req:页面传入的请求
        //  	req.getParameter():接收从页面发送的参数
        //  	"name":前端页面标签的属性值
        //      意思是: 接收来自页面发送的标签属性为name的值
        //	<input type="txt" name="name">

        System.out.println("从页面接收的数据");
        String name = req.getParameter("name");
        System.out.println(name);
        String password = req.getParameter("password");
        System.out.println(password);
        Integer age = Integer.valueOf(req.getParameter("age"));
        System.out.println(age);
        Integer sex = Integer.valueOf(req.getParameter("sex"));
        System.out.println(sex);
        //将String转为java util的日期
        String reqBirthday = req.getParameter("birthday");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
        java.util.Date birthday = null;
        try {
            birthday = sdf.parse(reqBirthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(birthday);
	//将页面传入的参数进行封装
        User user = new User(name,password,age,sex,birthday);
        int i = userServiceImpl.insertUserServiceImpl(user);
        if (i>0){
            System.out.println("插入成功");
        }else{
            System.out.println("插入失败");
        }
    }
}

2、编写业务层及实现类

package cn.hm1006.studentmanager.service;

import cn.hm1006.studentmanager.entity.User;

/**
 * @author : Two
 * @version : v1.0
 * @description TODO
 * @date : 2020/12/14 22:36
 * 处理用户输入的数据
 */
public interface UserService {

    /**
     *添加用户
     */
    int insertUserServiceImpl(User user);

}
-----------------------------------------------------------------
package cn.hm1006.studentmanager.service.impl;

import cn.hm1006.studentmanager.dao.UserDao;
import cn.hm1006.studentmanager.dao.impl.UserDaoImpl;
import cn.hm1006.studentmanager.entity.User;
import cn.hm1006.studentmanager.service.UserService;

/**
 * @author : Two
 * @version : v1.0
 * @description TODO
 * @date : 2020/12/14 22:38
 * User接口的实现类
 */
public class UserServiceImpl implements UserService {

    //接口多态调用实现类
    UserDao userdaoImpl = new UserDaoImpl();

    /**
     *添加用户
     * 实现
     */
    @Override
    public int insertUserServiceImpl(User user) {
        return userdaoImpl.insertUser(user);
    }
}

3、编写持久层接口即实现类

package cn.hm1006.studentmanager.dao;

import cn.hm1006.studentmanager.entity.User;

/**
 * @author : Two
 * @version : v1.0
 * @description TODO
 * @date : 2020/12/14 21:11
 */
public interface UserDao {
    /**
     * 插入用户数据 User
     * @param user
     * @return
     * 返回值为int,即该操作影响的行数
     */
    int insertUser(User user);
}
-----------------------------------------------------------------

package cn.hm1006.studentmanager.dao.impl;

import cn.hm1006.studentmanager.dao.UserDao;
import cn.hm1006.studentmanager.entity.User;
import cn.hm1006.studentmanager.utils.DBUtils;

import java.sql.*;

/**
 * @author : Two
 * @version : v1.0
 * @description TODO
 * @date : 2020/12/14 21:13
 */
public class UserDaoImpl implements UserDao {

    @Override
    public int insertUser(User user) {
        Connection connect = null;
        PreparedStatement pres = null;
        int i = 0;
        try {
            connect = DBUtils.getConnect();
            pres = connect.prepareStatement("insert into user(name,password,age,sex,birthday) values(?,?,?,?,?)");
            pres.setString(1, user.getName());
            pres.setString(2, user.getPassword());
            pres.setInt(3, user.getAge());
            pres.setInt(4, user.getSex());
            //将java util的日期转换为Long类型
            long time = user.getBirthday().getTime();
            //再将Long类型转换为java.sql的日期
            Date date = new Date(time);
            pres.setDate(5, date);
            i = pres.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DBUtils.clooseAll(pres, connect);
        }
 	/**
         * 此处返回本次添加操作,对数据库的影响行数
         */
        return i;
    }
}

4、编写页面代码

<html>
<head>
    <title>学生管理系统</title>
</head>
<body>
<form method="post" action="ManagerServlet">
    用户名<input type="text" name="name">
    <br>
    密码<input type="text" name="password">
    <br>
    年龄<input type="text" name="age">
    <br>
    男<input type="radio" name="sex" value="1" checked>
    女<input type="radio" name="sex" value="0">
    <br>
    生日<input type="date" name="birthday">
    <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

5、配置web/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    <servlet>
        <!--设置servlet名,一般与类名保持一致-->
        <servlet-name>ManagerServlet</servlet-name>
        <!--配置servlet类的全限定名-->
        <servlet-class>cn.hm1006.studentmanager.servlet.ManagerServlet</servlet-class>
        <!--启动优先级,数值越小,优先级越高-->
    </servlet>
    <servlet-mapping>
        <!--servlet名,与上所配置名称保持一致-->
        <servlet-name>ManagerServlet</servlet-name>
        <!--请求路径-->
        <url-pattern>/ManagerServlet</url-pattern>
    </servlet-mapping>
</web-app>

源代码下载:

down

Q.E.D.


如人饮水、冷暖自知