一、Servlet

1.1什么是servlet

java server applet,称为java程序服务器,使用java编写运行在web服务器的操作,可以通过url来进行访问的

  1. 主要作用:
  2. 1.用来接收客户端的请求,生成一个动态的web页面
  3. 2.调用业务层的饿代码
  4. 3.负责转发和重定向

1.2servlet入门案例

1.新建一个web项目

2.新建一个类,然后让这个类去继承HttpServlet

  1. 注意:需要导包,在tomcat里有,所以导tomcat就行

3.重写doGet和doPost

  1. package com.qfedu.a_servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. /**
  9. * @author wodexinhuai
  10. * @create 2022-05-06-9:33
  11. */
  12. @WebServlet("/demo1")
  13. public class Demo1servlet extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  16. System.out.println("this is boer");
  17. resp.setContentType("text/html;charset=utf-8");
  18. resp.getWriter().append("呼叫博儿");
  19. }
  20. @Override
  21. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  22. doGet(req,resp);
  23. }
  24. }

通过Tomcat服务器会自动创建servlet的对象,然后去调用servlet下面的方法

二、servlet的三种创建方式【面试问】

①实现Servlet接口

去实现servlet接口,接口下面有抽象方法,把抽象方法全部实现(五个)

init方法:第一次请求url执行,就执行一次

getServletConfig方法:没有执行

service方法:每请求一个url就执行

getServletInfo方法:没有执行

dostroy方法:当tomcat服务器关闭时执行

  1. package com.qfedu.b_servlet;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebServlet;
  4. import java.io.IOException;
  5. /**
  6. * @author wodexinhuai
  7. * @create 2022-05-06-9:55
  8. */
  9. @WebServlet("/test1")
  10. public class Test1Servlet implements Servlet {
  11. @Override
  12. public void init(ServletConfig servletConfig) throws ServletException {
  13. //使用servletConfig对象初始化(init)Servlet对象的
  14. System.out.println("初始化init方法!!!!!!!!!!!!");
  15. }
  16. @Override
  17. public ServletConfig getServletConfig() {
  18. //获取配置对象的一个方法
  19. System.out.println("获取配置信息的方法!!!!!!!!!!!");
  20. return null;
  21. }
  22. @Override
  23. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  24. //service核心方法
  25. System.out.println("service方法!!!!!!!!!!");
  26. }
  27. @Override
  28. public String getServletInfo() {
  29. System.out.println("获取servlet详细信息的方法!!!!!!!!!!");
  30. return null;
  31. }
  32. @Override
  33. public void destroy() {
  34. //tomcat在关闭时,执行的方法
  35. System.out.println("销毁servlet!!!!!!!!!!!!!!");
  36. }
  37. }

②继承GenericServlet

继承一个抽象类GenericServlet

  1. GenericServletServlet的子类
  2. java中子类永远比父类强

为什么GenericServlet比Servlet好用

  1. GenericServlet里面没有必要去重写servlet下面的非不要的方法
  2. 只需要重写一个核心方法service即可,代码量减少,避免冗余
  1. package com.qfedu.b_servlet;
  2. import javax.servlet.GenericServlet;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.ServletResponse;
  6. import javax.servlet.annotation.WebServlet;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. /**
  10. * @author wodexinhuai
  11. * @create 2022-05-06-10:47
  12. */
  13. @WebServlet("/test2")
  14. public class Test2Servlet extends GenericServlet {
  15. @Override
  16. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  17. System.out.println("service method");
  18. servletResponse.setContentType("text/html;charset=utf-8");
  19. PrintWriter writer = servletResponse.getWriter();
  20. writer.append("博儿,中午吃啥");
  21. }
  22. }

③继承HttpServlet

入门的那种写法

extends HttpServlet

HttpServlet类是GenericServlet的子类,在GenericServlet抽象类的基础上进行扩展

  1. doGet 用于httpget请求
  2. doPost 用于httppost请求
  3. doHead
  4. doPut
  5. doDelete
  6. 为什么那么多doXXX方法,只需要重写doGetdoPost
  7. 因为前端只有两种请求方式,getpost

总结

三种创建方式,我们只用第三种,代码没有冗余,更方便理解

用配置文件xml的写法

  1. <servlet>
  2. <servlet-name>zzw</servlet-name>
  3. <servlet-class>com.qfedu.c_servlet.AnnoServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>zzw</servlet-name>
  7. <url-pattern>/anno</url-pattern>
  8. </servlet-mapping>

用注解的写法【开发用】

@WebServlet(”/路径“)

  1. //value:请求路径,可以默认不写
  2. //name:servlet的名字
  3. @WebServlet(name = "sb",value = "/test2")
  4. //urlPatterns:是一个String类型的数组,可以放对各路径
  5. //loadOnStartup = 1 在执行时就直接加载servlet,进行实例化
  6. @WebServlet(urlPatterns = {"/a1","/b2","/c3"},loadOnStartup = 1)

拓展

验证Servlet被实例化,在实例化的时候会执行构造方法

在servlet类张写一个无参构造,在执行的时候,会输出打印无参构造

如果请求那个servlet,就会实例化那个servlet,new AnnoServlet();

在Tomcat服务器种那个Servlet请求url时才被实例化。且只被实例化一次

在注解中加 loadOnStartup = 1

即使不请求servlet资源,Tomcat服务器也会自动加载servlet资源,进行实例化

三、servlet生命周期d

1.实例化servlet

  1. 当用户第一次访问servlet的时候,Tomcat服务器会调用servlet的构造方法进行实例化。
  2. 只实例化一次

2.初始化servlet

  1. 会调用init方法

3.调用核心方法service方法

4.调用destroy方法

  1. package com.qfedu.d_servlet; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-06-15:14
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. //生命周期
  10. @WebServlet(name = "LifeServlet", value = "/LifeServlet")
  11. public class LifeServlet extends HttpServlet {
  12. //第一步 被实例化
  13. public LifeServlet(){
  14. System.out.println("我是LifeServlet的无参构造,被实例化");
  15. }
  16. //第二步 初始化servlet
  17. @Override
  18. public void init() throws ServletException {
  19. System.out.println("servlet初始化");
  20. }
  21. //第三步 调用service方法
  22. @Override
  23. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  24. System.out.println("调用service方法");
  25. }
  26. //第四步 销毁destroy
  27. @Override
  28. public void destroy() {
  29. System.out.println("销毁destroy");
  30. }
  31. }

四、获取前端请求的参数【参数】e

请求(url) —-> 响应(浏览器上面)

前端到servlet是请求,servlet到浏览器是响应

写一个前端页面,把前端页面内的数据给servlet,setvlet接收一下

在login.html页面中带着请求数据到LoginServlet资源里面

在LoginServlet这个资源里面可以获取前端发送过来的数据

Tomcat服务器会讲请求的url变成request对象

前端数据都在url中,都封装在了request

login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>获取前端请求的参数</title>
  6. </head>
  7. <body>
  8. <!--action这个数学是将input输入框的数据提交给某一个servlet
  9. action的属性值,在前端中不用带斜线-->
  10. <!--method 提交方式,get、post。不写的话默认是get-->
  11. <!-- <form action="Login1" method="get">-->
  12. <!-- 账号:<input type="text" name="username"><br>-->
  13. <!-- 密码:<input type="password" name="pwd"><br>-->
  14. <!-- <input type="submit" value="登录">-->
  15. <!-- </form>-->
  16. <!--post 请求会乱码-->
  17. <form action="Login1" method="post">
  18. 账号:<input type="text" name="username"><br>
  19. 密码:<input type="password" name="pwd"><br>
  20. <input type="submit" value="登录">
  21. </form>
  22. </body>
  23. </html>

LoginServlet.java

  1. package com.qfedu.e_servlet; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-06-15:34
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet("/Login1")
  10. public class LoginServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //在login.html页面中带着请求数据到LoginServlet资源里面
  14. //在LoginServlet这个资源里面可以获取前端发送过来的数据
  15. //Tomcat服务器会讲请求的url变成request对象
  16. //前端数据都在url中,都封装在了request
  17. request.setCharacterEncoding("utf-8");//解决请求乱码问题
  18. String username = request.getParameter("username");
  19. String pwd = request.getParameter("pwd");
  20. System.out.println(username + ":" + pwd);
  21. }
  22. @Override
  23. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. doGet(request, response);
  25. }
  26. }

五、综合案例

类似于注册案例

前端注册页面发送数据给servlet,通过servlet发送的数据,保存到数据库

借助之前封装的JdbcUtil和BaseDao

1.先写一个前端的html页面

2.书写一个register.html 和 RegisterServlet.java

3.用之前封装的JdbcUtil和BaseDao

  1. druid.properties、创建一个utils包,粘贴JdbcUtilBaseDao封装的类
  2. 导四个包。mysqldruidbeanutilslogging

4.在真是开发中,不允许出现sql语句 新建一个UserDao单例模式

register.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册</title>
  6. </head>
  7. <body>
  8. <form action="registerServlet" method="post">
  9. 账号:<input type="text" name="username"><br>
  10. 密码:<input type="password" name="pwd"><br>
  11. <input type="submit" value="注册">
  12. </form>
  13. </body>
  14. </html>

UserDao.java

  1. package com.qfedu.e_servlet;
  2. import com.qfedu.utils.BaseDao;
  3. import java.sql.SQLException;
  4. /**
  5. * @author wodexinhuai
  6. * @create 2022-05-06-16:49
  7. */
  8. public class UserDao extends BaseDao {
  9. private static UserDao userDao;
  10. private UserDao(){}
  11. public static UserDao getInstance(){
  12. synchronized (UserDao.class){
  13. if(userDao == null){
  14. userDao = new UserDao();
  15. }
  16. }
  17. return userDao;
  18. }
  19. public int addUser(Object[] objs) throws SQLException {
  20. String sql = "insert into zhuce(username,pwd) value(?,?)";
  21. return super.update(sql,objs);
  22. }
  23. }

RegisterServlet.java

  1. package com.qfedu.e_servlet; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-06-16:07
  4. */
  5. import com.qfedu.entity.Zhuce;
  6. import com.qfedu.utils.BaseDao;
  7. import com.qfedu.utils.JdbcUtil;
  8. import javax.servlet.*;
  9. import javax.servlet.http.*;
  10. import javax.servlet.annotation.*;
  11. import java.io.IOException;
  12. import java.sql.Connection;
  13. import java.sql.PreparedStatement;
  14. import java.sql.SQLException;
  15. import java.util.List;
  16. @WebServlet("/registerServlet")
  17. public class RegisterServlet extends HttpServlet {
  18. @Override
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. request.setCharacterEncoding("utf-8");
  21. String username = request.getParameter("username");
  22. String pwd = request.getParameter("pwd");
  23. //以上是获取了前端发送来的数据
  24. //想办法存到数据库
  25. // BaseDao baseDao = new BaseDao();
  26. // String sql = "insert into zhuce(username,pwd) value(?,?)";
  27. // Object[] parameter = {username,pwd};
  28. // try {
  29. // int update = baseDao.update(sql, parameter);
  30. //
  31. // } catch (SQLException e) {
  32. // e.printStackTrace();
  33. // }
  34. response.setContentType("text/html;charset=utf-8");
  35. Object[] parameter = {username,pwd};
  36. UserDao instance = UserDao.getInstance();
  37. try {
  38. instance.addUser(parameter);
  39. response.getWriter().append("注册成功");
  40. } catch (SQLException e) {
  41. response.getWriter().append("注册失败");
  42. e.printStackTrace();
  43. }
  44. }
  45. @Override
  46. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  47. doGet(request, response);
  48. }
  49. }