Servlet的前端与后台交互过程的简述
第一步:前端发送数据到后台对应的接口
第二步:controller接受请求解析数据,并将数据传递给Service
第三步:service处理数据包括但不仅限于判空,组装成对象,改变某些个值等等,然后确定是不是使用数据库,如果使用的话,是增还是删改查?确定完成以后,调用Dao里面的方法,如果过程不是通用的增删改查过程,那么就在对应的DAO类里面写成一个新方法来处理数据内容
第四步:连接数据库,并且操作数据库(CRUD),得到结果通过方法返回值返回给Service
第五步:service接受到返回值,处理数据内容,然后通过方法,返回给Controller
第六步:Controller根据service的返回值确定应该展示什么内容
servlet一般情况下的生命周期
加载----->创建----->执行----->销毁
先执行构造方法,在执行init方法,后执行service方法,最后执行destory。
构造方法
//构造方法不能带参数,才能被web.xml识别
//当浏览器访问到这个项目的的时候,Tomcat才会创建Controller对象
//这样的好处在于可以节省资源
//当请求第一次抵达这里时,创建一个Controller对象
//当请求第二次抵达时,由于之前已经创建过对象,所以不再创建对象了
init 初始化
//只执行一次,它是在服务器装入Servlet时执行的,负责初始化Servlet对象。
service方法
//Servlet的核心,负责响应客户的请求。
//所谓service方法,是针对请求来说的,当一个请求到达Tomcat时
//Tomcat会调用Servlet的Service方法,来确定具体执行哪个do(默认的服务功能是调用与HTTP请求的方法相应的do功能)
//请求每过来一次就会执行一次service方法
destory方法
//当对象销毁的时候才调用destroy方法
//仅执行一次,在服务器端停止且卸载Servlet时执行该方法。
// 当Servlet对象退出生命周期时,负责释放占用的资源。
// 一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
具体示例:简单实现一下登陆的过程。
1、创建实体类User
public class User {
//一个User对象就是数据库中一行记录
private int id;
private String username;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
2、创建Dao层类
- Util类:放置url和username和pwd的,因为将参数写在了web.xml里。
public class Util {
public static String DBURL="" ;
public static String DBUN= "";
public static String DBPWD="";
}
- BaseDao:用来连接数据库
public abstract class BaseDao<T> {
static {
try{
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
try {
//Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_foo?useSSL=true&serverTimezone=UTC","root","235689");
//优化
Connection conn = DriverManager.getConnection(Util.DBURL,Util.DBUN,Util.DBPWD);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public abstract T select(T t);
}
- UserDao:继承BaseDao
public class UserDao extends BaseDao<User> {
@Override
public User select(User user) {
Connection conn = this.getConnection();
String sql = "select id,username from tb_users where username=? and pwd=?";
try {
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,user.getUsername());
ps.setString(2,user.getPwd());
ResultSet rs = ps.executeQuery();
if(rs.next()) {
User u = new User();
u.setId(rs.getInt("id"));
u.setUsername(rs.getString("username"));
return u;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
3、创建Service层
- IUserService:接口
public interface IUserService {
User login(String username, String pwd);
}
- UserService:实现IUserService
public class UserService implements IUserService {
UserDao dao = new UserDao();
@Override
public User login(String username, String pwd) {
if (username == null || username.isEmpty()){
return null;
}
if (pwd == null || pwd.isEmpty()) {
return null;
}
User u = new User();
u.setUsername(username);
u.setPwd(pwd);
User result = dao.select(u);
return result;
}
}
4、创建Controller
- LoginController:继承HttpServlet
public class LoginController extends HttpServlet {
IUserService service = new UserService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username =req.getParameter("username");
String pwd = req.getParameter("pwd");
User user = service.login(username,pwd);
if (user != null) {
resp.sendRedirect("success.html");//登陆成功,以重定向方式转到登陆成功页面——success.html
}else {
resp.getWriter().println("登陆失败");
}
}
}
5、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>test.controller.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>test.controller.Controller</servlet-class>
<init-param>
<param-name>db_url</param-name>
<param-value>jdbc:mysql://localhost:3306/db_foo?useSSL=true&serverTimezone=UTC</param-value>
</init-param>
<init-param>
<param-name>db_un</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>db_pwd</param-name>
<param-value>root</param-value>
</init-param>
<!-- 表示一进来就初始化-->
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
以上就是实现了一个user的简单登陆过程。