一、Servlet
1.1什么是servlet
java server applet,称为java程序服务器,使用java编写运行在web服务器的操作,可以通过url来进行访问的
主要作用:1.用来接收客户端的请求,生成一个动态的web页面2.调用业务层的饿代码3.负责转发和重定向
1.2servlet入门案例
1.新建一个web项目
2.新建一个类,然后让这个类去继承HttpServlet
注意:需要导包,在tomcat里有,所以导tomcat就行
3.重写doGet和doPost
package com.qfedu.a_servlet;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/*** @author wodexinhuai* @create 2022-05-06-9:33*/@WebServlet("/demo1")public class Demo1servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("this is boer");resp.setContentType("text/html;charset=utf-8");resp.getWriter().append("呼叫博儿");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}}
通过Tomcat服务器会自动创建servlet的对象,然后去调用servlet下面的方法
二、servlet的三种创建方式【面试问】
①实现Servlet接口
去实现servlet接口,接口下面有抽象方法,把抽象方法全部实现(五个)
init方法:第一次请求url执行,就执行一次
getServletConfig方法:没有执行
service方法:每请求一个url就执行
getServletInfo方法:没有执行
dostroy方法:当tomcat服务器关闭时执行
package com.qfedu.b_servlet;import javax.servlet.*;import javax.servlet.annotation.WebServlet;import java.io.IOException;/*** @author wodexinhuai* @create 2022-05-06-9:55*/@WebServlet("/test1")public class Test1Servlet implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//使用servletConfig对象初始化(init)Servlet对象的System.out.println("初始化init方法!!!!!!!!!!!!");}@Overridepublic ServletConfig getServletConfig() {//获取配置对象的一个方法System.out.println("获取配置信息的方法!!!!!!!!!!!");return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {//service核心方法System.out.println("service方法!!!!!!!!!!");}@Overridepublic String getServletInfo() {System.out.println("获取servlet详细信息的方法!!!!!!!!!!");return null;}@Overridepublic void destroy() {//tomcat在关闭时,执行的方法System.out.println("销毁servlet!!!!!!!!!!!!!!");}}
②继承GenericServlet
继承一个抽象类GenericServlet
GenericServlet是Servlet的子类在java中子类永远比父类强
为什么GenericServlet比Servlet好用
在GenericServlet里面没有必要去重写servlet下面的非不要的方法只需要重写一个核心方法service即可,代码量减少,避免冗余
package com.qfedu.b_servlet;import javax.servlet.GenericServlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebServlet;import java.io.IOException;import java.io.PrintWriter;/*** @author wodexinhuai* @create 2022-05-06-10:47*/@WebServlet("/test2")public class Test2Servlet extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service method");servletResponse.setContentType("text/html;charset=utf-8");PrintWriter writer = servletResponse.getWriter();writer.append("博儿,中午吃啥");}}
③继承HttpServlet
入门的那种写法
extends HttpServlet
HttpServlet类是GenericServlet的子类,在GenericServlet抽象类的基础上进行扩展
doGet 用于http的get请求doPost 用于http的post请求doHeaddoPutdoDelete为什么那么多doXXX方法,只需要重写doGet和doPost因为前端只有两种请求方式,get和post
总结
三种创建方式,我们只用第三种,代码没有冗余,更方便理解
用配置文件xml的写法
<servlet><servlet-name>zzw</servlet-name><servlet-class>com.qfedu.c_servlet.AnnoServlet</servlet-class></servlet><servlet-mapping><servlet-name>zzw</servlet-name><url-pattern>/anno</url-pattern></servlet-mapping>
用注解的写法【开发用】
@WebServlet(”/路径“)
//value:请求路径,可以默认不写//name:servlet的名字@WebServlet(name = "sb",value = "/test2")//urlPatterns:是一个String类型的数组,可以放对各路径//loadOnStartup = 1 在执行时就直接加载servlet,进行实例化@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
当用户第一次访问servlet的时候,Tomcat服务器会调用servlet的构造方法进行实例化。只实例化一次
2.初始化servlet
会调用init方法
3.调用核心方法service方法
4.调用destroy方法
package com.qfedu.d_servlet; /*** @author wodexinhuai* @create 2022-05-06-15:14*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;//生命周期@WebServlet(name = "LifeServlet", value = "/LifeServlet")public class LifeServlet extends HttpServlet {//第一步 被实例化public LifeServlet(){System.out.println("我是LifeServlet的无参构造,被实例化");}//第二步 初始化servlet@Overridepublic void init() throws ServletException {System.out.println("servlet初始化");}//第三步 调用service方法@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("调用service方法");}//第四步 销毁destroy@Overridepublic void destroy() {System.out.println("销毁destroy");}}
四、获取前端请求的参数【参数】e
请求(url) —-> 响应(浏览器上面)
前端到servlet是请求,servlet到浏览器是响应
写一个前端页面,把前端页面内的数据给servlet,setvlet接收一下
在login.html页面中带着请求数据到LoginServlet资源里面
在LoginServlet这个资源里面可以获取前端发送过来的数据
Tomcat服务器会讲请求的url变成request对象
前端数据都在url中,都封装在了request
login.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>获取前端请求的参数</title></head><body><!--action这个数学是将input输入框的数据提交给某一个servletaction的属性值,在前端中不用带斜线--><!--method 提交方式,get、post。不写的话默认是get--><!-- <form action="Login1" method="get">--><!-- 账号:<input type="text" name="username"><br>--><!-- 密码:<input type="password" name="pwd"><br>--><!-- <input type="submit" value="登录">--><!-- </form>--><!--post 请求会乱码--><form action="Login1" method="post">账号:<input type="text" name="username"><br>密码:<input type="password" name="pwd"><br><input type="submit" value="登录"></form></body></html>
LoginServlet.java
package com.qfedu.e_servlet; /*** @author wodexinhuai* @create 2022-05-06-15:34*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet("/Login1")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//在login.html页面中带着请求数据到LoginServlet资源里面//在LoginServlet这个资源里面可以获取前端发送过来的数据//Tomcat服务器会讲请求的url变成request对象//前端数据都在url中,都封装在了requestrequest.setCharacterEncoding("utf-8");//解决请求乱码问题String username = request.getParameter("username");String pwd = request.getParameter("pwd");System.out.println(username + ":" + pwd);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
五、综合案例
类似于注册案例
前端注册页面发送数据给servlet,通过servlet发送的数据,保存到数据库
借助之前封装的JdbcUtil和BaseDao
1.先写一个前端的html页面
2.书写一个register.html 和 RegisterServlet.java
3.用之前封装的JdbcUtil和BaseDao
druid.properties、创建一个utils包,粘贴JdbcUtil和BaseDao封装的类导四个包。mysql、druid、beanutils、logging
4.在真是开发中,不允许出现sql语句 新建一个UserDao单例模式
register.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>注册</title></head><body><form action="registerServlet" method="post">账号:<input type="text" name="username"><br>密码:<input type="password" name="pwd"><br><input type="submit" value="注册"></form></body></html>
UserDao.java
package com.qfedu.e_servlet;import com.qfedu.utils.BaseDao;import java.sql.SQLException;/*** @author wodexinhuai* @create 2022-05-06-16:49*/public class UserDao extends BaseDao {private static UserDao userDao;private UserDao(){}public static UserDao getInstance(){synchronized (UserDao.class){if(userDao == null){userDao = new UserDao();}}return userDao;}public int addUser(Object[] objs) throws SQLException {String sql = "insert into zhuce(username,pwd) value(?,?)";return super.update(sql,objs);}}
RegisterServlet.java
package com.qfedu.e_servlet; /*** @author wodexinhuai* @create 2022-05-06-16:07*/import com.qfedu.entity.Zhuce;import com.qfedu.utils.BaseDao;import com.qfedu.utils.JdbcUtil;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.List;@WebServlet("/registerServlet")public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String pwd = request.getParameter("pwd");//以上是获取了前端发送来的数据//想办法存到数据库// BaseDao baseDao = new BaseDao();// String sql = "insert into zhuce(username,pwd) value(?,?)";// Object[] parameter = {username,pwd};// try {// int update = baseDao.update(sql, parameter);//// } catch (SQLException e) {// e.printStackTrace();// }response.setContentType("text/html;charset=utf-8");Object[] parameter = {username,pwd};UserDao instance = UserDao.getInstance();try {instance.addUser(parameter);response.getWriter().append("注册成功");} catch (SQLException e) {response.getWriter().append("注册失败");e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
