博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSP/Servlet(三)
阅读量:7189 次
发布时间:2019-06-29

本文共 12448 字,大约阅读时间需要 41 分钟。

JSP脚本中的9个内置对象:

  JSP脚本中包含了9个内置对象,这9个内置对象都是Servlet API接口的实例(可以直接使用)。

  JSP内置对象的实质:他们要么是_jspService()方法的形参,要么是_jspService()方法的局部变量,所以在

JSP脚本中调用这些对象,无须创建它们。

application 对象

  application是javax.servlet.ServletContext的实例。代表JSP所属的Web应用本身,可用于JSP页面,或者

在Servlet之间交换数据。

  对于application通常有如下两个作用:

  >在整个Web应用的多个JSP、Servlet之间共享数据。

  >访问Web应用的配置参数。

1、让多个JSP、Servlet共享数据

  application 通过 setAttribute(String attrName , Object value)方法将一个值设置成application的attrName属性

该属性的值对整个Web应用有效,该Web应用的每个JSP页面或Servlet都可以通过getAttribute(String attrName)来访问

该属性。

  实例:

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>    application_setAttribute test   <%! int i ; %> <%         application.setAttribute("count", String.valueOf(++i)) ; %> <%= i %>  

 

 

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>    application_getAttribute test   <%=application.getAttribute("count") %>  

 

  application不仅可以用于两个JSP页面之间的共享数据,还可以用于JSP和Servlet之间共享数据。

  注意:不要仅为了JSP、Servlet共享数据就将数据库放入application中,通常只应该把Web应用的状态数据放入application里。

2、获得Web应用配置参数。

  application还可以获取Web应用的配置参数。如下代码:

  

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %>    application test   <% //        从配置中获取参数 String driver = application.getInitParameter("driver") ; String url = application.getInitParameter("url") ; String user = application.getInitParameter("user") ; String pass = application.getInitParameter("pass") ; //        注册驱动         Class.forName(driver) ; //        连接数据库         Connection conn = DriverManager.getConnection(url, user, pass) ;         Statement stmt = conn.createStatement() ;         ResultSet rs = stmt.executeQuery("select * from student_table ") ; %> 
<% while(rs.next()) {
%>
<% } %>
<%=rs.getString("student_id") %> <%=rs.getString("student_name") %> <%=rs.getString("java_teacher") %>

  

  使用application的getInitParameter(String paramName) 来获取Web应用的配置参数,这些参数应该在web.xml文件中。

同时web.xml文件中使用context-param元素配置,每一个<context-param.../>元素配置一个参数。该元素有如下两个子元素。

  >param-name:配置Web参数名。

  >param-value:配置Web参数值。

  格式如下:

  <context-param>

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

    <param-value> com.mysql.jdbc.Driver </param-value>

  </context-param>

 

config 对象:

  config 是javax.servlet.ServletConfig的实例,该实例代表JSP的配置信息。常用的方法有:

  getInitParameter(String paramName)和getInitParameternames() 等。由于JSP页面通常无须配置,因此也就不存在配置信息。

  所以在JSP页面中较少使用,但在Servlet中则用处相对较大。

exception对象:

  exception是Throwable的实例,代表JSP脚本中产生的异常和错误,是JSP页面异常机制的一部分。

  exception对象仅在异常处理页面才有效,即isErrorPage为true时。

out对象:

  out对象代表一个页面的输出流,通常用于在页面上输出变量值及常量。

  

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %>    application test   <% //        从配置中获取参数 String driver = application.getInitParameter("driver") ; String url = application.getInitParameter("url") ; String user = application.getInitParameter("user") ; String pass = application.getInitParameter("pass") ; //        注册驱动         Class.forName(driver) ; //        连接数据库         Connection conn = DriverManager.getConnection(url, user, pass) ;         Statement stmt = conn.createStatement() ;         ResultSet rs = stmt.executeQuery("select * from student_table ") ; %> 
<% while(rs.next()) { //输出表格行 out.println("
") ; out.println("
") ; out.println("
") ; } %>
") ; out.println(rs.getString("student_id")) ; out.println("

 

  out负责输出页面表格及所有内容。

  注意:所有使用out的地方,都可使用输出表达式来代替。<%=...%>的本质就是out.write(...)。

pageContext对象:

  pageContext是javax.servlet.jsx.PageContext的实例,这个对象代表页面上的上下行,

  该对象主要用于访问JSP之间的共享数据。使用pageContext()可以访问page、request、session、application范围的变量。

它提供了如下两个方法来访问变量:

  >getAttribute(String name) :取得page范围内的name属性。

  >getAttribute(String name , int scope):取得指定范围内的name属性,

   其中scope可以是下面几个值。

      > PageContext.PAGE_SCOPE :对应与page范围。

      > PageContext.REQUEST_SCOPE :对应与request范围。

      > PageContext.SESSION_SCOPE :对应与session范围。

      > PageContext.APPLICATION_SCOPE :对应与application范围。

  与getAttribute()方法相对应,PageContext也提供了两个setAttribute()方法。用于将指定变量放入四个范围内。

  pageContext还可用于获取其他内置对象,pageContext对象包含如下方法

  > ServletRequest getRequest() :获取request对象。

  > ServletResponse getResponse() :获取response对象。

  > ServletConfig getServletConfig() :获取application对象。

  > ServletContext getServletContext() : 获取application对象。

  > HttpSession getSession() : 获取session对象。

request对象:

  每一个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取

请求参数的重要途径。

  1、获取请求头/请求参数

  (web应用是请求/响应架构的应用,浏览器发送请求时通常会附带一些请求,还可能包含一些请求参数发送给服务器,

  服务器端负责解析请求头/请求参数的就是JSP或Servlet,而JSP和Servlet取得请求参数的途径就是request。)

  request是HttpServletRequest接口的实例,它提供了如下的几个方法来获取请求参数。

  >String getParameter(String paramName) :获取paramName请求参数的值。

  >Map getParameterMap() : 获取所有请求参数名和参数值组成Map对象。

  >Enumeration getParameterNames() :获取所有请求参数名所组成的Enumeration对象。

  >String[] getParameterValues(String name) :paramName请求参数的值,当参数有多个值的时候,该参数方法返回多个参数值。

  

  HttpServletRequest提供了如下方法来访问请求头:

  >String getHeader(String name):根据指定请求头的值。

  >Enumeration<STring> getHearderNames() :获取所有请求头的名称。

  >Enumeration<STring> getHearders(String name) :获取请求头的多个值。

  >int getIntHeader(String name):获取指定请求头的值,并将该值转化为整数值。

 

  客户端发送参数通常分为两种情况:

  GET方式请求:GET方式的请求会将请求参数的名和值转换成字符串,并附加在原URL之后,且GET请求传送的数据量比较小。

  POST方式请求:通常使用提交表单的方式来发送,且需要在form元素的method属性设置为post。POST请求传输的数据量总

          GET传输的数据量大。

  

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>    收集参数   
姓名:

性别:
男:
女:

年龄:

最喜欢的颜色:
红:
绿:
蓝:

博客:

来自的国家:

 

View Code
<%@page import="java.util.Enumeration"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 获取请求参数/请求头 <% //获取所有请求头的名称: Enumeration
headerNames = request.getHeaderNames() ; while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement() ; //获取每个请求、以及其对应的值 out.println(headerName + "-->" + request.getHeader(headerName)+"
") ; } out.println("

") ; //设置解码方式 request.setCharacterEncoding("UTF-8") ; //下面一次获取表的单体值 String name = request.getParameter("name") ; String gender = request.getParameter("gender") ; String age =request.getParameter("age") ; //如果某个参数有多个值,将使用该方法获取多个值 String[] color = request.getParameterValues("color") ; String blog = request.getParameter("blog") ; String national = request.getParameter("country") ; %>
名字:<%=name %>

性别:<%=gender %>

年龄:<%=age %>

blog:<%=blog %>

喜欢的颜色:<%for (String c : color){out.println(c + " ");} %>

国家:<%=national %>

  2、操作request范围的属性

  HttpServletRequset还包含如下两个方法,用于设置和获取request范围的属性。

  >setAttribute(String serName , Object attValue): 将attValue设置成request范围的值。

  >Object getAttribute(String attName) : 获取request范围的属性。

  当forward用户请求时,请求的参数和请求属性都不会丢失,即forward动作还是原来的请求,并没有在此向服务器发送请求。

  3、执行forward或include

  request还有一个共能就是执行forward和include,也就是代替JSP所提供的forward和include动作指令。

  HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path就是forward或者include的目标路径。

  该方法返回RequestDispatcher,该对象提供了如下的两个方法。

  >forward(ServletRequest request , ServletResponse respone) ;  执行forward 。

  >include(ServletRequest request , ServletResponse respone) ; 执行include .

  例子:  getRequestDispatcher("/a.jsp").include(request, response) ; 

 

  注意:使用request的getRequestDispathcher(String path)方法时,path字符串必须以斜线开头。

response对象:  

  response 代表服务器对客户端的响应。大部分时候,程序无须使用respone来响应客户端请求,

因为有个更简单的响应对象——out,代表页面的输出流。

  由于out无法输出非字符串(out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流),所以当需要在JSP页面中动态的

生成一幅位图、或者输出一个PDF文档,则必须使用response作为响应输出。

  1、response响应生成非字符串响应。

  img.jsp:

View Code
<%-- 通过contentType 指定响应的数据是图片 --%> <%@ page language="java" contentType="image/jpeg" %> <%@ page import = "java.io.*,java.awt.*,javax.imageio.*,java.awt.image.*" %> <% //建立一个BufferedImage对象     BufferedImage image = new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB) ; //通过Image对象获得一个Graphics对象     Graphics graphics = image.getGraphics(); //使用Graphics画图,所画的图像,将会出现在image对象中。     graphics.fillRect(0,0,400,400) ; //设置成红色     graphics.setColor(new Color(255,0,0)) ; /*         画弧线 public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)     参数:         x - 要填充弧的左上角的 x 坐标。         y - 要填充弧的左上角的 y 坐标。         width - 要填充弧的宽度。         height - 要填充弧的高度。         startAngle - 开始角度。         arcAngle - 相对于开始角度而言,弧跨越的角度。 */     graphics.fillArc(20,20,100,100,30,120) ; //设置成绿色     graphics.setColor(new Color(0,255,0)) ;     graphics.fillArc(20,20,100,100,150,120) ; //设置成蓝色     graphics.setColor(new Color(0,0,255));     graphics.fillArc(20,20,100,100,270,120) ; //设置成黑色     graphics.setColor(new Color(0,0,0)) ; /*         设置字体。 public abstract void setFont(Font font)         将此图形上下文的字体设置为指定字体。使用此图形上下文的所有后续文本操作均使用此字体。         Font(String name, int style, int size)                      根据指定名称、样式和磅值大小,创建一个新 Font。 */     graphics.setFont(new Font("Arial Black" , Font.PLAIN , 16)) ; //画出三个字符串     graphics.drawString("red", 50,50);     graphics.drawString("green", 20,80);     graphics.drawString("blue", 80,80);     graphics.dispose() ; //将图象输出到页面的响应     ImageIO.write(image, "jpg", response.getOutputStream()) ; %>

  在标签中使用<img src = "img.jsp"> 便可以显示出上面代码的图片。实例:网页上的图形验证码功能。同时使用response生成PDF文件、Excel文件等等。

  2、重定向

  重定向是response的另外一个用处,与forward不同的是,重定向会丢失所有的请求数据,包括request范围的属性。

  HttpServletRespone提供了一个sendRedirect(String path)方法,重定向到path资源,即重新向path资源发送请求。

  其中,与forward的区别如下:

转发(forward) 重定向(redirect)

     执行forward后依然是上次请求。

     执行redirect后是第二次请求。

     forward的目标页面可以访问原请求的请求参数,因为依然是同一次

请求,所有原请求的请求参数、request范围的属性全部都存在。

     全部丢失。
     地址中的URL不会改变      改变

  3、增加Cookie

  response对象提供了如下方法来增加Cookie。

  void addCookie(Cookie cookie):增加Cookie。

  增加Cookie之前,必须创建Cookie对象。增加步骤如下:

  1、创建Cookie实例,Cookie的构造器为Cookie(String name , String value).

  2、设置Cookie的生命期限。

  3、向客户端写Cookie。

 

  

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>    增加Cookie   <% //获取请求参数 String name = request.getParameter("name") ; //以获取的请求参数为值,创建一个Cookie对象         Cookie cookie = new Cookie("useName" , name) ; //设置Cookie的生存期限         cookie.setMaxAge(24*3600) ; //向客户端增加Cookie对象         response.addCookie(cookie) ; %>  

 

  访问客户端Cookie使用request对象,request对象使用了getCookie()方法,该方法将返回客户端机器上所有Cookie组成数组,

遍历该数组的每一个元素,找到希望可以访问的Cookie即可。

 

 

session对象:

  session是javax.servlet.http.HttpSession 的实例 , 该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端

关闭浏览器时,会话结束。

  session通常用于跟踪用户的会话信息,session范围内的属性可以在多个页面的跳转之间共存。

  >setAttribute(String attName , Object attValue) :设置session 范围内attName属性的值为attValue 。

  >getAttribute(String attName):返回session范围内attName属性的值。

    

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>    商品列表   
书籍:
电脑:

 

View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ page import = "java.util.*" %> <% //取出session范围的ItemMap属性     Map
itemMap = (Map
)session.getAttribute("itemMap"); //如果Map对象为空,则初始化Map对象 if(itemMap == null) {
itemMap = new HashMap
() ; itemMap.put("书籍", 0) ; itemMap.put("电脑", 0) ; } //获取上一个页面的请求参数 String[] buys = request.getParameterValues("item") ; //遍历数组的各元素 for(String item : buys) {
if(item.equals("book")) {
int num = itemMap.get("书籍").intValue() ; itemMap.put("书籍", num + 1) ; } else if(item.equals("compute")) {
int num = itemMap.get("电脑").intValue() ; itemMap.put("电脑", num + 1) ; } } //将itemMap对象放到设置成session范围的itemMap属性 session.setAttribute("itemMap", itemMap) ; %>
购物车 您购买的商品:
书籍:<%=itemMap.get("书籍") %>本
电脑:<%=itemMap.get("电脑") %>台

再次购买

  

转载地址:http://arukm.baihongyu.com/

你可能感兴趣的文章
windows系统安装redis
查看>>
分布式轻量级框架 设计&实现 3 - 定义基础包
查看>>
今天的上课感受
查看>>
apps被拒绝的各种理由以及翻译
查看>>
Thinking in Java 笔记
查看>>
注册IOS企业/公司开发者账号流程
查看>>
How to fix libtool: Version mismatch error
查看>>
HCDN——CDN+P2P融合技术-秦建华
查看>>
周兴社-可穿戴计算与健康服务
查看>>
UITextView for Code
查看>>
AlertPickerView
查看>>
ISColumnsController
查看>>
部分JVM参数解释
查看>>
mysql优化技巧
查看>>
java 里关于二叉树排序的问题
查看>>
每天一个linux命令(13):less 命令
查看>>
ios项目常用目录分包结构
查看>>
ThinkPHP中的动态缓存(S方法)和快速缓存(F方法)
查看>>
GoLang练习实例100之006----斐波那契数列
查看>>
富文本编辑器焦点
查看>>