标签:
JSP脚本中包含了9个内置对象,都是Servlet API 的实例, JSP规范对他们进行了默认初始化(JSP对象的servlet的_jspService()方法来创建这些实例),可以直接使用
1.启动单独线程
2.使用I/O流读取用户请求数据
3.从请求数据中解析参数
4.处理用户请求
5.生成响应数据
6.使用IO流向客户端发送响应数据
1.2.6步骤都可以由web服务器来完成
3.4.5步有差异:不同的请求里包含的请求参数是不同的.因此处理用户请求的方式也不同 ,生成的响应也就不同
web服务器会调用servlet的jspService()方法来执行3.4.5步,jsp页面里的静态内容,jsp脚本都会转换成jspservice()的执行代码,这些代码负责解析参数,处理请求,响应业务功能,web服务器主要完成多线程,网络通信等底层功能.
在运行到第3步,解析到用户参数以后,需要通过这些参数来创建HttpServletRequest和HttpServletResponse等对象,作为调用_jspService()方法的参数
jsp和servlet都是通过web服务器来调用, jsp和servlet通常不会互相调用,jsp和servlet之间如何交换数据?
因此web服务器提供了4个类似map结构的类:允许jsp和servlet把数据存取到这4个类中
application:对整个web应用有效,被存入的数据,可以在这个应用下的任意jsp或者servlet中访问
request:对本次请求有效
session:对一次会话有效
page:对当前页面有效
application: javax.servlet.ServletContext的实例,代表JSP所属的web应用本身
application 通常有两个作用:
访问web应用的配置参数
String driver = applicatoin.getInitParameter("driver");
web.xml里配置
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.driver</param-value>
</context-param>
config对象是ServletConfig的实例,该接口用于获取配置参数的方法是getInitParameter(String paramName)
config.getInitParameter("name");
config对象代表当前jsp页面的配置信息,但jsp页面一般没有配置信息, 因为servlet需要在web.xml中配置,所以
<servlet>
<init-param>
<param-name>name</param-name>
<param-value>哈哈哈</param-value>
</init-param>
</servlet>
是Throwable对象的实例,代表jsp中产生的错误和异常
在某个jsp中, 把这个jsp设置为异常获取页 page指令里的isErrorPage="true"
就可以使用exception对象:
out对象是个页面输出流
这个对象代表页面上下文,只要用来访问jsp之间的共享数据,使用pageContext对象可以访问session,request,page,application范围的变量.
pageContext是PageContext类的实例,提供以下两个方法来访问session,request,page,application范围的变量
reqeust是HttpServletRequest的实例
每个request对象封装着一次用户的请求,所有的请求参数都封装在request对象中
以下几个常用方法来获取请求参数:
getParameter(String paramName):获取paramName请求参数的值
getParameterMap():获取所有的请求参数名和值组成的map对象
getParameterNames():获取所有请求参数名所组成的Enumeration对象
以下几个常用方法来获取请求头的值:
getHeader(String name) :获取指定请求头的值
getIntHeader(String name) :获取指定请求头的值并转换成int型
请求头和请求参数都是由用户发送到服务器的数据,一般请求头由浏览器自动添加,因此一次请求总是包含若干请求头:请求参数通常由开发人员控制添加,让客户端发送请求参数一般分为两种情况:
GET方式的请求:
直接在浏览器地址栏输入访问地址所发送的请求或者提交表单发送请求时,该表单对象的form元素没有设置method属性,或者设置了为get. GET请求会把参数的名和值以字符串的形式附加在URL之后,GET请求传输数据量一般不大于2KB
POST方式的请求:
通常用来提交表单,需要设置form元素的method的属性值为post,一般post传送数据量大小受服务器限制,post方式传送的请求参数和值放在HTML HEADER中传送,在地址栏看不到
GET方式请求里如果是非西欧字符,比如是中文,如何获得:
//获取原始的请求参数
String rawName = request.getParameter("name");
//将请求参数值使用iso-8859-1字符串分解成字节数组
byte[] rawBytes = rawName.getBytes("ISO-8859-1");
//将字节数组重新解码成字符串
String name = new String(rawBytes,"UTF-8");
如果POST方式请求里包含中文:
//设置解码方式,用于中文
request.setCharacterEncoding("UTF-8");
//下面就可以获得请求参数了
对于需要生产非字符响应的情况,就需要使用response来响应客户端请求. response是HttpServletResponse接口的实例,该接口提供了一个getOutputStream()方法,该方法返回响应输出字节流.
例:
通过发送Http头,控制浏览器禁止缓存
有多种方式,对应于不同的浏览器器可能会采用不同的方式设定,可以同时使用,达到对所有浏览器都产生作用
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setDateHeader("expires",-1); //设置有效时间,数字为一个代表时间的long型整数
在Servlet中要想操作响应正文,需要通过response对象获取到输出流进行操作
response.getWriter();-----ServletOutputStream
response.getOutputStreaam();----PrintWriter
打印流的两个特点:可以设置自动刷新 可将信息原样输出
如果操作自定义信息,这时使用字符流
Servlet获取输出流在使用时注意事项:
同一时候,只能选择字符流或字节流一种,互相排斥;可以不关闭,由服务器关闭
Servlet可以完成显示操作
代码片段:
response.setHeaader("Content-type","text/html;charset=utf-8");
out.println("<form action="#" method=‘post‘>");
响应信息的乱码
response.setCharacterEncoding(String code); //设置响应正文编码
response.setContentType(String mimeType); //设置响应正文编码,同时告诉浏览器怎样解析
response.setHeader("content-Type","text/html;charset=utf-8");
response重定向
重定向会丢失所有的请求参数和request范围的属性,因为重定向会生产第二次请求,与前一次请求不在同一request范围内 HttpServletResponse提供了一个sendRedirect(String path)方法,该方法用于重定向到path资源,即重定向path资源发送请求.
增加cookie,可以使用response对象来完成
response.addCookie(Cookie cookie);
增加cookie之前,必须先创建cookie对象:
例子: //创建一个cookie对象 Cookie cookie = new Cookie("username","haha"); //设置cookie的生命周期 cookie.setMaxAge(24 * 3600); //向客户端增加cookie对象 response.addCookie(cookie);
这个cookie直到他的生命时长到了才会从客户端机器消失,使用cookie必须设置cookie的生命时间,否则它会随着浏览器的关闭而消失
想访问客户端的cookie 可以使用request的getCookie()方法 这个方法会返回客户端所有cookie组成的数组,遍历该数组的每个元素,找到希望访问的cookie就可以了.
例:
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
if(c.getName().equals("username")){
out.println(c.getValue());
}
}
cookie值不允许是中文字符,如果需要的话,可以借助java.net.URLEncoder先对中文字符串进行编码,将编码后的结果设为Cookie值.
例:
//编码
String name = java.net.URLEncoder.encode("猪八戒","utf-8");
//创建一个cookie对象
Cookie cookie = new Cookie("username",name);
//设置cookie的生命周期
cookie.setMaxAge(24 * 3600);
//向客户端增加cookie对象
response.addCookie(cookie);
session对象代表一次用户会话. 一次用户会话的意思:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话.常用语判断用户是否登录,购物车等
session范围内的属性可以在多个页面跳转之间共享,一旦关闭浏览器,seesion就结束了.session内的属性也会消失
session 对象是 HttpSession的实例,有两个常用方法:
setAttribute(String attName,Object attValue):设置session范围内attName属性的值为attValue
getAttribute(String name):返回session范围内attName属性的值
Session机制通常用于保存客户端的状态信息,这些状态信息需要保存到WEB服务器的硬盘上,所以要求session里的属性值必须是可序列化的,否则将会引发不可序列化的异常.
session的属性值可以是任何可序列化的java对象
标签:
原文地址:http://www.cnblogs.com/TerrySunShine/p/5315815.html