通过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访问
其它
Control character in cookie value or attribute报错是因为没有import java.net.URLDecoder;或import java.net.URLEncoder;