Javaweb之Servlet类

一、什么是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技术即可获取,作用域中的数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值