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>
    
原文地址:https://www.cnblogs.com/a-xia/p/11401034.html