一、什么是servlet类
简介:servlet类是java用于实现前后台交互的类,java的servlet类实现一个桥梁的作用连接着前后台,servlet获取前台数据传给数据库,servlet获取数据库数据再反馈给前台用户,形成一个环流。
二、使用servlet的准备工作
由于java自带的常用类,无法满足我们目前的功能,所以我们需要引入新的类,java已经封装好了很过具有强大功能的外部类,只需要进行引入即可使用,而引入的外部类我们称为jar包,因为都是文件名xxx.jar,在后台获取前台的数据这个功能,只需要引入servlet-api.jar包即可实现相关功能,而servlet-api.jar的功能不止于此,这个包一般位于Tomcat服务器包下的lib包里面,也可以通过maven库进行下载相关的jar包,需要在web包下的WEB-INF包下新建一个lib包,把servlet-api.jar存放在lib包下,然后选中jar包,鼠标右键选中As a library即可,如果jar包变成可以打开的文件夹即可,最后在后台src文件夹下建一个servlet包,用来存放servlet类
三、servlet的创建与生命周期
① 创建一个类需要类名,servlet类一般以XxxServlet命名
② 继承servlet包下面的 HttpServlet,重写该父类的init()、service()、destroy()方法,只需要在idea输入service()选择第一个方法即可,最后在类的上面加上一个 @Web("/XxxServlet") 推荐和类名一致,见名知意
③ servlet生命周期
1.初始化调用init方法 只会执行一次 自动执行
2.执行 调用service方法,调用几次执行几次 需要手动调用
3.消亡调用destory方法 只会执行一次 自动执行 没啥用,一般是项目停止自动执行。package 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; @WebServlet("/AServlet") public class AServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("我被创建了,只会执行一次"); public static say(){ System.out.println("执行一次,我就失效了"); } } @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进来了"); //servlet的生命周期: // 1.初始化调用init方法 只会执行一次 自动执行 // 2.执行 调用service方法,调用几次执行几次 需要手动调用 // 3.消亡调用destory方法 只会执行一次 自动执行 没啥用,一般是项目停止自动执行。 say(); } @Override public void destroy() { System.out.println("我死了"); } }
四、servlet的四大作用域
Servlet的四大作用域 有些情况下:我们需要实现后台servlet的数据共享 有些情况下:我们需要实现后台servlet和前台页面的数据共享 比如:后台查询到了数据 需要给前台去渲染 四大作用域:pageContext < request < session < application pageContext作用域:仅在当前页面有效,只要页面发生了跳转就失效。 所以不用 request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效,所以切忌使用重定向跳珠 session作用域:重点掌握:作用域一次回话有效。(浏览器打开到关闭为一次回话) application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量request作用域
package 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; @WebServlet("/XxxServlet") public class XxxServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // request作用域:重点掌握:作用域一次请求有效。超过一次请求就失效 //如何存储数据 注意key要保证唯一,否则会被覆盖 // req.setAttribute("key","aa"); req.setAttribute("username","张三"); req.getRequestDispatcher("XxxServlet").forward(req,resp); // resp.sendRedirect("XxxServlet"); } }
session作用域
package 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 javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/XxxServlet") public class XxxServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // session作用域:重点掌握:作用域一次会话有效。浏览器关闭就失效 //如何存储数据 注意key要保证唯一,否则会被覆盖 //1.获取session对象 HttpSession session = req.getSession(); //2.存值 session.setAttribute("username","李四"); //简写req.getSession().setAttribute("aa,","xx"); req.getRequestDispatcher("XxxServlet").forward(req,resp); // resp.sendRedirect("XxxServlet"); } }
application作用域
package servlet; import javax.servlet.ServletContext; 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 javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/XxxServlet") public class XxxServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // application作用域:了解即可:作用域全局有效。只想项目不关,就一直生效,例如网站访问量 //如何存储数据 注意key要保证唯一,否则会被覆盖 //1.获取application对象 ServletContext context = req.getServletContext(); //2.存值 context.setAttribute("username","王五"); req.getRequestDispatcher("XxxServlet").forward(req,resp); // resp.sendRedirect("XxxServlet"); } }
测试各个作用域存储的值
package 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; @WebServlet("/XxxServlet") public class XxxServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //测试四大作用域的数据 //request作用域 // String username =(String) req.getAttribute("username"); // System.out.println(username); //session作用域 // Object o = req.getSession().getAttribute("username"); // System.out.println(o); //application作用域 Object o = req.getServletContext().getAttribute("username"); System.out.println(o); } }
五、servlet的跳转
servlet的跳转: 1.可以从servlet跳转到另外一个servlet(删除数据之后返回到刷新查询servlet) 2.可以从servlet跳转到前台页面(注册成功返回登录页面) 有两种方式: 转发跳转: 只需1次请求即可完成 效率高 URL地址不会改变 例如从B转发到A URL地址依然是B//转发跳转: req.getRequestDispatcher("XxxServlet").forward(req,resp); req.getRequestDispatcher("xxx.html").forward(req,resp);
重定向跳转: 只需2次请求即可完成 效率低 URL地址会改变 例如从B定向到A URL地址就是A//重定向跳转: resp.sendRedirect("XxxServlet"); resp.sendRedirect("xxx.html");
总结:能用转发就用转发。但是以下情况不推荐:涉及到敏感操作一定不能使用转发, 涉及到注册操作.涉及到增删改都推荐使用重定向 备注:超链接本质就是重定向跳转
六、servlet获取前台数据
① 获取前台的数据,需要在service方法中操作,前台传输的数据中存在有中文的情况,所有这里得解决一下乱码问题,只需要使用service()方法中的参数req调setCharacterEncoding()方法,将字符集修改成“utf-8”
req.setCharacterEncoding("utf-8");
② 开始获取前台数据,获取单个数据通过req参数调用getParameter("前台携带数据的名字")方法即可,返回的是一个字符串;获取多个数据通过 req参数调用getParameterValues("前台携带数据的名字")方法即可,返回的是一个字符串数组;如果需要把参数变成数值,只需要调用包装类进行强转即可
package 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; @WebServlet("/XxxServlet") public class XxxServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); System.out.println(username); String password = req.getParameter("password"); System.out.println(password); String sex = req.getParameter("sex"); System.out.println(sex); String address = req.getParameter("address"); System.out.println(address); //类似于多选框的 就不能用上面的方式 因为上面的只能获取单个 String[] likes = req.getParameterValues("likes"); for(int i = 0 ;i<likes.length;i++){ System.out.println(likes[i]); } String jieshao = req.getParameter("jieshao"); System.out.println(jieshao); String birthday = req.getParameter("birthday"); System.out.println(birthday); int id = Integer.parseInt(req.getParameter("id")); } }
⑤ 经过上述操作,前台的数据就已经在后台的临时存储空间里面,输出一下就可以在控制台看到前台输入的数据
七、servlet发送数据给前台
servlet将值存储在作用域中,前台用过JSP技术即可获取,作用域中的数据