Java基础——JSP(二)
一、JSP隐式对象概述
为了简化jsp表达式和脚本片断代码的编写,JSP一共提供了9个预先定义的变量,这些变量也称为隐式对象或内置对象。
在 jsp生成的Servlet源码中,有如下声明:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { //这里声明了内置对象 final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; //有一些内置对象是在这初始化的 try { response.setContentType("text/html;charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, "err_page.jsp", true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write('\r'); out.write('\n'); .... }
这里能找到8个内置对象, 还差一个 exception。
只要在专门用于错误处理的页面,才有这个 对象,将页面设为错误页: <%@ page isErrorPage="true" %>,则会发现 在上面的 _jspService 方法中又多了一个 exception 对象,Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
* 共有九大内置对象
//九大内置对象 1.request //HttpServletRequest 2.response //HttpServletResponse 3.pageContext //pageContext 4.application //ServletContext 5.session //HttpSession 6.page //Object 7.out //JspWriter 8.exception //Throwable 9.config //ServletConfig
1.request对象 //HttpServletRequest
* request 获取请求参数的方法
-- String getParamter(String name)
-- Enumeration getParameterNames(); //得到所有请求参数的名称
-- String [] getPrameterValues(String name) ; //取得所有的相同name的值
public class StrUtil { public static String linkListSql(String [] list){ String str="("; for(int i=0;i<list.length;i++){ if(i<list.length-1){ str+=list[i]+","; }else{ str+=list[i]; } } str+=")" ; return str; } } //dao中: public int delUsers(String[] idList) { String sql="delete from userInfo where id in "+StrUtil.linkListSql(idList); System.out.println(sql); return DBUtil.update(sql, null); }
--Map getParameterMap() //得到一个Map
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String,String[]> map =request.getParameterMap(); Set<Map.Entry<String,String[]>> entrySet=map.entrySet(); Iterator<Map.Entry<String, String[]>> it=entrySet.iterator(); while(it.hasNext()){ Map.Entry<String, String[]> item=it.next(); System.out.println(item.getKey()+":"); String [] valueList=item.getValue(); for(int i=0;i<valueList.length;i++){ System.out.println(valueList[i]); } System.out.println("--------"); } }
2.request 获取请求头的方法
-- getHeader(String name) //根据请求头的名称得到内容
-- Enumeration getHeaderNames() //取得所有的请求头名称
-- int getIntHeader(String name) //根据名称,得到整数类型的标头
-- Cookie [] getCookies() //取得所有与请求头相关的Cookie
Enumeration headList =request.getHeaderNames(); while(headList.hasMoreElements()){ String headerName=headList.nextElement().toString(); System.out.println(headerName+":"); System.out.println(request.getHeader(headerName)); System.out.println("----"); }
* request
String getContextPath() //取得Context路径 --- /show-admin-mvc
String getMethod() //取得Http 方法(GET ,POST) --GET
String getProtocol() //取得使用的协议(HTTP/1.1,HTTP/1.0) --HTTP/1.1
String getQueryString() //取得请求的参数字符串,不过HTTP的方法必须为GET --userName=f e=f&password=f e=f
String getRequestSessionId() //取得客户端的SessionId
String getRequestURI() //取得请求的URL,但不包扩请求的参数 字符串 --UserWeb/Test.jsp
String getRemoteAddr() //取得用户的IP地址 很有用
String getRemoteHost() //取得用户的主机名
int getRemotePort() //取得用户的主机端口
String getRemoteUser() //取得用户的名称
void setCharacterEncoding(String encoding) //设置编码格式,用来解决页面传递中文的问题
3.response 对象
将处理jsp处理数据后的结果返回给客户端,该对象实现javax.servlet.http.HttpServletResponse 接口
* 设定响应头的方法
void addCookie(Cookie cookie)
void addDateHeader(String name,long date)
void addHeader(String name,String value);
void addIntHeader(String name,int value);
void setHeader(String name,String value);
* 设定响应状态码的方法
void sendError(int sc); 传递状态码(status code)
void sendError(int sc,String msg)传送状态码和错误信息 //response.sendError(404,"哈哈,错了,活 gai " );
void setStatus(int sc) 设定状态码
* 用于重定向的方法
sendRedirect(String url);
4.session 对象
实现 javax.servlet.htt.HttpSession接口
setAttribute(String name,Object obj);
long getCreationTime() 取得Session产生的时间,毫秒,从1970年1月1日零时起算
String getId() //取得Session 的 Id
long getLastAccessedTime() 最得最后用这个Session发送的时间,同上
void invalidate() 取消session对象 并将其存放的内容释放
boolean isNew() 判断Session是否为新 (服务器产生,但client尚未使用)
void setMaxInactiveInterval(int interval) 过期时间,以秒为单位
5 application 对象
实现javax.servlet.ServletContext 接口
服务器启动后它就产生了
* 容器相关信息的方法
int getMajorVersion() //取得Container主要的Servlet API 版本 --2
int getMinorVersion //取得次版本
String getServerInfo () //取得Container 的名称和版本
* 有关服务器的路径和文件的方法
String getMimeType(String file)取得指定文件的MIME类型
ServletContex getContext(String uripath)取得指定Local URL 的 Application context
String getRealPath(String path) 取得本地端path的绝对路径
例如 : <% out.println(application.getRealPath("Login.jsp"));%>//C:\Program Files\Tomcat 6.0\webapps\UserWeb\Login.jsp
* 有关日志记录的方法
void log(String msg)将信息写入日志文件中
void log(String msg,Throwable throwable)将stack trace所产生的异常信息写入log文件中
6.pageContext 对象 //PageContext
提供了返回JSP页面的其他隐式对象的方法
getPage()
getRequest()
getResponse()
getServletConfig()
getServletContext() //返回applaction隐式对象
getSession()
getException()
getOut()
pageContex 对象是通过调用 JspFactory.getPageContext 方法获得的
描述 JSP 文档的运行环境提供对所有其他隐式对象及其属性的访问
void forward (path) //可以进行跳转, 属于请求的转发 // pageContext.forward("login.jsp");
ServletConfig getServletConfig() //返回servlet配置对象(即config对象)
///例子 public void test(PageContext context){ context.getRequest().setAttribute("requestKey","这是往request放的东西"); context.getSession().setAttribute("sessionkey", "这是往session放的东西"); context.getServletContext().setAttribute("applicationKey", "这是application的"); }
7.exception 对象 // Throwable
要使用它,必须在当前页面设置 。。。 isErrorPage="true" %>
别的页页设置 errorPage="ErrProcess.jsp"%>
8.page对象
Object page=this 表示jsp页面本身
9.config对象 //ServletConfig
存储 Servlet 配置对象,是 javax.servlet.servletConfig 接口的一个实例。
重要方法:
Enumeration getInitParameterNames()
String getInitParameter(name)
10.out对象 JspWriter
用来向jsp页面发送文本形式的实体内容,它是调用pageContext 的getOut()方法取得的它和以前学的 ServletResonse.getWriter方法返回的 PrintWriter 对象常相似,但两者是不同的对象。JSP中的out 的类型为JspWriter,相当于一个带缓存功能的PrintWriter,相当于PrintWriter的包装类
11.访问各个域范围中的属性
在pageContext, request,session,appaction 对象中,都可以调用 setAttribute 和 getAttribute 方法来设置和检索属于各自域范围内的属性, 它们的不同之处如下:
--appaction 中的,可以被同一个web应用程序中所有的Servlet和JSP页面访问
--session 中的,可以被同一个会话所有的Servlet和 JSP页面访问
--request 中的,可以被同一个请求中的所有Servlet 和 js页面访问
--pageContext 中的,仅可以被当前JSP页面的当前响应过种中调用的各个组件访问
pageContext 类还提供了对个各域范围的属性进行统一管理的方法,它的setAttribute 方法有如下重载
* public void setAttribute(String name,Object value); //page范围
* pbulic void setAttribute(String name,Object value,int scope) //scope 指定域范围
scope 对应的常量: PageContext. //这几个常量定义在 PageContext 类中
APPLICATION_SCOPE,
SESSION_SCOPE,
REQUEST_SCOPE,
PAGE_SCOPE
//例子 pageContext.setAttribute("key",value,PageContext.SESSION_SCOPE) //相当于往session中放值
12.Mime类型
不管浏览器接收到的是什么数据,实际上都是0,和 1 给成的二进制数据,浏览器不知道它,接收的是图片,普通网页,还是Excel文档,因为此,web服务器必须通过某种方式告诉浏览器所接收的实体内容代表的是哪种格式的数据,浏览器才能正确的处理,计算机应用中有多种通用数据格式,人们为每一种通用的数据格式都定义了一个名称,称为 MIME (Mutipurpose Internet Mail Extension 多用途Internet 邮件扩展) 类型Content-Type头字段用于指出实体中内容的Mime 类型,大多数Web服务器都可以设置文件扩展名和Mime类型的对应关系。在tomcat 中,可以在 C:\Tomcat6.0\conf\web.xml 中找到大量的这种Mime类型的对应设置。