• 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>
      
  • 相关阅读:
    Asp.net弹出浏览器客户端确认对话框代码 Carlwave
    VS 2005 与SQL Server 2005整合优势在哪里?(from csdn.net) Carlwave
    如何让搜索引擎收录我的站点 Carlwave
    超强扩展性的DNNDotNetNuke模块功能分类列表(from 中国DNN) Carlwave
    DotNetNuke命名空间概述 Carlwave
    Most Popular Questions and Answers on ASP.NET Whidbey(from asp.net forums,write by ASP.NET Team) Carlwave
    火箭官方宣告麦蒂缺阵五周 季后赛前景蒙上阴影 Carlwave
    asp.net有效使用缓存(转) Carlwave
    《Business Rules Engine Overview》《业务规则引擎概述》write by Mark Kamoski Carlwave
    中国详细省市县自治区名称列表(含access数据库和sql2000备份数据库) Carlwave
  • 原文地址:https://www.cnblogs.com/a-xia/p/11401034.html
Copyright © 2020-2023  润新知