Cookie包含一对Key/Value
生成一个Cookie并将它写到用户硬盘上的语法:
Cookie theCookie=new Cookie("cookieName","cookieValue");
response.addCookie(the Cookie);
如果服务器想从用户硬盘上获取Cookie,可以用
Cookie cookies[]=request.getCookies();
获取所有Cookie
然后调用Cookie的getName方法获取Cookie的Key,调用Cookie的getValue方法获取Cookie的Value
通过Cookie的setMaxAge(int expiry)方法设置Cookie的有效期。超过参数expity指定的时间(以秒为单位),Cookie就会失效。
例子:
<html>
<head><title>jspCookie.jsp</title></head>
<body>
<%
Cookie[] cookies=request.getCookies();
//System.out.println("dsfasfdafda");
for(int i=0;i<cookies.length;i++)
{
%>
<p>
<b>Cookie name:</b>
<%=cookies[i].getName()%>
<b>Cookie value:</b>
<%=cookies[i].getValue()%>
</p>
<p>
<b>Old max age in seconds:</b>
<%=cookies[i].getMaxAge()%>
<%
cookies[i].setMaxAge(60);
%>
<b>New max age in seconds:</b>
<%=cookies[i].getMaxAge()%>
<%
}
%>
<%!
int count1=0;
int count2=0;
%>
<%
response.addCookie(new Cookie("cookieName"+count1++,"cookieValue"+count2++));
%>
</body>
</html>
JSP声明用于声明JSP代表的Servlet类的成员变量和方法。
语法<%! %>
例如:
<%! int i=0;%>
也可声明函数:
<!
public String f(int i)
{
if(i<3) return "i<3";
else return "i>=3";
}
>
每个声明只在当前JSP页面中有效,如果希望每个JSP页面中都包含这些声明,可以把他们写成单独的页面,然后用<%@include%>指令把这个夜明加到其他页面中。
JAVA程序片段:
JSP文件中,可以在<%和%>标记间直接嵌入任何有效的JAVA语言代码。这样嵌入的程序片段称为Scriptlet。如果在page指令中没有指定method属性,则生成代码默认service方法的主体。
JSP指令用来设置和整个JSP网页相关属性,如网页的编码方式和脚本语言等。
语法:
<%@ 指令名 属性=“值”%>
常见的3中指令:
page:可以指定所使用的脚本语言、JSP代表的Servlet实现的接口、Servlet扩展的类以及导入的软件包。
语法:
<%@ page 属性1=“值1” 属性2=“值2”%>
例:
<%@ page import="java.util.*" contentType="type/html;charset=GB2312" language="java"%>
page指令的属性描述:
language:指定文件中所使用的脚本语言目前仅JAVA为有效值和默认值。用作整个文件。
语法:<%@ page language="java"%>
method:指定JAVA程序片段所属的方法的名称。JAVA程序片段会成为制动方法的主体。默认的方法是service方法。当多次使用该指令时,只有第一次范围是有效的,该方法有效值
包括:service、doGet和doPost等。
语法:<%@ page method="doPost"%>
import:指定导入的JAVA软件包名或类别列表。
语法:<%@page import="java.io.*,java.util.Hashtable"%>
content_type:指定响应结果的MIME类型,默认MIME类型是text/html。默认字符编码为ISO-8859-1。
语法:<%@ page content_type="text/html;charset=GB2312"%>
session="true|false"
指定JSP页是否使用Session。默认为TRUE
语法:<%@ page session="true"%>
errorPage="error_url"指定当发生异常时,客户请求被重新定向到那个网页。
语法:
<%@page errorPage="errorpage.jsp"%>
isErrorPage="true|false":表示此JSP网页是否为处理异常的网页。
语法:<%@ page isErrorPage="true"%>
include:JSP可以通过include指令来包含其他文件。被调用的可以是JSP文件、HTML文件或文本文件。
语法:<%@inclue file="relativeURL"%>
开发网站时,如果多数JSP网页都含有相同的内容,可以把这部分相同的内容单独放到一个文件中,其他的JSP文件通过include指令将这个文件包含进来,这样做可以提高开发网站的效率,而且便于维护网页。
taglib:自定义JSP标签
Servlet容器在启动时会加载Web应用,并为每个WEB应用创建唯一的ServletContext对象。可以把ServletContext看成是一个WEB应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,它提供了4个读取或设置共享数据的方法:
setAttribute(String name,Object object):把一个对象和一个属性名绑定。将这个对象存储在ServletContext中。
getAttribute(String name):根据给定的属性名返回所绑定的对象;
removeAttribute(String name):根据给定的属性名从ServletContext中删除相应的属性。
getAttribateNames():返回一个Enumeration对象。它包含了存储在ServletContext对象中的所有属性名。
package mypack;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletContext extends HttpServlet {
/**
* Constructor of the object.
*/
private static final String CONTEXT_TYPE = "text/html";
private Object Integer;
public ServletContext() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setContentType("text/html");
// PrintWriter out = response.getWriter();
doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得Context的引用
ServletContext context = (ServletContext) getServletContext();
//response.setContentType("text/html");
PrintWriter out = response.getWriter();
Integer count = (Integer) context.getAttribute("count");
if (count == null) {
count=new Integer(0);
context.setAttribute("count",new Integer(0));
}
response.setContentType(CONTEXT_TYPE);
out.print("<html><head><title>");
out.print(CONTEXT_TYPE+"</title></head><body>");
out.print("<p>This count is:"+count+"</p>");
out.print("</body>");
count=new Integer(count.intValue()+1);
context.setAttribute("count",count);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occurs
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
// Put your code here
}
}
创建自己的HttpServlet类,4个步骤:
(1)扩展HttpServlet抽象类。
(2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost方法。
(3)获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。无论是HTML表单数据还是URL上的查询字符串,在
HttpServletRequest对象中都以参数名/参数值的形式存放,可以通过一下方法检索参数信息:
getParameterNames():返回一个Enumeration对象,它包含了所有的参数名信息
getParameter(String name):返回参数名name对应的参数值
getParameterValues():返回一个Enumeration对象,它包含了所有的参数值信息HttpServletResponse对象有一个getWriter()方法。该方法返回一个PrintWriter对象。使用
PrintWriter的print()或println()方法可以向客户端发送字符串数据流。
(4)生成HTTP响应结果。通过HttpServletResponse对象可以生成响应结果。HttpServletResponse对象有一个getWriter()方法,该方法返回一个PrintWriter对象。使用
PrintWriter的print()或println()方法可以向客户端发送字符串数据流。
例:
package mypack;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet//第一步
{
//覆盖doGet()方法
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
//第三步:获取HTTP请求中的参数信息
String clientName=request.getParameter("clientName");
if(clientNme!=null)
clientName=new String(clientName.getBytes("ISO-8859-1"),"GB2312");
else
clientName="我的朋友";
//第四步:生成HTTP响应结果
PrintWriter out;
String title="HelloServlet";
String heading1="This is output from HelloServlet by doGet:";
response.setContentType("text/html;charset=GB2312");/*MIME类型*/
out=response.getWriter();
out.print("<html><head><title>"+title+"<title>");
out.print("</head><body>");
out.print(heading1);
out.print("<h1><p>"+clientName+":您好</h1>");
out.print("</body></html>");
out.close();
}
}
部署Servlet:
在WEB-INF下的Web.xml里增加如下代码:
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>mypack.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web>
HttpServlet的作用是:
根据客户发出的HTTP请求,生成响应的HTTP响应结果。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpRequest对象,并把HTTP请求信息封装到HttpRequest对
象中,这大大简化了HttpServlet解析请求数据的工作量。
如果没有HttpServletRequest,HttpServlet只能直接处理Web客户发出的原始的字符串数据,有了HttpRequest后,只要调用HttpServletRequest的相关方法,就可以方便地读取
HTTP请求中任何部分信息,HttpServletRequest中读取HTTP请求信息的常用方法如下:
getCookies() 返回HTTP请求的Cookies
getHeader(String name) 返回参数指定的HTTP请求的Header数据
getRequestURI() 返回HTTP请求URI
getQueryString() 返回HTTP请求数据中的查询字符串
getMethod() 返回HTTP请求方法。
Servlet容器向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的没一个部分内容。HttpServletResponse提供的生成响应数据Header的方法
如下:
addCookie(Cookie cookie) 向HTTP响应中加入Cookie
setHeader(String name,String value) 设置HTTP响应的Header,如果参数name对应的Header已经存在,则覆盖原来的Header数据
addHeader(String name,String value) 向HTTP响应加入Header.
HttpServlet的service方法
Servlet容器调用自身的方法解析HTTP请求信息。
1:Web客户向Servlet容器发出HTTP请求;
2:Servlet容器解析Web客户的HTTP请求;
3:Servlet容器创建一个HttpRequest对象,在这个对象中封装了HTTP请求信息;
4:Servlet容器创建一个HttpResponse对象;
5:Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6:HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7:HttpServlet调用HttpResponse的有关方法,生成响应数据;
8:Servlet容器把HttpServlet的响应结果传给Web客户。
HTTP是一种基于请求/响应模式的协议。
HTTP请求
HTTP请求有3个部分构成,分别是:
请求方法 URI 协议/版本
请求头
请求正文
例:
GET/sample.jsp HTTP/1.1
1.请求方法 URI 协议/版本
请求的第一行是“方法URI 协议/版本”:
GET/sample.jsp HTTP/1.1
以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1”代表协议和协议的版本。
根据HTTP标准,HTTP请求可以使用多种请求方法。HTTP1.1支持7中请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE。最常用的:POST和GET。
URI完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录大的相对目录即可,因此总是以“/”开头。
协议版本生命了通信的过程中使用的HTTP的版本。
2.请求头
请求头包含许多有关客户端环境和请求正文的有用信息。如:浏览器所用的语言,正文的长度等。
Accept:image/gif,image/jpeg,*/*;
3.请求正文
请求头和请求正文之间时一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
userName=weiqin&password=1234
HTTP 响应
由3个部分构成:
协议 状态代码 描述
响应头
响应正文
HTTP响应例子:
HTTP/1.1 200 OK
1.协议 状态代码 描述
HTTP 响应的第一行类似于HTTP请求的第一行,它表示通信所用的协议是HTTP1.1,服务器已经成功地处理了客户端发出的请求(200 表示成功);
2.响应头
响应头和请求头一样包含许多有用的信息,例如服务器类型,日期时间、内容类型和长度等。
Server:ApacheTomcat/5.0.12
3.响应正文
响应正文就是服务器返回的HTML页面:
<html>
<head></head>
...
<body></body>
</html>
分为三个阶段:初始化阶段、响应客户请求阶段和终止阶段。
javax.servlet.Servlet接口定义了3个方法:
init()、service()、destroy().
初始化阶段:
在下列情况下Servlet容器装载Servlet:
Servlet容器启动时自动装在某些Servlet.
Servlet容器启动后,客户首次向Servlet发出请求。
Servlet的类文件被更新后,重新装载Servlet.
//Servlet容器是否在启动时自动装载Servlet,这是由在web.xml中为Servlet设置的<load-on-startup>属性决定的
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。
重载方式:
public void init(ServletConfig config) throws ServletException;
public void init()throws ServletException;
用第一个方法应该先调用super.init(config)方法确保参数config应用ServletConfig对象;
用第二个方法可以不用调用super.init()方法,如果要在init方法中访问ServletConfig对象,可以调用Servlet类的getServletConfig()方法。
响应客户请求阶段
Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法从ServletRequest对象获得客户请求信息并处理该请求,通过
ServletResponse对象向客户返回响应结果。
终止阶段
当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy()方法。在destroy方法中,可以释放Servlet所
占用的资源。
SerletResponse接口:
getOutputStream:返回可以向客户端发送二进制数据的输出流对象ServletOutputStream
getWriter:返回可以向客户端发送字符数据的PrintWriter对象
getCharacterEncoding:返回Servlet发送的响应数据的字符编码。
getContentType:返回Servlet发送的响应数据的MIME类型。
setCharacterEncoding:设置Servlet发送的响应数据的字符编码
setContentType:设置Servlet发送的响应数据的MIME类型。
getAttribute 根据参数给定的属性名返回属性值。
getContentType:返回客户请求数据MIME类型。
getInputStream:返回以二进制数方式直接读取客户请求数据的输入流.
getParameter:根据给定的参数名返回参数值。
getRemoteAddr:返回远程客户主机的IP地址。
getRemoteHost:返回远程客户主机名。
getRemotePost:返回远程主机端口。
setAtrribute:在ServletRequest中设置属性。