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初始化的过程
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>
源代码下载:
Q.E.D.