JSP知识简单概述

11 篇文章 0 订阅

JSP技术:
这个是一个表现层的技术,使用Servlet来生成一个Html内容是比较麻烦的每个输出都需要使用out.println()来实现
JSP当中可以镶嵌HTML代码有JAVA代码
JSP执行的时候会被JSP引擎自动编译,编译后的JSP跟HttpServlet一样都是javax.servlet.Servlet接口的子类,因而其也可以看作是一种Servlet

JSP也是一种Servlet,因而JSP是可以完成HttpServlet能完的所有事情的。
JSP中可以嵌套HTML源代码可读性相对于Servlet来说要好很多,jsp程序也是不需要在web.xml中进行部署的直接访问jsp地址就可以了
JSP工作原理:
JSP是一各上Servlet,它与HttpServlet不同之处在于jsp是先部署上去再编译成为class文件,而Servlet是先编译成为了class字节码再部署到服务器
上去。jsp在第一次访问的时候被编译成为了一个HttpJspPage类(它是一个Servlet子类),这个类存放在服务器临时工作目录当中。
注意jsp会在第一次访问的时候被编译,所以在第一次访问的时候会比较慢,而之后的访问直接编译好的类文件时行响应会显得比较快

JSP生命周期
JSP也是Servlet,运行时只会能一个实例,和Servlet一样,JSP在初始化、销毁的时候也会调用Servlet的init()和destory()方法,JSP也有自己的初始
化和销毁方法_jspInit()和_jspDestory()

JSP语法:
JSP = html+java
HTML部分遵循HTML语法,Java部分遵循Java语法
JSP源代码分为两个部分:模板数据与元素
模板数据:JSP中的HTML代码,它的内容是不会变化的,不会对流程有任何的控制只会影响显示,写的什么就输出什么
元素:java部分,包括脚本(java代码),JSP指令,JSP标签,元素决定了程序的流程

JSP脚本
使用“<%”与“%>”括起来,在这中间的内容必须遵循Java语法,JSP的脚本可以出现在JSP文件的任何地方
在JSP脚本中可以使用out.println()方法来输出,在JSP中也可以使用"<%="与"%>"来实现输出各种类型的数据。

JSP注释
在JSP中在脚中可以用Java的注释
//表示单行注释
/*
表示多行注释
*/
还可以使用一种JSP注释
"<%--"与"--%>"之间的内容是注释内容,这种注释是JSP特有的

JSP的if语句

JSP中可以使用if语句,if语句块中可以包含html代码如果有html代码则在if语句块的前后必须使用"{"和"}"
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>if语句</title>
</head>
<body>
 <%
  String param = request.getParameter("param");
  if("1".equals(param)){
 %>
 参数为1时的html代码块
 <%}
  else if("2".equals(param)){ 
 %>
 参数为2时的html代码块
 <%}
  else {
 %>
   请使用参数param=1,2选择要显示的内容
 <%} %>
</body>
</html>

JSP的for循环
在JSP中可以使用for语句来循环输出内容,也是可以使用while语句的,注意<html>的内容不要写在<%%>这个当中。在<%%>当中写java代码
JSP中的return语句,在<%%>中加上reurtn语句则会忽略后面的所有语句直接结束运行
不要使用System.exit()这种函数会使得tomcat退出
JSP中的break语句,它主要作用是用来跳出一个程序代码块,在代码块外层的代码还是会执行的这是与return不同的return是直接返回

JSP指令:
1,page指令
声明JSP页面属性JSP指令中多个属性可以写在一个page指令中,也是可以写在多个指令里的
也就是说一个JSP文件是可以写多个page指令的
page指令可以写多个但要注意的就是除了import属性外,任何一个属性只能在一个JSP文件中出现一次,属性的名称也是区分大小写的

page指令的常见属性
language:
 它只能取值java,表明了解释JSP文件时采用的语言,默认是java,可以不用写
extends:
 它的取值:任何类的全名,指明编译这个JSP文件时继承哪个类
 注意:JSP是servlet,因而当指明继承普通类的时候要实现Servlet的init、destory等方法
import:
 任何包名、类名,引入这个JSP要用到的类、包等。
 import是唯一一个可以多次声明的page指令的属性
session:
 它的取值:true,false,表明JSP是否内置session对象,如果是true的话则会内置session对象
 注意它的默认值为true
autoFlush:
 它的取值:true,false,表明是否运行缓存,如是查true的话则使用out.println()输出的字符串则不是立刻到达客户端,而是暂时存在缓存当中,只有在
 缓存满了或者是使用了out.flush()操作时才会到达客户端,
 它的默认值是true
buffer:
 它的取值:none 或者是数字+kb,它会指定JSP缓存的大小,这个属性只有在autoFlush为true时才会有效
 <%@ page buffer="100bk"%>
isThreadSafe:
 它的取值:true,false 它表明指定JSP是否是线程安全的
 为true时表示多线程的方式运行JSP
 false:表示一次只运行一个线程
 默认值是true
isErrorPage:
 它的取值true,false 表示这个JSP页面是否是一个错误处理页面
 如果是true则这个JSP页面会内置Exception对象exception,可以直接拿来使用,否则为false时则没有这个异常对象
errorPage:
 它的取值:某个JSP页面的相对路径 表明一个错误显示的页面
 如果JSP抛出一个未指定的异常则会转到这里配置的errorPgae指定的页面,这里指定的页面要是设置了isErrorPage为true的页面

contentType:
 它的取值:有效的文档类型 浏览器就是根据这个值来判断是什么类型的文档
 html:text/html
 纯文本:text/plain
 JPG图像:image/jpeg
 GIF图像:image/gif
 word文档:application/msword
 ...
info:
 它的值可以是任意的字符,指明JSP的信息
 这个信息可以通过Servlet.getServletInfo()方法获取到

trimdirectivewhitespaces:
 它的取值是true,false 表明是否取掉指令前后的空白字符,默认是false
 注意:对于html文件来说,空行是不会影响显示效果的,但是如果输出的是xml文件则可能会出现问题

include指令:
 它只有一种形式<%@ page include file="relativeURL"%>
 在这里relativeURL表示的是本应用程序内另一个JSP文件或者html文件的路径
 include指令主要是为了实现JSP页面的区块化
对于有多个不同的区块如果要在不同的条件下加载不同的样式区块可以使用if语句来实现动态的include
<%
if("style1".equals(request.getParameter("style"))){
 <%@ include="head1.jsp"%>
<%
} else if("style2".equals(request.getParameter("style"))){
 <%@ include="head2.jsp"%>
%>
<%
}
%>
在JSP中还提供了一种包含文件的行为
<jsp:include page="relativeURI"/>,这里也是取的被包含文件的相对路径
与<% include file="relativeRUI"%>不同的是,用指令来包含是把源代码包含进来作为一个整体再进行编译,最后生成一个class文件,而
<jsp:incldue>则是在运行的时候单独去执这里被包含的文件把执行的结果再包含进来,属于是先运行再包含
JSP的行为:
 1,<jsp:include />
 这个行为用于运行时包含某个文件,如果被包含的文件是jsp文件则会先运行这个被包含的文件最后把运行执行后的结果包含进来
 语法:<jsp:include page="relativeURI" flush="true"/>
 这里的属性:page是必需的,而且必须是本web应用程序内的文件
 flush属性:它的取值为:true和false,默认取值为flase,这里是设置读入保存文件内容前是否清空缓存
 include行为来包含文件是使用的
 request.getRequestDispatcher("relativeURI").forward(req,res);
 2,使用JavaBean行为(useBean,setProperty,getProperty...)
 Java Bean 就是一个普通的Java类,也被称作为POJO
 Java Bean类是非常简单的它只有私有属性和对应的setter,getter方法
 注意:setter,getter方法的取名,是以set加上属性的名称首字母大写来组成的
 对于boolean类型的属性则习惯上把getter方法写成isXxx()
 useBean:它是用于在JSP中定义一个Java Bean对象
 <jsp:useBean id="beanId" class="className" scope="Value"/>
 属性:
  id:取值可以是合法的Java变量名称
  它指明了JavaBean的名称,JSP中接下来可以使用这个名称来取到JavaBean对象
  class:取值是JavaBean类的全名
  它指明了哪个类为JavaBean的类
  scope:取值可以是:page,request,session,application
  指明这个JavaBean对象的作用范围
  page:表示在当前JSP页面有效
  request:表示在当前request中都有效
  session:表示当前用户有效
  application:表示当前应用程序内是有效的
  默认取值是page
 useBean行为的目的就是在JSP中去定义JavaBean对象。
 getProperty:它用来获取一个JavaBean的属性
 <jsp:getProperty name="beanName" property="propertyName" />
 属性:
  name:的取值中可以是任意合法的JavaBean名称,这里也就是useBean中的id属性的值
  property:指明操作的是JavaBean中的哪一个属性
 setProperty:它用来设置一个JavaBean中属性的值
 <jsp:setProperty name="beanName" property="propertyName" vlaue="" />
 属性:
  name:的取值中可以是任意合法的JavaBean名称,这里也就是useBean中的id属性的值
  property:指明操作的是JavaBean中的哪一个属性
  value:为要把属性设置的值
  对于页面传过来的数据中中文有可能存在乱码的情况则可以使用下面的方法来进行转码
  String name  = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");
  如下写法:
  <jsp:setProperty property="*" name="person"/>
  表示把useBean名字为person的对象中的所有属性进行赋值,注意要先进行setProperty才能把值赋值到JavaBean这样后面
  才可以进行getProperty

 <jsp:forward />行为:
 Servlet当中可以通过request.getRequestDispatcher("XXXX").forward(request,response)来从一个servlet做内部跳转到另一个
 内部servlet或一个文件,那么在JSP当中就中使用<jsp:forward />来实现这种跳转的
 <jsp:forward page="/somepage.jsp">
  <jsp:param name="param1" value="value1" />
  <jsp:param name="param2" value="value2" />
 </jsp:forward>
 这里在跳转的时候会提供两个参数到指定的位置,注意在跳转动作发生之前不能有任何输出到达客户端浏览器,否则会抛出
 IllegalStateException异常

JSP内置对象:
 out对象:
 javax.servlet.jsp.JspWriter类的实例,服务器端向客户端输出字符内容的时候可以通过out对象来实现
 常用方法:
 append():向缓存中写入字符类输出,当缓存满或者是调用out.flush()方法的时候则会向客户端浏览器输出
 clear():清空缓存中要输出的内容
 flush():把缓存中的内容flush到客户端浏览器
 println():向客户端输出内容
 isAutoFlush():这个返回缓存满时是否自动flush如果为false则在缓存满的时候会抛出异常
 getBufferSize():返回缓存的大小,单位:KB
 getRemaining():返回剩余的缓存大小,单位KB
 
 request对象:
 javax.servlet.ServletRequest类的实例,它代表了客户端的请求,request包含客户端的信息及请求信息,每次客户端的请求都会产
 生一个request实例
 常用方法:
 setAttribute(String name,Object obj):在request中保存一个对象,在本页面或者是forward后的页面中可以getAttribute()这个对象
 getAttribute(String name):从request中取到指定的对象
 getMethod():返回提交的方式,GET或POST
 getParameter(String key):返回指定的请求参数中的值
 getParameterValues(String key):返回同名参数的值
 getParameterNames():返回所有提交的参数名称,这里返回的类型是Enumeration
 getCookies():返回所有的Cookie,返回的一下Cookie[]
 getContextPath():返回的是应用程序的路径
 String getRequestURI():返回请求的URI路径
 setCharacterEncoding(String encoding):设置request编码
 getHeader(String name):获取request的头信息
 getHeaderNames():返回所有request头名称,返回的类型是Enumeration
 Dispatcher getRequestDispatcher():返回Dispatcher对象,这个对象可以执行forward操作
 getSession():返回HttpSession对象

 response响应对象:
 javax.servlet.ServletRequest类的实例,代表的是客户端的响应,服务器端的任何输出内容都是通过response对象发送到客户端浏览器的
 每次服务器端都会响误码一个response实例
 常用方法
 clear():清空缓冲区中的输出
 addCookie(Cookie coookie):设置Cookie
 getOutStream():返回服务器输出流,可以通过这个输出二进制信息到客户端
 sendRedirect(String url):把页面重定向到指定的地址
 setContentType(String contntType):设置响应文档的类型
 getOut():返回一个PrintWriter对象out,可以使用这个out对象来向客户端输出字符内容
 setHeader(String name,String value):设置response头信息
 setStatus(int status):调置response状态码

 config对象
 javax.servlet.ServletConfig类的实例,它封装了配置在web.xml中初始化JSP参数,在JSP中可以通过config来取得这些参数,每个JSP文件共有
 一个config对象
 常用方法
 getInitParameter(String name),返回配置在web.xml中的初始化参数
 getInitParameterNames():返回所有的初始化参数名称,返回的类型是Enumeration
 getServletContext():返回ServletContext对象
 getServletName()返回servlet的名称

 Session对象
 javax.servlet.http.HttpSession类的实例,session和cookie是记录用户访问信息的两种机制,session用于在服务器端保存用户的信息,cookie则用于在
 客户端保存用户的信息,在servlet当中使用request.getSession来获得session对象,而在JSP中这个对象是内置的可以直接使用,但有一个配置如下要注意:
 <%@ page session="false" %>如果在JSP中这样配置的话则JSP中会隐藏session对象而不可用
 常用方法:
 getId():返回session的id
 getAttribute(String name):返回session中属性名为name的对象
 getAttributeNames()返回session的所有属性名,返回的类型是Enumeration
 getCreateionTime()返回一个long类型的session创建时间
 getMaxInactiveInterval()返回session的最大允许的时间间隔,单位是秒
 setAttribute(String name,Object obj):在session中绑定相关的内容
 setMaxInactiveInterval(long second)设置最大允许的时间间隔

 application对象
 java.servlet.ServletContext类的对象,它封装了JSP所在的WEB应用程序的信息。比如在web.xml中配置的全局初始化信息需要用它来获取.
 在serlvet当中要取得application对象则要如下:ServletConfig.getServletContext(),整个web应用程序对应一个application对象
 常用方法:
 getAttribute(String name):返回application中属性名为name的对象
 getAttributeNames();返回application中的所有属性名,返回值的类型是Enumeration
 setAttribute(String name,Object value);设置application属性
 removeAttribute(String name);移除application属性,返回值是void
 getInitParameter(String name);返回全局初始化参数
 Enumeration getInitParameterNames();返回所有全局初始化参数,返回值的类型是Enumeration
 getMimeType(String filename);返回文件文档类型
 getRealPath(String relativePath);返回web应用程序内相对网址对应的绝对地址

 page对象
 javax.servlet.jsp.HttpJspPage类的实例,page对象代表当前JSP页面。是当前JSP编译后的Servlet类的对象,相当于普通类中的this
 
 pageContext对象
 javax.servlet.jsp.PageContext类的实例,这个对象代表了当前JSP页面编译后的内容,通过这个对象可以JSP中的资源
 常用方法:
 findAttribute(String name);这个是在JSP页面中查找变量,返回值是一个Object对象
 forward(String url);forward到另一个页面
 getAttribute(String name);返回属性
 getAttribute(String name,int scope);返回指定范围的属性,范围取值有:PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE,APPLICATIOIN_SCOPE
 JspWriter getOut();返回out对象
 getPage();返回page对象
 getRequest();返回request对象
 getResponse();返回response对象
 getSession();返回session对象

 exception对象:
 java.lang.exception类的实例,它封装了JSP中抛出的异常信息,如果JSP页面中要使用这个对象则必须要有如下配置
 <%@ page isErrorPage="true" %>
 在异常处理中更多的设计是使用Filter捕捉异常,或者是用框架的ExceptionHandler机制来处理异常

JSP的配置
JSP是无需要使用web.xml进行配置就可以访问的
注意其实JSP也是可以在web.xml当中作相应的配置的
使用<jsp-file>标签在web.xml中配置,而servlet是使用<servlet-class></servlet-class>配置的
在web.xml当中可以使用<jsp-config>标签来对JSP做批量配置,它有两个子标签<taglib>和<jsp-property-group>
<taglib>是用来作taglib属性配置的
<jsp-property-group>则是用来批量定义JSP属性的
比如如下的一段配置
<jsp-config>
 <tiglib>
  <taglib-uri>taglib</taglib-uri>     <!-- 这个是用来定义taglib-uri -->
  <taglib-location>/WEB-INF/tlds/taglib.tld</taglib-location|> <!-- 定义tld文件位置 -->
 </taglib>
 <jsp-property-group>
  <url-pattern>
   /news/*.jsp    <!-- 指定配置的适用范围这里是/news下的所有JSP文件 -->
  </url-pattern>
  <el-ignored>
   true     <!-- 是否忽略EL表达式,默认是false -->
  </el-ignored>
  <page-encoding>UTF-8</page-encoding>  <!-- 编码方式 -->
  <scripting-invalid>true</scripting-invalid> <!-- 是否忽略JSP脚本,默认是false -->
  <include-prelude>/head.jspf</include-prelude> <!-- 执行JSP脚本前执行这个文件 -->
  <include-coda>/foot.jspf</include-coda>  <!-- 执行JSP脚本后执行这个文件 -->
 </jsp-property-group>
</jsp-config>

EL表达式:
 EL表达式是使用”${}“括起来的脚本,用来更方便的读取对象。
 注意这个表达式是写在html代码中,不能写在<%%>这个这前的JSP脚本中
EL表达式提供了获取对象以及属性的简单方式,在某些情况下是完全可以代替JSP行为和JSP脚本的

${name}:它相当于request.getAttribute("name");或者是session.getAttribute("name");
${obj.age}:它相当于在取这个对象obj的属性值相当于调用obj.getAge()

EL表达式读取隐藏对象的属性
${param.foo}:这个就是读取地址栏中的参数,相当于request.getParameter("foo");
${initParam.foo}:这是在读取初始化参数,相当于config.getInitParameter("foo");
${header.host}:这个读取head参数,相当于request.getHeader("host");
这里的param,initParam,header返回的是Map类型的对象,对于Map里的对象也可以使用数组的形式进行获取
${param["foo"]}
${initParam["foo"]}
${header["host"]}
为什么要用这种形式呢这个是因为对于foo或者host可能有多个同名的参数,那么用数组的形式则可以任意取出其中的一个
${param.a[1]}:这个就是取出参数名为a的第二个参数值
Cookie的读取
cookie中包含所有的Cookie的map,key是Cookie的name属性
<%response.addCookie(new Cookie("userName","xiaoxie"));%>
//如上设置cookie后则可以读取cookie中的相关信息
${cookie.userName}:这会返回这个Cookie
${cookie.userName.value}:它会返回Cookie的值
${cookie.userName.name}:它会返回userName
初始化参数:initParam
${initParam.encoding}:获取初始化的参数encoding的值
作用域:
pageScope:
<jsp:useBean id="person" class="com.xiaoxie.pojo.Person" scope="page" />
上面声明了pageScope范围内的Person对象后,${pageScope.person.age}输出对象的age属性
requestScope:
<jsp:useBean id="person" class="com.xiaoxie.pojo.Person" />
上面声明的是在request范围内声明person对象,${requestScope.person.age}输出对象person的age属性
sessionScope:
<jsp:useBean id="person" class="com.xiaoxie.pojo.Person" scope="session" />
上面声明的是在session范围内声明person对象,${sessionScope.person.age}输出对象person的age属性
applicationScope:
<jsp:useBean id="person" class="com.xiaoxie.pojo.Person" scope="application" />
上面声明的是在session范围内声明person对象,${applicationScope.person.age}输出对象person的age属性
pageContext:
它包含页面内容的变量,可以用来获得request,response,page,application,config等隐藏对象
${pageContext.request.remoteAddr}返回客户端的IP地址
它相当于执行了<%=pageContext.getRequest().getRemoteAddr()%>
注意从有一个获取对象的属性的值可以不带任何的前缀
${person.age}:那么它会先在request当中查找,如果没有找到则到session当中去找

EL表达式运算:
 1,它包含简单的运算:+,-,*,/(div),%(mod),三目运算(exp?val1:val2)
 2,它包含简单的比较:>(gt),<(lt),等于(==或eq),不等于(!=或者ne),大于等于(>=或ge),小于等于(<=或le)
 3,它包含逻辑比较:并且(&&或and),或(||或or),否(!或not)
 4,一些比较运算也可以比较字符
 ${'a'<'c'}输出为true
 ${'xiaoxie' == param.name}:当提交的name参数为xiaoxie时为true
 在字符的比较中如果的大于小于这类操作则会调用int compare(char ss),如果是等于则会调用equals()方法来完成比较
 对于Map或者数组来说可以使用[]来取得指定位置的值,还可以使用empty来判断是否是空
 ${param.paramA[0]}:输出提交的paramA的第一个参数的值
 ${empty param.paramA}:提交的paramA参数是否为空或者个数为0
 注意:EL表达式是不能直接访问普通的方法及静态属性的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值