栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Servlet

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Servlet

1.Servlet简介 1.1概述
  • Servlet就是sun公司开发动态web的一门技术

  • sun在这些API中提供了一个接口叫做:Servlet,如果你想要开发一个Servlet程序,只需要两步:

    • 编写一个类,实现Servlet接口
    • 把开发好的java类部署到web服务器中
  • 把实现了Servlet接口的java程序叫做Servlet

  • servlet接口在sun公司有两个实现类: HttpServlet,GenericServlet

1.2HelloServlet
  1. 构建一个普通的Maven项目,删掉里面的src目录,以后我们学习就在这个项目里面建立Moudel;这个空的工程就是Maven的主公程。

  2. 建立一个Moudel:servlet-01

    关于maven父子工程的理解

    • 父项目里会有:

      
              servlet-01
      
      
    • 子项目里会有:

      
              javaweb-02-maven
              org.example
              1.0-SNAPSHOT
      
      
  3. maven环境优化

    • 将子项目里的webapp.WEB-INF.web.xml换成最新版本
    • 将maven结构搭建完整
  4. 编写一个Servlet程序(导入依赖的servlet的jar包)

    • 编写一个普通类

    • 实现Servlet接口,这里我们直接继承HttpServlet

      package moli.Servlet;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      public class helloServlet extends HttpServlet {
          //由于get和post只是请求实现的不同方式,可以互相调用,业务实现逻辑都一样
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //ServletOutputStream outputStream = resp.getOutputStream();
              PrintWriter writer = resp.getWriter();   //响应流
              writer.print("hello servlet");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              super.doGet(req, resp);
          }
      }
      
  5. 编写Servlet的映射

    为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。

    
    
      Archetype Created Web Application
    
      
          hello
          moli.Servlet.helloServlet
      
      
         hello
         /hello
      
    
    
  6. 配置tomcat

  7. 启动测试

1.3遇到的问题

idea中通过maven已经导入了包,idea中也能定位到包的位置,本地maven仓库也有对应的jar包存在,但是在本地编译的时候一直报程序包javax.servlet.xxx不存在。

解决方案:

  1. 还是jar包下载失败,或者没有自动下载缺少的jar包

  1. 推测原因是idea的版本与maven构建的build不相容

如果你的项目是多模块的,还需要勾选另一个选项

借鉴:https://blog.csdn.net/qq_43377237/article/details/108010414?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163506613416780269847839%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163506613416780269847839&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-5-108010414.pc_search_result_hbase_insert&utm_term=servlet%E7%BC%96%E8%AF%91%E6%97%B6%E4%B8%8D%E6%8A%A5%E9%94%99%EF%BC%8C%E8%BF%90%E8%A1%8C%E6%97%B6%E6%8A%A5%E9%94%99%E7%A8%8B%E5%BA%8F%E5%8C%85%E4%B8%8D%E5%AD%98%E5%9C%A8&spm=1018.2226.3001.4187

 

1.4Servlet原理

servlet由web服务器调用,在接收到浏览器的请求后会:

 
 

1.5Mapping问题
  • 一个Servlet可以指定一个映射路径

    
         hello
         /hello
     
    
  • 一个Servlet可以指定多个映射路径

    
         hello
         /hello
    
    
         hello
         /hello1
    
    
         hello
         /hello2
    
    
         hello
         /hello3
    
    
  • 一个Servlet可以指定通用映射路径

    
         hello
         /hello
            resp.sendRedirect("/r/image");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
      redirect
      moli.Servlet.redirectServlet
    
    
      redirect
      /red
    
    

     

    3.2.3.2面试题

    重定向和转发的区别:

    相同点:页面都会跳转

    不同点:

    • 请求转发的时候,url不会产生变化 307
    • 重定向的时候,url地址栏会发生变化 302

     

    3.2.3.3练习
    
    
    Hello World!
    <%--这里提交的路径,需要寻找到项目路径--%>
    <%--pageContext.request.contextPath代表当前项目--%>
    
    用户名:
    密码:
    public class requestTest extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            System.out.println(username+":"+password);
            resp.sendRedirect("/r/success.jsp");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    
        Title
    
    
    success
    
    
    

     
     
     

    4.HttpServletRequest

    HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。

    获取前端的参数和请求转发:

    public class loginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            String username = req.getParameter("username");
            String pwd = req.getParameter("pwd");
            String[] hobbys = req.getParameterValues("hobbys");
            System.out.println("=================");
            System.out.println(username);
            System.out.println(pwd);
            System.out.println(Arrays.toString(hobbys));
            System.out.println("=================");
            //通过请求转发
            req.getRequestDispatcher("/success.jsp").forward(req,resp); 
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doGet(req,resp);
        }
    }
    
    
    
        
    姓名:
    密码:
    爱好:篮球 唱歌 跳舞 代码
    
    success
    
    
    
        loginServlet
         moli.Servlet.loginServlet
    
    
        loginServlet
        /login
    
    

     
     
     

    5.cookie,seesion 5.1会话

    会话:用户打开一个浏览器,点击很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。

    有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这样的就称之为有状态会话。

    你---------------学校

    1. 入学申请书:学校给的入学申请书
    2. 学校登记:学校标记你来过了

    客户端----------服务端

    1. 服务端给客户端一个信件,下次客户端访问服务端的时候带上信件就可以了(cookie)
    2. 服务器登记你来过了,下次你来的时候服务器直接匹配你(seesion)

     
    保存会话的两种技术:

    cookie

    • 客户端技术(响应,请求)

    seesion

    • 服务器技术,利用这技术可以保存用户的会话信息,我们可以把信息或者数据放在seesion中

    常见场景:网站登录后,你下次就不用再登陆了,第二次访问就直接上去了。

     
     

    5.2cookie

     

    5.2.1上限,删除,乱码

    cookie:一般会保存在本地的用户目录下appdata。

    一个网站cookie的上限:

    • 一个cookie只能存一个信息
    • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
    • cookie的大小有限制为4kb
    • 300个cookie是浏览器的上限

     
    删除cookie:

    • 不设置有限期,关闭浏览器,cookie自动失效

    • 设置有效期时间为0

      //创建一个cookie,名字必须和要删除的cookie名字一致
      cookie cookie = new cookie("lastLoginTime", System.currentTimeMillis()+"");
      //设置cookie有效期为0
      cookie.setMaxAge(0);
      resp.addcookie(cookie);
      

     
    解决中文乱码:

     

    5.2.2cookie获取上次登录时间
    //保存用户上一次访问的时间
    public class cookieDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //服务器告诉你,你来的时间,把这个时间封装成为一个信件,下次来的时候带上,服务器就知道了。
            //解决中文乱码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            PrintWriter out = resp.getWriter();
            //cookie服务器端从客户端获取
            cookie[] cookies = req.getcookies();//这里返回数组,说明cookie存在多个
            //判断cookie是否存在
            if (cookies!=null){
                out.write("你上一次访问的时间是:");
                for (int i = 0; i < cookies.length; i++) {
                    cookie cookie = cookies[i];
                    //获取cookie的名字
                    if (cookie.getName().equals("lastLoginTime")){
                       //获取cookie中的值。把字符串解析为长整型的数字
                        long lastLoginTime = Long.parseLong(cookie.getValue());
                        Date date = new Date(lastLoginTime);
                        out.write(date.toString());
                    }
                }
            }else {
                out.write("这是你第一次访问本站");
            }
            //服务器给客户端响应一个cookie
            cookie cookie = new cookie("lastLoginTime", System.currentTimeMillis()+"");
            //设置cookie有效期为一天.有效期:浏览器关闭掉后再次打开,上次的cookie还是存在的
            cookie.setMaxAge(24*60*60);
            resp.addcookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
    
        cookieDemo1
        moli.cookie.cookieDemo1
    
    
        cookieDemo1
        /c1
    
    

     
     

    5.3Session 5.3.1概述

    • 服务器会给每个用户(浏览器),创建一个Session对象
    • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在
    • 用户登录之后,整个网站他都可以访问—>保存登录用户的信息,保存购物车信息,整个网站经常会使用的数据会被保存在Session中
    • Session的方法:

     
    Session和cookie的区别:

    • cookie是把用户的数据写给浏览器,浏览器保存(可以保存多个)
    • Session把用户的数据写到用户独占的Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
    • Session对象由服务器创建

     

    5.3.2使用Session
    public class sessionDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //解决乱码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            //获取session
            HttpSession session = req.getSession();
            //给session中存东西
            session.setAttribute("name",new Person("小明",22));
            String id = session.getId();
            //判断session是否是新创建的
            if (session.isNew()){
                resp.getWriter().write("session创建成功"+id);
            }else {
                resp.getWriter().write("session已经存在"+id);
            }
            
        }
    }
    
    //创建一个Person类
    public class Person {
        private String name;
        private int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
        public Person() {
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "person{" +
                    "name='" + name + ''' +
                    ", age=" + age +
                    '}';
        }
    }
    
    public class sessionDemo2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //解决乱码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            //获取session
            HttpSession session = req.getSession();
            Person person= (Person) session.getAttribute("name");
            System.out.println(person.toString());
        }
    }
    
    public class sessionDemo3 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
            session.removeAttribute("name");
            //手动注销session
            session.invalidate();
        }
    }
    
    
        sessionDemo1
        moli.cookie.sessionDemo1
    
    
        sessionDemo1
        /s1
    
    
    
        sessionDemo2
        moli.cookie.sessionDemo2
    
    
        sessionDemo2
        /s2
    
    
    
        sessionDemo3
        moli.cookie.sessionDemo3
    
    
        sessionDemo3
        /s3
    
    
    
    
        
        1
    
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446055.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号