zoukankan      html  css  js  c++  java
  • JSP内置对象介绍

    一、内置对象介绍


    内置对象不能在<%!    %>中使用!


    内置对象 所属类
    pageContext javax.servlet.jsp.PageContext
    request javax.servlet.http.HttpServletRequest
    response javax.servlet.http.HttpServletResponse
    session javax.servlet.http.HttpSession
    config javax.servlet.ServletConfig
    application javax.servlet.ServletContext
    out javax.servlet.jsp.JspWriter
    page java.lang.Object
    exception java.lang.Throwable

    为了便于查文档,一定要记住所属的类;(在JAVA SE的文档中是没有这些类的,需要下载Java EE文档);

    JSP的内置对象在JSP中非常重要,这些内置对象是由WEB容器创建出来的,所以用户不用自己创建。

    在JSP生成的Servlet类中可以清楚的看到这些内置对象的创建,不过需要注意的是exception一般是不会创建的,只有当JSP页面是错误页面才会创建,即只有JSP包含isErrorPage="true"时才创建exception对象;


    主要的几个内置对象有:

    (1)request  :    javax.servlet.http.HttpServletRequest,表示客户请求。

            具体用法:request.getParameter("name")等。

    (2)response:javax.servlet.http.HttpServletResponse,表示服务器回应。

    (3)pageContext:javax.servlet.jsp.pageContext,表示JSP页面。

    (4)session:javax.servlet.http.HttpSession,表示一次会话。

    (5)application:javax.servlet.servletContext,表示所有用户共享信息。

    (6)out:javax.servlet.jsp.jspWriter,写入页面内容。

    (7)page:表示一个页面的实例。

    (8)config:javax.servlet.servletConfig,表示配置文件信息。


    二、4种属性范围


    (1)page范围(pageContext):一页中有效,跳转即无效。

    (2)request范围:服务器跳转有效,客户端跳转无效。

    (3)session范围:跳转有效,新开浏览器无效。

    (4)application范围:所有用户有效,重启服务器无效。

    这四个对象有3个方法:

    (1) void setAttribute(String key,Object o);    //设置属性

    (2) Object getAttribute(String key);      //取得后要向下转型。

    (3) void removeAttribute(String key);   //删除属性

    注意:在getAttribute之后一定要转型!

    举例:

    pageContext.setAttribute("name","xiazdong");    //只能在单个页面中进行保存

    String name = (String)pageContext.getAttribute("name");      //换了一个页面后就无法取得

    注意:尽可能在满足功能的前提下,将属性设置的保存范围尽可能的小。这样能够提高性能;

    三、request对象


    注意:request.getSession()能够取得Session对象;

    request对象是接收客户端发来的信息,而客户端发来了头信息、内容、传递方式、cookie。

    常用方法:

    (1)request.getParameter(String name):取得name元素的值。  取得来源:(1)地址重写(2)表单提交

    (2)Enumeration enu = request.getParameterNames():取得全部的参数的名称,通过迭代器遍历。

    补充:Enumeration的用法:

    enu.hasMoreElements();

    enu.nextElement();

    (3)String[] strs = request.getParameterValues(String name):用于取得比如checkbox的多项选择。

    (4)Enumeration enu = request.getHeaderNames():获得全部头信息的名字。

    (5)String str = request.getHeader(String name):获得名字为name的头信息的内容。

    (6)String str = request.getMethod():获得是post或get.

    (7)request.setCharacterEncoding(String ):统一request的编码。 比如服务器的JSP页面设置为GBK,而浏览器为UTF-8,则会出现编码不匹配问题。

    (8)request.isUserInRole(String name);  用于用户验证角色

    (9)Cookie[] c = request.getCookies():获得全部的cookie。

    实例1:显示全部头信息

    Enumeration enu = request.getHeaderNames();

    while(enu.hasMoreElements()){

    String name = (String)enu.nextElement();

    String value = request.getHeader(name);

    //显示name和value即可

    }


    实例2:获得客户端IP地址


    String ip = request.getRemoteAddr();


    request还有一些不太常用的方法:

    (1)request.getRemoteAddr(); 返回客户端的ip地址;

    (2)request.getServletPath(); 返回当前文件在服务器的目录;

    (3)request.getContextPath(); 返回主目录信息;



    tomcat增加新用户和新权限的方法:

    (1)在tomcat/conf/tomcat-users.xml可以设置,参照admin配置即可,然后重启tomcat服务器,完成新用户和权限的载入。

    (2)在web.xml进行设置,使得成为登录网页前会跳出窗口输入用户名、密码。具体请见:http://blog.csdn.net/xiazdong/article/details/6894889



    四、post和get的区别


    最明显的区别是地址栏的区别,post传递时,地址栏没有任何变化,而get传递,地址栏会显示传递的信息,因此get传递的信息有限。


    五、response对象


    表示回应客户端的对象。


    1.常用方法:


    (1)addCookie(Cookie):添加cookie

    (2)setHeader(String name,String value):设置头信息。

    (3)sendRedirect():重定向,类似于客户端跳转。

    (4)getOutputStream(); 输出流

    常用用法:

    (1)定时刷新:response.setHeader("refresh","2"):2秒刷新一次。

    (2)定时跳转:response.setHeader("refresh","2;URL=hello.jsp");2秒后跳转到hello.jsp。注:此为客户端跳转;

    (3)客户端跳转:response.sendRedirect("hello.jsp");

    注意:以上(2)用法可能会失败,原因是用户在2秒内刷新了页面,导致refresh失效;

    应用:

    实现用户登录后的“3秒后跳转,如果没有跳转请点击 这里”;


    服务器跳转和客户端跳转的区别:

    服务器端跳转是立刻跳转,即页面执行到跳转语句后就不执行后面的语句;

    客户端跳转是执行完整个页面后才跳转。

    2.操纵Cookie:


    javax.servlet.http.Cookie;

    将用户的信息保存为一个cookie,存储在客户端,每次request时,都会把cookie发送到服务器端。

    按照我们宫学庆老师说的:一个人有一张纸,这张纸就是他的cookie,当以前登录过页面A,则在纸上会记录,如果再次进入页面A,别人就知道你已经进入过页面A并且知道了你的身份。

    response.addCookie(Cookie e);添加cookie。

    Cookie位于javax.servlet.http.cookie中。

    常用方法:

    (1)Cookie c = new Cookie("name","value"):创建一个新cookie。

    (2)c.setMaxAge(int seconds):设置cookie最长寿命,因为原本cookie保存在浏览器中,如果浏览器关闭,cookie丢失。

    (3)c.getName():获得名字。

    (4)c.getValue():获得值。

    Cookie[]cs = request.getCookies();获得cookie


    六、session对象


    session常用方法:

    (1)String getId():获得session id。session id类似于Cookie的JSessionId,是服务器自动分配的;

    (2)session.setAttribute("",""):设置属性。

    (3)session.getCreationTime():获得创建时间。

    (4)session.getLastAccessedTime():获得最后访问时间。

    (5)session.isNew():这个session是否是新的,即判断session id。

    (6)session.invalidate():把session的属性设置全部清空。

    登录-注销页面:

    (1)使用session.setAttribute()注册。

    (2)使用session.getAttribute()判断是否已经注册。

    (3)使用session.invalidate(); 注销;

    如果想要保存session id,则需要进行持久化操作,具体请见:http://blog.csdn.net/xiazdong/article/details/6894945


    七、application对象


    javax.servlet.ServletContext;

    常用方法:

    (1)getRealPath(path):获得真实路径。

    (2)getContextPath():获得虚拟路径。

    (3)getInitParameter(String );

    我们可以在web.xml中添加初始化参数:

    <context-param>
    	<param-name></param-name>
    	<param-value></param-value>
    </context-param>

    application==this.getServletContext()


    八、config对象


    javax.servlet.ServletConfig;

    先从配置文件谈起,在每个web应用中,都有一个WEB-INF文件夹,这个文件夹是很安全的,不会被其他人看到,因为不能直接访问,除非通过映射关系访问;

    如果将一个hello.jsp文件放到WEB-INF中,如果能够让其能够被访问。

    答案就是在WEB-INF/web.xml设置即可,内容如下:

    <servlet>

        <servlet-name>he</servlet-name>

        <jsp-file>/WEB-INF/hello.jsp</jsp-file>

    </servlet>

    <servlet-mapping>

        <servlet-name>he</servlet-name>

        <url-pattern>hello</url-pattern>

    </sevlet-mapping>

    重启服务器后,则在地址栏输入http://localhost:8080/test/hello即可。


    config常用方法:

    (1)getInitParameterNames();

    (2)getInitParameter(String name);

    什么是初始化参数呢?

    初始化参数在web.xml中进行配置,形式如下:

    <servlet>

    <init-param>

        <param-name>name</param-name>

        <param-value>value</param-value>

    </init-param>

    </servlet>


    九、pageContext对象


    表示JSP上下文,可以通过这个实例,取得request\response\session\<jsp:forward>等。

    (1)pageContext.forward(String);

    (2)pageContext.include(String);

    (3)pageContext.getServletConfig();

    (4)pageContext.getServletContext();

    (5)pageContext.getRequest();

    (6)pageContext.geResponse();

    (7)pageContext.getSession();

    也就是说,只要有了pageContext对象,就能完成一切内置对象的功能;

    补充:pageConext设置任意范围的属性(很少使用)


    使用函数:pageConext.setAttribute("name","value",int SCOPE);

    1.设置page范围

    pageConext.setAttribute("name","xiazdong",PageConext.PAGE_SCOPE);

    2.设置request范围

    pageConext.setAttribute("name","xiazdong",PageConext.REQUEST_SCOPE);

    3.设置session范围

    pageConext.setAttribute("name","xiazdong",PageConext.SESSION_SCOPE);

    4.设置application范围

    pageConext.setAttribute("name","xiazdong",PageConext.APPLICATION_SCOPE);


    因此,只需要PageContext就能完成全部内置对象的操作;



    十、exception对象


    只有当isErrorPage="true"时才能使用。
    常用方法:
    (1)getMessage();


    十一、out对象


    javax.servlet.jsp.JspWriter

    一般用于输出字符流,即文本流,但是如果需要传递图片等信息,则需要通过response传递;

    public void _jspService(final HttpServletRequest request, final HttpServletResponse response)//创建request、response
            throws java.io.IOException, ServletException {
    
        final PageContext pageContext;
        HttpSession session = null;
        final ServletContext application;
        final ServletConfig config;
        JspWriter out = null;
        final Object page = this;
        JspWriter _jspx_out = null;
        PageContext _jspx_page_context = null;
    
    
        try {
          response.setContentType("text/html;charset=utf-8");
          pageContext = _jspxFactory.getPageContext(this, request, response,    //创建pageContext
          			null, true, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();     //创建application 即ServletContext
          config = pageContext.getServletConfig();         //创建config
          session = pageContext.getSession();                //创建session
          out = pageContext.getOut();                       //创建out
          _jspx_out = out;


    总结:在JSP页面中如果想要输出,则使用out.println();进行输出!



    补充:禁用脚本和禁用EL

    1.禁用脚本

    在web.xml中配置如下模板:

     <jsp-config>
      	<jsp-property-group>
      		<url-pattern>*.jsp</url-pattern>
      		<scripting-invalid>true</scripting-invalid>		
      	</jsp-property-group>
      </jsp-config>


    就能够对所有的JSP禁用脚本。

    效果:如果禁用Scriptlet,则出现:“org.apache.jasper.JasperException”;

    2.禁用EL

    在web.xml中配置如下模板:

     <jsp-config>
      	<jsp-property-group>
      		<url-pattern>*.jsp</url-pattern>
      		<el-ignored>true</el-ignored>
      		
      	</jsp-property-group>
      </jsp-config>


     

    或者在jsp的page指令中isELIgnored="true";

    如果两个配置相互矛盾,则JSP的page指令优先;

    效果:如果禁用EL后,继续使用EL,则会当做普通文本,即如果${requestScope.aaa}则输出:“${requestScope.aaa}”

     是否禁用EL总结表

     

     <el-ignored>  isELIgnored  是否忽略EL表达式
     未指定  未指定  不忽略
     false  未指定  不忽略
     true  未指定  忽略
     false  false  不忽略
     false  true  忽略
     true  false  不忽略


     

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    我大学时代的好朋友要结婚了!
    (function(root,factory){})(this,function($){}) 一个立即执行的匿名函数自调
    非书面的非官方的常见的HTTP请求状态码分析
    一个页面多个HTTP请求 页面卡顿!
    requestAnimationFrame Web中写动画的另一种选择
    js 点击 返回顶部 动画
    css3动画 一行字鼠标触发 hover 从左到右颜色渐变
    var 和 let 的异同?
    H5案例分享:使用JS判断客户端、浏览器、操作系统类型
    基于浏览器的HTML5地理定位
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058364.html
Copyright © 2011-2022 走看看