4.1 request 对象
HTTP通信协议是用户与服务器之间一种提交信息与乡音琯溪的通信协议。在JSP中,内置对象request封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。
用户通常使用HTML的form表单请求访问服务器的某个JSP页面或servlet,并提交必要信息给所请求的JSP页面。表单的一般格式是:
<form action = "请求访问的页面或servlet" method = get | pose>
提交手段
</form>
其中,<form>是form表单的开始标签,</form>是结束标签,开始标签和结束标签之间是form表单的标记体的内容。action是form表单的属性,其属性只给出表单请求访问的JSp页面或servlet。form表单中的method属性取值get或post。get方法和post方法的主要区别是:使用get方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而post方法提交的信息不会显示在地址栏中。提交手段包括文本框、列表、文本区等,例如:
<form action = "请求访问的页面或servlet" method = get | pose>
<input type = "text" name = "boy" value = "ok" />
<input type = "submit" name = "submit" value = "提交" />
</form>
该form表单使用post方法向请求访问的tom.jsp页面提交信息,提交信息的手段是text(文本框),文本框的名字由name属性的值指定(例如,名字是boy)。在文本框输入信息(其中默认值是ok),然后单击submit提交键向服务器的JSP页面tom.jsp提交信息。
4.1.1 获取用户提交的信息
request对象获取用户提交信息的最常用的方法是getParameter(String s)。例如:
如果form表单中的action请求的页面是当前页面,可以用双引号或单引号代替当前页面,即携程action = "" 或 action = ' ',注意双引号或单引号中不能含有空格。
4.1.2 处理汉字信息
request对象获取用户提交的信息中如果含有汉字字符或其他非ASCII字符,就必须进行特殊的处理方式,以防出现乱码现象。
JSP页面文件的编码为UTF-8编码,只要让request对象在获取信息之前调用setCharacterEncoding方法设置编码为UTF-8就可以避免乱码现象,代码如下:
request.setCharacterEncoding("UTF-8");
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>transfor</title>
</head>
<style>
#tom{
font-family: 宋体;font-size: medium;color: black;
}
</style>
<body id="tom" bgcolor="#f0f8ff">
可以输入各种语言的文字,单机提交键:<%
String content = "good morning,早上好";
%>
<form action="" method="post">
<textarea name ="language" id="tom" rows="3" cols="9">
<%=content%>
</textarea>
</form>
<%
request.setCharacterEncoding("utf-8");
String variousLanguages = request.getParameter("language");
out.print(variousLanguages);
%>
</body>
</html>
运行结果:
4.1.3 常用方法举例
当用户访问一个页面时,会提交一个HTTP请求给Tomcat服务器,这个请求包括一个请求行、HTTP头和信息提,例如:
post/example3_1.jsp/HTTP.1.1
host:localhost:8080
accept-encoding:gzip,deflate
其中,首行叫请求行,规定了向访问的页面请求提交信息的方式,例如post、get等方式,以及请求的页面的名字和使用的通信协议。
第2、3行分别是两个头(Header):host和accept-encoding,称host、accept-encoding是头名字,而localhost:8080以及gzip、deflate分别是两个头的值。一个典型的请求通常包含很多的头,有些透视标准的,有些和特定的浏览器有关。
一个请求还包含信息提,即HTML标记组成的部分,可能包括各式各样用于提交信息的表单等,如:
<form action = "tom.jsp" method = "post">
<input type = "text" name = "boy" value = "ok"/>
<input type = "submit" name = "submit" value = "提交"/>
</form>
4.1.4 处理 HTML 标记
目前的HTML大约有100多个标记,这些标记可以描述数据的显示格式。
(1)form标记
习惯称form标记为form表单,由于用户经常需要使用form表单提交数据,所以有必要对form表单进行简明的介绍。
form表单的一般格式是:
<form action = "请求访问的页面或servlet" method = get | post >
各种提交手段
提交键
</form>
其中,<form>是form表单的开始标签,</form>是结束标签,开始标签和结束标签之间是form表单的标记体内容。action是form表单的属性,给出表单请求访问的JSP页面或servlet。form表单中的method属性取值get或post。get方法和post方法的主要区别是:使用gey方法提交的信息会再提交的过程中显示在浏览器中的地址栏中,而post方法提交的信息不会显示在地址栏中。提交手段包括文本框、列表、文本区等,例如:
<form action = "tom.jsp" method = "post">
<input type = "text" name = "boy" value = "ok" />
<input type = "submit" name = "submit" vlue = "提交" />
</form>
form表单标记经常将下列标记作为form表单的子标记,以便提供提交数据恶的手段,这些标记都以GUI形式出现,方便用户输入或选择数据,例如,文本框、下拉列表、滚动列表等。
- <input - - - />
- <select - - -></select>
- <option - - - ></option>
- <textArea - - - ></textArea>
(2) input标记
在form表单将input标记作为子标记来指定form表单中数据的输入方式以及form表单的提交键。input标记属于空标记,即没有标记体,所以input标记没有开始标签和结束标签。<input>标记的基本格式:
<input type = "GUI对象" name = "GUI对象的名字" value = "GUI中的默认值" />
input中的type属性的值指定输入方式的GUI对象,name属性的值指定这个GUI对象的名字。Tomcat服务器的内置对象request通过name指定的名字来获取GUI对象中提交的数据。GUI对象可以是text、checkbox、submit等。(具体细节自行查找)
4.1.5 处理超链接
HTML的超链接标记
<a herf = 链接的页面地址>文字说明</a>
例如:
<a herf = "example4_9_receive.jsp">购买</a>
用户可以单击超链接标记的文字说明,访问超链接给出的链接页面。使用超链接标记时还可以增加参数,一边想所连接的页面传递值,格式如下:
<a herf = 链接的页面地址?参数1 = 字符串1&参数2 = 字符串2 . . . >文字说明</a>
超链接所链接的页面,使用request对象调用getParameter("参数")方法获得超链接的参数传递过来的参数的值,即字符串。例如:
String idStr = request.getParameter("id");
注:超链接标记向所链接的页面传递的参数的值,即字符串中不允许含有非ASCII字符。
4.2 response 对象
当用户访问一个服务器的页面时,会提交一个HTTP请求,服务器收到请求时,返回HTTP响应。响应和请求类似,也有某种结构,每个相应都有状态行开始,可以包含几个头以及可能的信息体。
4.2.1 动态响应 contentType 属性
页面用page指令设置页面的contentType属性的值,那么Tomcat服务器将按照这种属性值做出响应,将页面的静态部分返回给用户,用户浏览器接收到该响应就会使用相应的手段处理所接收到的信息。由于page指令只能为contentType指定一个值来决定响应的MIME类型,如果想动态的改变这个属性的值来响应用户,就需要使用response对象的setContentType(String s)方法来改变contentType的属性值,该方法的参数可取值:text/html、text/plain、image/gif等。
4.2.2 response 对象的 HTTP 文件头
当用户访问一个页面时,会提交一个HTTP请求给Tomcat服务器,这个请求包括一个请求行、HTTP头和信息体,例如:
post/example3_1.jsp/http.1.1
host:localhost:8080
accept-encoding:gzip,deflate
其中,首行叫请求行,规定了像请求访问的页面提交信息的方式,例如,host、accept-encoding是头名字,而localhost:8080以及gzip。delfate分别是两个头的值。一个典型的请求通常包含很多的头,有些头是标准的,有些和特定的浏览器有关。
同样,响应也包括一些头。response对象可以使用方法
addHeader(String head,String value);
或
setHeader(String head,String value)
动态添加新的响应头和头的值,将这些头发送给用户的浏览器。如果添加的头已经存在,则先前的头被覆盖。
4.2.3 response 对象的重定向
在某些情况下,当响应用户时,需要将用户重新引导至另一个页面。
可以使用response对象的sendRedirect(URL url)方法实现用户的重定向,即让用户从一个页面跳转到sendRedirect(URL url)中url指定的页面,即所谓的用户端跳转。需要注意当使用sendRedirect(URL url)方法将用户从当前页面重定向另一个页面是,Tomcat服务器还是要把当前JSP页面执行完毕后才实施重定向操作,但Tomcat服务器不再给用户看当前页面的执行效果。
4.3 session 对象
Session用于记录用户的状态。Session指的是一段时间内,单个客户端与Web服务器的一连串相关的交互过程。在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。且Session是由服务器端创建的。
4.3.1 session 对象的 id
服务器给它分配一个session,这个session有一个ID号,也就是说,不同用户的session是不一样的,每个用户都有一个session,每个session都有一个不同的ID。在返回请求的时候,它会把session的ID号返回给客户端,然后客户端在发第二次请求的时候,这个请求就包括session ID了,通过这种方式识别用户的多次请求,因此session ID是一个很关键的问题。
session对象被分配了一个String类型的ID,服务器将ID发送到客户端,存放在客户的Cookie中。有些时候,如果清理掉Cookie的话,再访问服务器就和没登录一样,因为将服务器缓存在浏览器的内容给清空了,因此session和Cookie是配套使用的。同一用户在同一Web服务目录中的各个页面的session相同,不同用户的session对象互不相同,具有不同的ID。
4.3.2 session 对象与 URL 重写
session依赖Cookie,这是因为服务器需要把sessionId保存到客户端浏览器。如果用户的浏览器关闭了Cookie功能,那么session就不能使用了!
可以在浏览器关闭了Cookie后使用URL重写的方法保存sessionId,这需要在每个URL后面都加上sessionId。这样用户的请求中就包含了sessionId,服务器就可以通过sessionId找到对应的session对象了。
使用response.encodeURL("请求地址")方法对URL进行编码,这样URL中会智能的添加sessionId。当浏览器支持cookie时,response.encodeURL()方法不会在URL后追加sessionId;当浏览器不支持cookie时,response.encodeURL()方法会在URL后追加sessionId。
4.3.3 session 对象存储数据
调用session对象的方法保存或读取客户在服务器端的有关数据。
session对象处理数据的方法:
public void setAttribute(String key, Object obj)//key是String类型的,value是Object类型的
public Object getAttibute(String key)//key是String类型的,value是Object类型的,在使用的过程中,不要忘记强制转换
public Enumeration getAttributeNamesObject
public void removeAttribute(String name)
数据有效范围:同一个session (用户)、同一个web应用下面,一个页面存的内容,另外一个页面是可以访问到的
4.3.4 session 对象的生存期限
session:表示客户端与服务器的一次会话,存在于服务器端。
- 创建:
当用户访问jsp页面时,会自动创建一个session。
如果访问的是servlet,看需要,若需要session,则调用getSession()方法。
- 活动周期:
在同一会话中,页面发生跳转,任然属于同一session。
只要当前会话页面没有全部关闭,那么在同一浏览器的不同页面的访问任然属于同一session
- 销毁:
手动调用session.invalidate()方法
等待会话超时,默认30分钟 可以修改
服务器压力过大,会自动销毁一部分
4.4 application 对象
当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一直存在,直到Web服务器关闭。
一个Web服务器通常有多个Web服务目录 (网站),当Web服务器启动时,它自动为每个Web服务目录都创建一个application对象,这些application对象各自独立,而且和Web服务目录一一对应。
访问同一个网站的客户都共享一个application对象,因此,application对象可以实现多客户间的数据共享。
访问不同网站的客户,对应的application对象不同。
application对象的生命周期:从Web服务器启动,直到Web服务器关闭。
注意:一个Web应用程序启动后,将会自动创建一个application对象,而且在整个应用程序的运行过程中只有一个application对象,也即所有访问该网站的客户都共享一个application对象。
application对象的作用范围:application对象是一个应用程序级的对象,它作用于当前Web应用程序,也即作用于当前网站,所有访问当前网站的客户都共享一个application对象。
4.4.1 application对象的常用方法
public void setAttribute(String key ,Object obj)
application 对象可以调用该方法将参数Object 指定的对象 obj 添加到application对象中,并为添加的对象指定了一个索引关键字,如果添加的两个对象的关键字相同,则先前添加对象被清除。
public Object getAttibue(String key)
获取application 对象含有的关键字是key 的对象。由于任何对象都可以添加到application对象中,因此用该方法取回对象时,应强制转化为原来的类型。
public Enumeration getAttributeNames()
application 对象调用该方法产生一个枚举对象,该枚举对象使用nextElemets()遍历application对象所含有的全部对象。
public void removeAttribue(String key)
从当前application 对象中删除关键字是key 的对象。
public String getServletInfo()
获取Servlet 编译器的当前版本的信息
4.4.2 application 留言板
详情跳转至其他博主。
4.5 out 对象
out对象是javax.servlet.jsp.JspWriter类的实例化对象,主要功能是完成页面的输出操作,使用print()和println()方法输出,但实际开发中基本不用out,都会使用表达式来完成页面的输出操作
out对象的常用方法:
得到总的Buffer大小
public int getBufferSize()
得到可用的Buffer大小
public int getRemaining()
<%@ page contentType="text/html" pageEncoding="utf-8" language="java" %>
<%@ page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<title>www.liuke.com</title>
</head>
<body>
<%
int buffer = out.getBufferSize();
int avaliable = out.getRemaining();
int used = buffer - avaliable;
%>
<h1>缓冲区总大小:<%= buffer%></h1>
<h1>缓冲区已用:<%= used%></h1>
<h1>缓冲区剩余:<%= avaliable%></h1>
</body>
</html>