Servlet_Cookie

本文介绍如何使用Servlet处理用户输入,并将这些值存入Cookie中。此外,还展示了如何读取和删除Cookie中的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过Servlet获取用于用户输入值,再将值存放到Cookie中,再通过Servlet查看Cookie中存放的值。

Servlet简介

Java Servlet 是一般运行在 Web 服务器(Tomcat)的程序,作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。Servlet,一般收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Servlet编写可采用extends HttpServlet,需要实现以下方法
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

环境变量

由于编写时会用到import javax.servlet,需要将其添加到CLASSPATH中,但JDK中默认是没有的,此时可从Tomcat包lib中找到servlet-api.jar。Windows命令行可使用set查看环境变量,set CLASSPATH查看CLASSPATH环境变量。

编写一个输入界面,放到Tomcat的webapps\ROOT目录下。需要将文件保存为UTF-8格式

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Servlet</title>
</head>
<body>
<form action="HelloWorld" method="GET">
Cookie1:<input type="text" name="cookie1">
<br />
Cookie2:<input type="text" name="cookie2" />
<input type="submit" value="提交" />
</form>
</body>
</html>

编写一个读取输入界面输入值并将值写入Cookie的Servlet,并javac编译后,放到Tomcat的webapps\ROOT\WEB-INF\classes下,如classes没有,可手动创建。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.URLEncoder;


public class HelloWorld extends HttpServlet {

  private String message;

  public void init() throws ServletException
  {

      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      response.setContentType("text/html;charset=utf-8");
      //request.setCharacterEncoding("utf-8");
      //设置返回编码与请求编码方式:
      Cookie cookie_1=new Cookie("CookieName1",URLEncoder.encode(request.getParameter("cookie1"),"UTF-8"));
      Cookie cookie_2=new Cookie("CookieName2",URLEncoder.encode(request.getParameter("cookie2"),"UTF-8"));

      response.addCookie(cookie_1);
      response.addCookie(cookie_2);



      PrintWriter out = response.getWriter();
      String title = "";
        String docType =
        "<!doctype html public \"-//w3c//dtd html 4.0 " +
        "transitional//en\">\n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "  <li><b></b>Cookie1:"
            + request.getParameter("cookie1") + "\n" +
            "  <li><b></b>Cookie2:"
            + request.getParameter("cookie2") + "\n" +
            "</ul>\n" +
            "</body></html>");
  }

  public void destroy()
  {

  }
}

编写一个读取Cookie中值的Servlet,将并javac编译后,放到Tomcat的webapps\ROOT\WEB-INF\classes下。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.URLDecoder;


public class ReadCookies extends HttpServlet {

  private String message;

  public void init() throws ServletException
  {

      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      response.setContentType("text/html;charset=utf-8");
      //request.setCharacterEncoding("utf-8");
      //设置返回编码与请求编码方式:
      Cookie cookie = null;
      Cookie[] cookies=null;
      cookies=request.getCookies();



      PrintWriter out = response.getWriter();
      String title = "";
        String docType =
        "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
      String[] strName={"Cookie1:","Cookie2:"};
      if( cookies != null ){
         out.println("<h2>查找 Cookies </h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];

            //out.print("名称:" + URLDecoder.decode(cookie.getName(),"UTF-8") + ",");
            out.print(strName[i]+ URLDecoder.decode(cookie.getValue(),"UTF-8")+" <br/>");
         }
      }else{
          out.println("<h2>未找到 Cookies</h2>");
      }
      out.println("</body>");
      out.println("</html>");
  }

  public void destroy()
  {

  }
}

编写一个删除Cookie中值的Servlet,将并javac编译后,放到Tomcat的webapps\ROOT\WEB-INF\classes下

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.URLDecoder;

// 扩展 HttpServlet 类
public class DeleteCookies extends HttpServlet {

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
      Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();

      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");

      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
       if( cookies != null ){
         out.println("<h2>Cookies 名称和值</h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            if(URLDecoder.decode((cookie.getName( )),"UTF-8").compareTo("CookieName1") == 0 ){
                 cookie.setMaxAge(0);
                 //设置 cookie 的生命为零
                 response.addCookie(cookie);
                 //把这个 cookie 添加到响应头,让其在生命时间后删除
                 out.print("已删除的 cookie:" + 
                              URLDecoder.decode((cookie.getValue( )),"UTF-8") + "<br/>");
            }
            else if(URLDecoder.decode((cookie.getName( )),"UTF-8").compareTo("CookieName2") == 0 ){
                 cookie.setMaxAge(0);
                 //设置 cookie 的生命为零
                 response.addCookie(cookie);
                 //把这个 cookie 添加到响应头,让其在生命时间后删除
                 out.print("已删除的 cookie:" + 
                              URLDecoder.decode((cookie.getValue( )),"UTF-8") + "<br/>");
            }


            //out.print(URLDecoder.decode((cookie.getName( )),"UTF-8") + ",");
            //out.print(URLDecoder.decode((cookie.getValue( )),"UTF-8")+" <br/>");
         }
      }else{
          out.println("<h2>No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

因为需要在外部访问Servlet,就需要做地址映射,在webapps\ROOT\WEB-INF\web.xml中添加以下内容

 <servlet>
        <servlet-name>HelloWorld</servlet-name>//指定Servlet别名
        <servlet-class>HelloWorld</servlet-class>//指定Servlet class名称
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>//指定Servlet别名
        <url-pattern>/HelloWorld</url-pattern>//指定外部访问地址名
    </servlet-mapping>

  <servlet>
        <servlet-name>ReadCookies</servlet-name>
        <servlet-class>ReadCookies</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ReadCookies</servlet-name>
        <url-pattern>/ReadCookies</url-pattern>
    </servlet-mapping>
        <servlet-mapping>
    <servlet-name>ReadCookies</servlet-name>
    <url-pattern>/ReadCookies</url-pattern>
</servlet-mapping>

 <servlet>
    <servlet-name>DeleteCookies</servlet-name>
    <servlet-class>DeleteCookies</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>DeleteCookies</servlet-name>
    <url-pattern>/DeleteCookies</url-pattern>
</servlet-mapping>

还需要将Tomcat中server.xml中修改编码格式,代表web服务器接收到

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8" />

编解码解释

htm内容中指定编码是告之浏览器以UTF-8编码显示,htm自身保存时选择的编码是代表以UTF-8编码保存数据。
response.setContentType(“text/html;charset=utf-8”);指定浏览器以UTF-8编码接收与显示。
request.setCharacterEncoding(“utf-8”);指定客户端发送请求为UTF-8编码
response.setCharacterEncoding(“utf-8”);指定服务器端返回为UTF-8编码
最后startup.bat访问

输入名称与值

将输入名称与值写入Cookie

通过Servlet将Cookie里的值读出

通过Servlet将Cookie里的值删除

其它

Control character in cookie value or attribute报错是因为没有import java.net.URLDecoder;或import java.net.URLEncoder;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值