欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入理解JavaWeb开发中的JSP内置对象

最编程 2024-08-11 09:46:48
...

 【声明】 

欢迎转载,但请保留文章原始出处→_→ 

生命壹号:http://www.cnblogs.com/smyhvae/

文章来源:http://www.cnblogs.com/smyhvae/p/4065790.html

 

【系列】JSP学习系列文章:(持续更新)

JavaWeb学习(一)----JSP简介及入门(含Tomcat的使用)

JavaWeb学习(二)----JSP脚本元素、指令元素、动作元素

JavaWeb学习(三)----JSP内置对象详解

 

【正文】

呼~~~花了一下午的时间,终于把JSP的内置对象的内容学完了,并做好了笔记,方便以后回顾。

今天是10月的最后一天,小小地总结一下吧,这个月共发表博客25篇(排版好麻烦的说),所有内容均由生命壹号本人敲键盘码起。基本是一天一篇,包括国庆的时候也是独霸教研室在学习,学习的大致内容也是和数据库、JavaWeb有关。毕竟以后搞开发不可能是单机吧,网络的部分是多么的重要。下个月要提高学习效率,学习任务要加大,争取早日进入工程实践,嘿嘿~~~

菜鸟加油,恩,说我自己呢!

骚年矜持,恩,在说你咧!

一、内置对象介绍

JSP内置对象:可以不用声明和创建,就可以直接在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量。

那为什么不用生命和创建就可以直接使用呢?这是因为,内置对象必须由支持JSP的容器去创建。例如Tomcat就是一个容器。

JSP共有以下9大内置对象:

  • out
  • request
  • response
  • session
  • pageContext
  • application
  • config
  • page
  • exception

前四个是重点,后五个了解即可。这九个内置对象中,有四个作用域:request、session、application、page。作用域即这个对象的生命周期的范围。

 

二、内置对象out

类型:Javax.servlet.jsp.JspWriter

作用:主要用来向客户端输出数据

作用域:page。也就是说,每个页面都有一个自己的out对象。

重要方法:print()/println()/write()    向客户端页面输出数据

举例:

out.write("文字内容"); 

我们再到D:\apache-tomcat-8.0.14\work\Catalina\localhost目录中去看一下生成的Java源代码:

完整版代码如下:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.0.14
 * Generated at: 2014-10-31 11:14:54 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}

    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,
                  null, 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\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");

    out.println("文字内容");

      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
View Code

在这里,我们可以这样理解,一个Jsp文件编译之后就是一个类,而out就对应一个页面对象。

 

三、内置对象request

类型:Javax.servlet.http.HttpServletRequest

描述:来自客户端的请求经Servlet容器处理后,由request对象进行封装。注:客户端和服务器的一次通信就是一次请求(发送请求或得到相应)。

作用域:request。说明,这次请求结束后,它的生命周期 就结束了。

重要方法:

getParameter(key) 获取提交表单的数据

getParameterValues(key) 获取提交表单的一组数据

request.getRequestDispatcher("list.jsp").forward(request,response) 转发(通过代码的方式进行转发)

request.setAttribute(key,object) 设置请求对象的属性

request.gettAttribute(key) 获取请求对象的属性

request.setCharacterEncoding("UTF-8") 对请求数据重新编码 

我们接下来将每个方法都介绍一下。

(1)getParameterValues(key)    获取提交表单的数据

举例:输入用户名密码,并验证正确性。

新建JavaWeb工程Test04,新建request.jsp文件,代码如下:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="request-receiver.jsp">
11         username:<input  type="text" name="user"/><br/>
12         password:<input  type="password" name="pwd"/><br/>
13         
14         <input type="submit" name="登陆"/>        
15     </form>
16 </body>
17 </html>

10至15行:添加表单,在里面输入用户名密码,然后将数据发送至request-receiver.jsp页面来处理(第10行的action里面的内容)。

新建request-receiver.jsp文件:

 1 <%
 2 //获取请求数据
 3 String name = request.getParameter("user");
 4 String pwd = request.getParameter("pwd");
 5 System.out.println(name+","+pwd);
 6 
 7 if("smyh".equals(name) && "007".equals(pwd)) {
 8     out.println("登陆成功");    
 9 }else{
10     out.println("errors");
11 }
12 %>

像request-receiver.jsp这样的页面,如果不需要显示在网页上,可以把自动生成的html代码全部删除。

整个过程是这样的:

运行程序,当我们在网页输入正确的用户名之后,效果如下:

然后点击“提交”,效果如下:

【乱码问题的解决】

显然我们已经登录成功了,但是这里出现了乱码。原因是:Tomcat默认编码为:iso8859-1。request.jsp页面发出去的数据是UTF-8编码,经过tomcat服务器后,变成了iso8859-1编码,所以需要在request-receiver.jsp将数据再转回来,变成UTF-8编码(这个问题涉及到另外一个内置对象,稍后再讲)。

另外一个问题是,如果我们输入的是中文的用户名,也可能出现乱码,可以在request-receiver.jsp文件里,加一句代码让用户名、密码在控制台输出显示,看一下就知道了。

为解决乱码的问题,我们需要在request-receiver.jsp文件中加一句话:

//设置请求方式的编码

request.setCharacterEncoding("UTF-8");

这样的话,就将获取到的数据改为了UTF-8编码。

此时,如果在控制台输出的用户名还出现乱码,是因为还涉及到了另外一个问题:在request.jsp中发送请求,默认是采用get方式,这个时候,参数就会作为url的一部分一起发给服务器(见上方图片中的url地址)而url的编码很显然不是UTF-8。所以,我们需要将其改为post方式。总而言之,完整版代码如下:

request.jsp:输入用户名密码,并提交给request-receiver.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="request-receiver.jsp" method="post">
11         username:<input  type="text" name="user"/><br/>
12         password:<input  type="password" name="pwd"/><br/>
13         
14         <input  type="submit" name="登陆"/>        
15     
16     </form>
17 </body>
18 </html>

第10行,将提交方式改为post,而非默认的get方式。

request-receiver.jsp:验证用户名、密码的正确性

 1 <%
 2 //获取请求数据
 3 //设置请求方式的编码
 4 request.setCharacterEncoding("UTF-8");
 5 String name = request.getParameter("user");
 6 String pwd = request.getParameter("pwd");
 7 System.out.println(name+","+pwd);
 8 
 9 if("smyh".equals(name) && "007".equals(pwd)) {
10     out.println("登陆成功");    
11 }else{
12     out.println("errors");
13 }
14 %>

第4行,将获取到的请求数据还原为UTF-8的方式。

(2)getParameterValues(key)    获取提交表单的一组数据

我们现在往request.jsp中添加一组单选按钮:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="request-receiver.jsp" method="post">
11         username:<input  type="text" name="user"/><br/>
12         password:<input  type="password" name="pwd"/><br/>
13         <input type="checkbox" name="likes" value="羽毛球">羽毛球
14         <input type="checkbox" name="likes" value="摄影">摄影
15         <input type="checkbox" name="likes" value="音乐">音乐
16         <br/>
17                 
18         <input  type="submit" name="登陆"/>        
19     
20     </form>
21 </body>
22 </html>

13至15行是添加的三个单选按钮,构成了数组“likes”。

然后在request-receiver.jsp中获取这个数组,并在控制台输出:

 1 <%
 2 //获取请求数据
 3 //设置请求方式的编码
 4 request.setCharacterEncoding("UTF-8");
 5 String name = request.getParameter("user");
 6 String pwd = request.getParameter("pwd");
 7 System.out.println(name+","+pwd);
 8 
 9 String[] likes = request.getParameterValues("likes");
10 for(int i =0;i<likes.length;i++) {
11     System.out.println(likes[i]);
12 }
13 
14 if("smyh".equals(name) && "007".equals(pwd)) {
15     out.println("登陆成功");    
16 }else{
17     out.println("errors");
18 }
19 %>

运行后,输入对应值:

后台输出如下:

(3)request.getRequestDispatcher("list.jsp").forward(request,response)   转发(通过代码的方式进行转发)

(4)request.setAttribute(key,object)   设置请求对象的属性

(5)request.gettAttribute(key)    获取请求对象的属性

现在的情形是,request.jsp负责发数据,request-receiver.jsp负责处理数据(判断用户名密码的正确性),如果用户名密码正确,那我们就通过request.getRequestDispatcher(request-success.jsp),将请求转发给request-success.jsp页面,显示出“登陆成功”的效果。

request.jsp代码不变:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="request-receiver.jsp" method="post">
11         username:<input  type="text" name="user"/><br/>
12         password:<input  type