JSP内置对象



JSP内置对象
*/
1.掌握JSP中的9个内置对象及对应的操作接口。
2.掌握JSP中的4种属性范围及属性操作。
3.掌握 request、response、session、application、pageContext这些常用内置对象的使用。
4.了解session与Cookie的操作关系。
5.了解web安全性及config对象的使用。
6.可以使用内置对象并结合之前的JSP基础语法,完成简单的程序开发。
7.在jsp中为了简化用户的开发,提供了9个内置对象,这些内置对象将由容器为用户进行实例化,用户直接使用即可,而不用像在java中那样,必须通过关键字new进行实例化对象后才可以使用。
8.内置的9个对象比较常用的是pageContext、request、response、session、application,掌握这5个内置对象,即可进行程序开发。
注意:不要只记对象名称,一定要记下对象所对应的类型。在进行开发是,一定会使用doc文档进行类或方法的查询,这时只能通过类型找到方法。例如,要想知道request对象有哪些方法,一定要查询javax.servlet.http.HttpServletRequest才能知道。
9.内置对象概览
–pageContext javax.servlet.jsp.PageContext JSP的页面容器
–request     javax.servlet.http.HttpServletRequest 得到用户的请求信息
–response  javax.servlet.http.HttpServletResponse    服务器向客户端的回应信息
–session     javax.servlet.http.HttpSession            用来保存每一个用户的信息
–application javax.servlet.ServletContext              表示所有用户的共享信息
–config      javax.servlet.ServletConfig               服务器配置,可以取得初始化参数
–out         javax.servlet.jsp.JspWriter               页面输出
–page        java.lang.Object                          表示从该页面中表示出来的一个Servlet实例
–exception   java.lang.Throwable                       表示JSP页面所发生的异常,在错误页中才起作用

10.四种属性的范围
在JSP中提供了4种属性的保存范围。所谓的属性保存范围,指的就是一个内置的对象,可以在多少个页面中保存并继续使用。
 –page:只是在一个页面中保存属性,跳转之后无效
 –request:只是在一次请求中保存,服务器跳转后依然有效。
 –session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
 –application:在整个服务器上保存,所有用户都可以使用。
 11.关于属性范围的理解。对于这四种属性范围,读者现在只需要知道其操作的特点即可,而具体的应用要结合后面的实例和标准的设计模式才能有更好的领悟。
12以上的四个内置对象都支持下面三个属性操作方法
   –public void setAttribute(String name,Object o)  设置属性的名称及内容
   –public Object getAttribute(String name)  根据属性名称取得属性
   –public void removeAttribute(String name) 删除指定的属性
13.page属性范围(pageContext)
page属性范围(使用pageContext表示,但是一般都习惯与将这种范围称为page范围),表示将一个属性设置在本页上,跳转之后无法取得。
14.request属性范围
如果在服务器跳转后想让属性继续保存下来,则可以使用request属性范围操作。request属性范围表示在服务器跳转后,所有设置的内容依然会被保留下来。
request在一次服务器跳转范围内有效,如果换成超链接,则无法取得request属性的。
15.关于request属性范围的理解
request表示客户端的请求。正常情况下,一次请求服务器只会给一次回应,那么这时如果是服务器端跳转,请求的地址栏没有改变,所以也就相当于回应了一次;而如果地址栏改变了,就相当于是发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。
request属性范围一般在MVC设计模式上应用较多
16.session属性范围
如果希望一个属性在设置后,可以在任何一个与设置页面相关的页面中取得,则可以使用session属性范围,使用session设置属性后,不管是客户端还是服务器跳转,只要设置了就都可以取得。
但是,此时如果再打开一个浏览器直接访问取出页,则无法取得设置的session属性。
17.每一个新的浏览器连接上服务器后就是一个新的session。每一个浏览器连接到服务器后,实际上都表示各自的session,表示每一位不同上网者都有各自的属性,所以新的浏览器打开后无法取得其他session设置的属性。
18.application属性范围
如果希望设置一个属性,可以让所有用户(每一个session)看得见,则就可以将属性范围设置成application,这样属性即可保存在服务器上
19.注意:application范围的属性设置过多会影响服务器性能。因为application属性范围是将属性设置到一个服务器中,所以,如果设置过多的话,则肯定会影响服务器性能。
如果服务器重启,则之前所设置的全部属性将消失。
20.可以使用pageContext的 public void setAttribute(String name,Object value,int scope)方法设置属性并指定保存为其他范围。不过很少用

request对象
1.request对象是使用最多的一个对象,其主要作用是接收客户端发送而来的请求信息,如请求的参数、发送的头信息等都属于客户端发来的信息。request是javax.servlet.http.HttpServletRequest接口的实例化对象,表示此对象主要是应用在HTTP协议上。
2.HttpServletRequest是ServletRequest接口的子接口,所以在查找request对象方法时除了要查询HttpServletRequest接口,也要查询ServletRequest接口。
3.为什么不将HttpServletRequest和ServletRequest作为一个接口?从doc文档中发现ServletRequest接口只有HttpServletRequest一个子接口,而HttpServletRequest接口也只继承了ServletRequest接口,为什么不把这两个接口变为一个接口呢?原因是:
这样的设计是为了以后扩展应用。现在java web开发只支持HTTP协议,所以使用HttpServletRequest表示HTTP协议的操作。但是如果以后有新的协议出现呢?呢直接定义一个新的协议的请求接口,但是不管是否是新的协议,需要一些公共的操作,所以就将这些公共的操作作为统一的父接口—ServletRequest存在了。
4.在WEB开发中,交互性是最重要的特点,所以request对象在实际开发中使用的较多。
—public String getParameter(String name)   接收客户端发来的请求参数内容
—public String[] getParameter(String name) 取得客户端发来的一组请求参数内容
—public Enumeration getParameterNames()   取得全部请求参数的名称
—public String getRemoteAddr()      得到客户端的ip地址
—void setCharacterEncoding(String env) throws UnsupportedEncodingException     设置统一的请求编码
—public boolean isUserInRole(String role)   进行用户身份的验证
—public Httpsession getSession()   取得当前的session对象
—public StringBuffer getRequestURL()  返回正在请求的路径
—public Enumeration getHeaderNames()   取得全部请求的头信息的名称
—public String getHeader(String name)  根据名称取得头信息的内容
—public String getMethod()   取得用户的提交方式
—public String getServletPath()   取得访问的路径
—public String getContextPath()   取得上下文资源路径
5.乱码解决
在web开发中,使用request接收请求参数是最常见的操作,但是,在进行参数提交时也会存在一些中文的乱码问题
通过练习可以发现,表单提交后,英文字母可以正常的显示,但是中文却无法正常的显示。之所以会出现这种情况,主要原因是由于浏览器默认的是UTF-8编码,而中文的GBK和UTF-8的编码是不一样的,所以造成了乱码。由于双方的的编码不统一,所以根本就无法沟通。
可以直接通过setCharacterEncoding()方法设置一个统一的编码。
6.现阶段的开发中最好每一个JSP页面都写上编码设置。学习的初期阶段,最好在每一个JSP页面中加上编码设置的操作,这样可以减少乱码问题。同时,还可以使用过滤器进行编码的设置,后面会讲到。
7.接收请求参数
使用request内置对象中的getParameter()方法可以接收一个表单的文本框中输入的内容,那么实际上getParameter()接收的就是一个参数的内容,也就是说文本框的名称就是一个参数的名称,而输入的则是参数的内容。但是这种方式只适合于每次接收一个参数,如果有一组参数(同名参数)传递,则必须使用getParameterValues()方法进行接收。
8.单一的参数都可以使用getParameter()接收,而一组参数要用getParameterValues()接收。在表单控件中,像文本框(text)、单选框(radio)、密码框(password)、隐藏域(hidden)等,一般都会使用getParameter()方法进行接收,因为这些控件在使用是参数的名称都只有一个不会重复;像复选框(checked),一般参数的名称都是重复的,是一组参数,所以只能使用getParameterValues()接收,如果不小心使用了getParameter()方法,则只会接收第一个选中的内容。
9.有可能出现NullPointerException异常。在进行表单参数接收时,如果用户没有输入文本框内容或者没有选择复选框内容,那么使用getParameter()或getParameterValues()接收参数时,返回的内容为null,此时就有可能产生NullPointerException,所以在使用时最好判断接收来的参数是否为null。
10.在WEB开发中,所有参数不一定非要由表单传递过来,也可以使用地址重写的方式进行传递。
  地址重写的格式:
  动态页面地址?参数名称 1=参数内容 1&参数名称 2=参数内容 2&…
request_demo03.jsp?name=Baidu&password=www.baidu.com
11.表单提交的get和post中,一般post提交使用较多。表单上的两种提交方式分别是get和post,但是两者在使用时有一个明显的区别就是:使用get提交时,提交的内容会显示在地址栏之后,这一点与地址重写的格式是一样的;而使用post提交,提交的内容是不会显示在地址栏的。
12.在使用上需要注意表单提交的数据大小问题,因为get请求需要在地址栏上显示信息,所以信息的长度有所限制,一般大小是4-5kb的数据;而post因为不会显示,可以提交更多的内容,如果表单中有一些大文本或者一些图片数据,则只能使用post的方式提交。
13.在request内置对象中还有一个灵活的方法就是getParameterNames(),此方法可以返回所有请求参数的名称,但是此方法返回值的类型是Enumeration,所以需要使用hasMoreElements()方法判断是否有内容以及使用nextElement()方法取出内容。
14.
<input type=”checkbox” name=”**inst” value=”唱歌”>唱歌
复选框的名字前加了两个”**”,主要目的是用于区分不同的参数接收操作。在之前曾经讲解过getParameter()可以接收一个参数的内容,但是如果是复选框,肯定是要同时接收一组参数,所以要使用getParameterValues()方法。因为本程序中是通过getParameterNames()方法取得所有的请求参数名称,而要想通过这些名称再取得具体内容,则必须确定是使用getParameter()还是getParameterValues()方法操作,凡是以”**”开头的都按照数组的形式接收。
15.显示全部的头信息
Java 的Web开发使用的是HTTP协议,主要操作就是基于请求和回应,但是在请求和回应的同时也会包含一些其他信息(如客户端的ip、Cookie、语言等),那么这些信息就称为头信息。
16.从两人的对话理解头信息的作用,关于头信息也可以换种方式理解,就好比两个人要对话一样,虽然主要是对话的内容,但是在这些对话上又需要关注一些其他信息,例如:对话对方是否是正常人或者是能否听懂自己的语言等,那么这些信息实际上是和对话这个操作同时存在的,这些就可以简单地理解为头信息。
17.要想取得头信息的名称,可以直接通过request内置对象的getHeaderNames()方法;而要想取出每一个头信息的内容,则需要使用getHeader()方法。
18.角色验证
在之前讲解Tomcat安装是,用户曾经输入过一个管理员的用户名和密码,实际上就向当于建立了一个管理员的账户。如果现在某些JSP页面需要输入特定的管理员的帐号才能访问,那么就需要进行角色验证,而要进行角色验证就必须使用request内置对象中的isUserInRole()方法完成
19.要想完成用户验证,则首先为Tomcat增加一些新的用户,此操作可以通过修改conf/tomcat-users.xml文件完成,
增加用户:
<user username=”" password=”" roles=”"/>
20.其他操作
在request中也可以取得客户端的ip地址、访问路径信息、提交的方式等。
getMethod(),getRemoteAddr(),getServletPath(),getContextPath()