• Servlet相关知识


    Servlet

    Servlet介绍

    servlet是用于开发动态web资源的技术;如果需要发一个动态web资源,需要编写一个java类,并实现servlet接口,并把开发好的java类部署到web服务器中。一般情况下,我们把实现了servlet接口的java程序称为Servlet。Servlet接口有两个默认的实现类,分别是GenericServlet和HTTPServlet。他们的关系可以在HTTPServlet和GenericServlet的源码中详细学习。

    web服务器之一Tomcat

    Tomcat作为Web服务器之一,具有性能优良,非常的小(它是符合Web服务器最小的服务器)的特点。下载tomcat:http://tomcat.apache.org/——找到download——下载完成后,解压到任意目录。

    Tomcat目录结构:

      1. bin:春芳可执行文件、启动和关闭;
      2. conf:存放Tomcat的配置文件;
      3. lib:存放服务器需要的jar包;
      4. logs:日志文件;
      5. temp:临时文件;
      6. webapps:存放网站和web目录;
      7. work:Tomcat的工作目录;
    

    使用IDEA搭建Web开发环境:

    1. 打开idea,并创建一个微博项目;

    2. 配置Tomcat服务器

      在Run/Debug Comfigurations中,找到Tomcat Server中的local;通过更改名字,修复警告,修改项目名称等来完成搭建。

    本章节常见的HTTP :超文本传输协议响应

    302:表示重定向;

    404:表示请求的文件不存在,路径写错等问题;

    500:服务器代码写错了,可能文件中的java代码有误。

    使用IDEA开发Servlet

    idea开发Servlet需要准备并且导入Servlet需要的jar包。可以通过以下操作进行自动下载jar包:

    在IDEA中新建一个web项目,并新建一个package,在其中新建一个Servlet文件。此idea会自动生成一个实现了HttpServlet并重写了doGet和doPost方法的java文件,但文件的Servlet字样都是报红出错的。需要我们利用idea的只能纠错功能,就可以非常快捷的导入jar包。也可以手动将jar包导入项目的lib文件夹中。最终程序中的Servlet字样不报红,lib目录下有jar包,就是导入成功。

    response

    重定向

    简单来说,就是将一个请求,转换到另一个地址。java中,语法如下:

    response.sendRedirect("success.jsp");//重定向到成功页面
    

    通过servletContext对象实现数据共享

    1. 新建一个properties文件:

      driver=com.mysql.jdbc.Driver
      username=root
      password=123456
      url=jdbc:mysql://localhost:3306/smbms
      
    2. 编写Servlet类:

      package com.kuang.servlet;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.util.Properties;
      
      //读取properties配置文件
      public class ServletDemo03 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req,resp);
          }
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //读取配置文件
              //1.获得配置文件的路径
              String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties");
              System.out.println("取得的路径为:"+realPath);
              Properties properties = new Properties();
              FileInputStream is = new FileInputStream(realPath);
              properties.load(is);//把文件流加载到配置文件的对象中;
              String driver = properties.getProperty("driver");
              String username = properties.getProperty("username");
              String password = properties.getProperty("password");
              String url = properties.getProperty("url");
              //响应到网页
              resp.getWriter().println(driver);
              resp.getWriter().println(username);
              resp.getWriter().println(password);
              resp.getWriter().println(url);
              //==================================
              System.out.println(driver);
              System.out.println(username);
              System.out.println(password);
              System.out.println(url);
          }
      }
      
    3. 配置web.xml

      <servlet>
          <servlet-name>Demo01</servlet-name>
          <servlet-class>com.David.servlet.ServletDemo01</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>Demo01</servlet-name>
          <url-pattern>/d1</url-pattern>
      </servlet-mapping>
      
    4. 运行,访问查看localhost:8080/demo02/q3

    Request

    乱码问题解决方案:

    所有能设置编码的地方都统一设置:数据库,数据库字段,Servlet程序,请求,响应 , 前端,浏览器。

    request.setCharacterEncoding("UTF-8");//处理乱码问题
    response.setCharacterEncoding("UTF-8");//处理乱码问题
    

    request常用的方法

    package com.kuang.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class RequestDemo01 extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //查看request对象的方式
            System.out.println(request.getContextPath()); //获得web项目路径
            System.out.println(request.getRequestURI()); //请求的URL路径
            //Remote 远程
            System.out.println(request.getRemoteUser()); //获得远程的用户名
            System.out.println(request.getRequestedSessionId()); //获得SessionId;
            System.out.println(request.getServletPath()); //请求servlet的url
            System.out.println(request.getLocalAddr()); //获得本地地址  防火墙
            System.out.println(request.getLocalName()); //获得本地名字
            System.out.println(request.getLocalPort()); //获得访问的端口号
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
    }
    

    Request对象接收前端用户提交的参数

    1. 写前端注册页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>注册</title>
      </head>
      <body>
      <%--
      Form表单
          action:代表要提交的路径,表单要提交到哪里 ,可以提交到一个Servlet
          //提交到Servlet需要,获取到Web项目的路径下的Servlet
          method: 提交表单的方式
      --%>
      <h1>注册</h1>
      <form action="${pageContext.request.contextPath}/r2" method="post">
          <p>用户名:<input type="text" name="username"></p>
          <p>密码:<input type="password" name="password"></p>
          <p>
              <input type="submit">
              <input type="reset">
          </p>
      </form>
      </body>
      </html>
      
    2. 写处理前端提交信息的Servlet

      package com.kuang.servlet;
      
      import javax.print.attribute.HashPrintRequestAttributeSet;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      //处理前端提交过来的数据
      public class RequestDemo02 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doPost(req,resp);
          }
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //通过HttpServletRequest获取前端用户提交的信息
              //req.getParameterValues(); 获得前端传递的控件信息,通过控件的name;但是可以接受多个参数的控件,比如(多选框....)
              //req.getParameter(); 获得前端传递的控件信息,通过控件的name;
              req.setCharacterEncoding("utf-8");
              resp.setCharacterEncoding("utf-8");
              String username = req.getParameter("username");
              String password = req.getParameter("password");
              //连接数据库,比较数据库中的信息是否匹配
              if (username.equals("David")&&password.equals("1234567")){
                  System.out.println("登录成功!"); //跳转到成功页面
              }else {
                  System.out.println("登录失败!"); //提示重新注册
              }
              System.out.println(username);
              System.out.println(password);
          }
      }
      
    3. 配置web.xml

      <servlet>
          <servlet-name>RequsetDemo02</servlet-name>
          <servlet-class>com.David.servlet.RequestDemo02</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>RequsetDemo02</servlet-name>
          <url-pattern>/d2</url-pattern>
      </servlet-mapping>
      
    4. 提交测试

    转发

    简单说转发是服务器自己转发到服务器上的另一个请求。

    转发和重定向的区别

    1. 重定向:服务器告诉客户端,客户端去请求另外一个地址;是一种客户端行为。
      1. 地址栏会变;
      2. 不能携带参数。
    2. 转发:服务器自己转发到服务器上的另一个请求; 是一种服务器行为。
      1. 地址栏不会变;
      2. 可以携带参数。

    会话

    在Web中,会话表示从浏览器打开某个网站,在这个网站中无论操作了什么,直到关闭浏览器,这一个过程,称之为一个会话。

    会话结束的方式:

    1. 客户端关闭了
    2. 服务端销毁了

    处理会话是因为:有时候要求,长期保持会话,无论用户关闭少次浏览器,这个会话都要存在。

    在客户端留下一点东西,客户端下次会呈现出来过来,服务器就知道客户端之前访问过。

    cookie检验服务器是否访问

    package com.westos.serlvet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class CookieTest extends HttpServlet {
        boolean flag = false;
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //解决乱码问题:
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            //检查请求的人是否带了Cookie
            //通过用户的请求,检查它是否有cookie
            Cookie[] cookies = request.getCookies();
            System.out.println("cookie:"+cookies);
            if (flag){//如果flag是真,来过
                if (cookies!=null){//你有cookie
                    for (int i = 0; i < cookies.length ; i++) {
                        Cookie cookie = cookies[i];
                        if (cookie.getName().equals("lastLoginTime")){
                            response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
                            System.out.println("刷新了cookie");
                        }
                    }
                }
            }else { //如果flag是假,没来过
                response.getWriter().println("你是第一次来,还想享受组VIP待遇?");
                System.out.println("给该用户一个cookie");
            }
            //建立一个cookie
            Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
            //设置cookie保存的时间 //cookie.setMaxAge();
            //把这个cookie发给客户端
            response.addCookie(cookie);
            //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
            flag = true;
        }
    }
    

    session

    在服务器上做记录,下次客户端访问的时候就能判断出客户端之前访问过。

    只要客户端一旦连接上服务器,服务器就会自动产生Session;一个连接对应一个session,session可以在一个会话中传递信息;通过setAttribute设置值;通过getAttribute获得值;由服务器端控制,服务器如果重启了,信息就会丢失。

    会话注销的方法

    1. session.invalidate();//通过代码注销会话
      
    2. <!--session-config可以设置会话自动过期,时间分钟为单位-->
      <session-config>
          <session-timeout>1</session-timeout>
      </session-config>
      
  • 相关阅读:
    五星评价
    IE9以上 CSS文件因Mime类型不匹配而被忽略 其他浏览器及IE8以下显示正常
    js时间显示设置
    jq手风琴---点击时列表的左边距逐渐减小
    break continue return
    validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
    Commons IO
    Servlet & JSP
    设计模式
    Table of Contents
  • 原文地址:https://www.cnblogs.com/a-xia/p/11401034.html
Copyright © 2020-2023  润新知