java笔记2---jsp

概念

jsp是一种简化的servlet

有人说servlet是java里面嵌入html,jsp是html里面嵌入java。那他的历史到底是什么样的?

java用servlet实现了web模式,在浏览器和数据库之间加入了一个servlet容器来响应用户的请求,并读取数据库中的数据。但是servlet要输出html就非常麻烦,需要使用system.println一句句的打印。因此出现了jsp,它是一种特殊的servlet,其实理论上讲还是在java中写html代码,但是只不过书写方式让用户觉得更多的像是在写html。

jsp的生命周期

jsp是特殊的servlet,因此它的生命周期和servlet很相似

Paste_Image.png

jsp页面

Paste_Image.png

转移为servlet

Paste_Image.png

其实HttpJspBase是继承HttpServlet类的,这一下子就明白了吧

Paste_Image.png

带下划线的函数_jspInit()是由系统自己生成的,程序员不能自己修改,那如果我们要设置一些初始化代码怎么办?这就是jspInit()函数存在的意义,我们可以在代码中重写这个初始化函数。jspDestroy()同理。

当浏览器访问一个jsp页面的时候,jsp引擎会首先会检查该页面是否需要编译?如果这个页面没有被编译过,或者说它又有新的更新,该页面就需要被编译了!(jsp是一种特殊的servlet,servlet又是一个class,因此要运行它也需要编译)这需要3步骤就可以了:

  1. 分析jsp页面
  2. 转换jsp页面成为servlet
  3. 编译这个servlet

可以通过查看jsp编译后的.java文件来解决一下bug,具体的位置如下
F:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\demo\org\apache\jsp,这是windows系统,其他系统只要找到workspace就可以了

语法(jsp有3大指令,7种常用动作标签, 9种内置对象)

  • 指令
    • page
    • include
    • taglib
  • 动作标签
    • jsp:forward 执行页面转向
    • jsp:param 用于传递参数
    • jsp:include 在页面被调用的时候引入一个jsp文件
    • jsp:plugin 用于下载javaBean或applet到客户端执行
    • jsp:useBean 使用javaBean
    • jsp:setProperty 修改javaBean实例的属性值
    • jsp:getProperty 获取javaBean实例的属性值
    • jsp:element 动态的定义xml元素
    • jsp:attribute 动态定义xml元素的属性
    • jsp:body 动态定义xml元素的主体
    • jsp:text 用jsp页面或者文档生成模版内容
  • 内置对象
对象名 对象的类型 作用范围
pageContext javax.servlet.jsp.PageContext Page
page javax.servlet.jsp.HttpJspPage Page
request javax.servlet.jsp.HttpServletRequest Request
response javax.servlet.jsp.HttpServletResponse Page
session javax.servlet.jsp.HttpSession Session
application javax.servlet.jsp.ServletContext Application
out javax.servlet.jsp.JspWriter Page
config javax.servlet.jsp.ServletConfig Page
exception javax.servlet.jsp.ThrowAble Page
  • 其他
    • <% 代码 %> 对应_jspService()函数体
    • <%=表达式 %>对应_jspService()函数里的输出语句
    • <%! 声明 %>对应声明类的方法和属性
    • <%-- 注释 --%>
    • jsp是可以用使用java的流程控制语法的(if/else,do...while,switch)

指令详解

命令 描述
<%@ page ... %> 定义一些页面需要依赖的属性,例如脚本语言,错误页面,缓存
<%@ include ... %> 在编译阶段包含一个文件,包含源代码
<%@ taglib ... %> 声明一个标签库,包含页面中常用的行为
  • page指令

该指令可以指定的属性是:

属性 目的
buffer 指定流输出的缓存
autoFlush 控制servlet输出缓存的行为
contentType 定义字符编码
errorPage 定一个独立的jsp错误报告页面
isErrorPage 判断当前页面是否为错误报告页面
extends 继承于哪个servlet
import 指定一个需要导入的packages或者classes列表
info 定义一个字符串,可以被servlet的getServletInfo函数访问
isThreadSafe 是否为servlet的线程模型
language 声明该页面使用的是jsp语言
session 声明该页面是否启动session
isELIgnored 声明是否会屏蔽EL表达式
isScriptingEnabled 判定脚本元素是否会被使用
  • include指令

<%@ include file="relative url">

  1. 可以在任何地方使用指令
  2. file是相对地址
  3. 最重要的!!这里是包含file的内容,也就是把代码包含进来!
  • taglib指令

taglib是自定义标签功能,也就是自己定一个jsp标签,uri是定义标签库文件的位置,库文件是一个.tld文件,声明了标签的名字和实际代码位置

<taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>myTag</shortname>  
      <tag>
          <name>hello</name>
          <tagclass>mytag.HelloWorldTag</tagclass> 
         <bodycontent>empty</bodycontent>
     </tag>
</taglib>

其中mytag.HelloWorldTag是一个类

package mytag;  
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloWorldTag extends TagSupport{
      public int doStartTag() throws JspTagException{
          return EVAL_BODY_INCLUDE;
      }
      public int doEndTag() throws JspTagException{
      try{
              pageContext.getOut().write("Hello World");
          } catch (IOException ex){
               throw new JspTagException("Error!");
          }
      return EVAL_PAGE;
      }
}

然后在jsp页面中调用的方式:

<%@ tablib uri="uri" prefix="自定义标签名称" >

行为

  • 必要属性

    • Id属性
      行为的ID标示,jsp代码可以通过行为的id,引用行为所对应的对象
    • Scope属性
      有四个值可选:page,request,session,application。分别代表这个行为的生命周期
  • include动作:<jsp:include page="relative URL" flush="true" />
    include动作和include指令不一样,指令是包含代码,而动作时包含输出的内容

  • useBean动作:<jsp:useBean id="myBean" class="package.class" />
    javaBean是一种特殊的类,这里相当于实例化javaBean,如果想设置javaBean中的属性,可以使用方法jsp:getProperty和jsp:setProperty

  • setProperty动作:<jsp:setProperty name="myBean" property="xxx" value="xxxx" />
    该动作需要javaBean已经被创建,可以通过四种方式来调用该行为为javaBean属性赋值:

    1. <jsp:setProperty name="myBean" property="*" />
      这种是client的表单项和javaBean的属性一一对应,通过该方法,所以javaBean属性被一次性赋值
    2. <jsp:setProperty name="myBean" property="xxx" />
      只赋值一个属性(xxx),这个属性对应的表单元素是xxx
    3. <jsp:setProperty name="myBean" property="xxx" value="hello world" />
      给javaBean的属性xxx赋值为hello world
    4. <jsp:setProperty name="myBean" property="xxx" param="yyy" />
      表单字段不一一对应,可以用yyy表单元素给xxx属性赋值
  • getProperty行为:<jsp:getProperty name="myBean" property="xxx" />
    没啥可说的...

  • forward行为:<jsp:forward page="Relative URL" />
    这里是内部转发,类似于request.getRequestDispatcher("Relative URL").forward(request.response)

  • plugin行为 <jsp:plugin>
    官方解释:该行为用来给jsp页面插入一段java组件,这个组件可以是Applet或者JavaBean。这里常用的就是Applet,以下是一段知乎关于Applet的描述:

Java Applet出现于1996年,那时候的浏览器也出现不久,还只能支持静态页面,因此Applet技术出现了,来解决:动画动态内容与服务器的通讯富客户端应用但是Flash技术出现后,Applet技术没有竞争过Flash,Flash在动画和与服务器的通讯方面(Flex)都能满足。后来出现了Ajax,JavaScript可以和服务器通讯了。再后来出现HTML5技术(包括HTML 5/CSS 3/JavaScript)引入了音频,视频,2D图形(Canvas),以及WebGL引入了3D图形。HTML 5技术替代了Flash技术的地位。

其他的行为不经常使用,请查询手册。

内置对象

  • request对象
    有很多可用的函数

    • Cookie[] getCookies()
    • HttpSession getSession()
    • Object getAttribute(String name)
    • String getContentType()
    • String getContextPath()
    • String getParameter(String name)
    • ...还有很多,看手册吧
  • response对象

    • void addCookie(Cookie cookie)
    • void flushBuffer()
    • void sendRedirect(String location)
    • ...

cookie

  • 写cookie
    三步骤:
    1. 创建cookie对象
    2. 设置生存时间
    3. 保存cookie至response header
<%
   // Create cookies for first and last names.      
   Cookie firstName = new Cookie("first_name",
              request.getParameter("first_name"));
   Cookie lastName = new Cookie("last_name",
              request.getParameter("last_name"));

   // Set expiry date after 24 Hrs for both the cookies.
   firstName.setMaxAge(60*60*24); 
   lastName.setMaxAge(60*60*24); 

   // Add both the cookies in the response header.
   response.addCookie( firstName );
   response.addCookie( lastName );
%>

  • 读取cookie
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Get an array of Cookies associated with this domain
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Found Cookies Name and Value</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
         out.print("Name : " + cookie.getName( ) + ",  ");
         out.print("Value: " + cookie.getValue( )+" <br/>");
      }
  }else{
      out.println("<h2>No cookies founds</h2>");
  }
%>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易...
    安安静静写代码阅读 1,078评论 0 8
  • 写后记:2017/11/22最近因为吉趣项目需要做校园网的课表、成绩查询功能,不得不使用模拟请求,去请求uims教...
    大海画家阅读 1,236评论 0 2
  • 一、jsp定义及作用 JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网...
    yzw12138阅读 1,222评论 0 0
  • 什么是jsp? 很久之前,我们的网页都是静态的,就是我们所看到的页面在编写好之后总是唯一的。后来有人便提出动态页面...
    ezsync小智阅读 1,492评论 0 13
  • 第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异...
    fuyou2324阅读 3,163评论 3 89