jsp语法,EL表达式 自定义EL表达式 ,JSTL 自定义标签库自定义标签库模板

1 jsp 页面元素

可以是HTML和CSS静态文本                                     例如: <h1>我是富贵<h1>
        注释 <!-- 注释-->  <%--  注释内容-- %>                 例如    <!--我被注释了-->
        指令 以 <%@ 指令内容  %>                                     例如    <%@ page language = "java"%
        表达式 <%=表达式 %>                                            例如    <%=student%>
        脚本    <%java代码%>                                             例如    <%student ="123";%>
        声明    <%! 声明一个java类或方法%>                       例如     <%! public class Person{}%>
        动作    <jsp:动作名>开始   </jsp:动作名结束>          例如      <jsp:include page="top.jsp"></jsp:include>

指令元素

extends 用于指定jsp页面被转换后Servlet所继承的类通常不需要使用这个属性jsp容器会会提供默认的类

import 用于指定jsp页面可以使用的类

session 用于指定一个页面是否内建一个session如果属性为false不会内建 就是在这个页面中不存在内建的session对象

buffer 用于指定 out 对象输出的大小 如果制定了缓存区不就只会传送到

PrintWriter输出而是现在缓存区存着

autoFlush 用于指定缓冲区满了的时候是否刷新默认为 True

isThreadSafa 用来指定jsp是否线程访问安全如果设置为ture该页面可以同时被多个客户请求访问如果为false同一时刻只能处理一个用户

info info属性为jsp页面准备了一个有意义的字符串 属性值是个字符串 可以通过getServletInfo()方法来获取info的属性值

errorPage errorPage属性用来指定jsp页面发生异常是时候jsp将转发到指定的页面

isErrorPage isErroPage用来指定当前页面是否处理默认的异常如果为True可以处理另一个jsp页面的产生的异常默认为false通常和errorPage一起使用

contentType 用来指定你jsp页面输出到客户端所用的MIME类型和字符集 默认MIME为 text/html 默认字符集为 ISO-8859-1 这一项必须在必须在文件 最顶部

扫描二维码关注公众号,回复: 13368042 查看本文章

pageEncoding pageEncoding属性指定jsp页面使用的字符集编码如果使用了该属性那么jsp页面就会使用 contentType 属性指定的编码集

isELIgnored 用于指定jsp页面中是否忽略El表达式如果为true 表达式被忽略 如果为 false EL表达式将会被执行
taglib 用来导入指定自定义表标签和
include 是jsp页面中文件包含的的文件资源被包含的文件资源在编译时候解析 然后插入源文件只插入一次

动作元素

jsp:include include动作和include指令一样 但是他是在运行时候插入不是在编译时候插入 include动作有两个属性 page属性包含资源的相对路径
flush 可选设置是否刷新缓冲区
jsp:forward 将客户端的的消息发送到转发到到指定的jsp或者Servlet 或者静态源文件 有一个属性 page 来设置转发的地址可以有子动作标签 <jsp:parm name = “” value="">
<jsp:param name="" value="">动作元素经常被用来名-和值 用来提供附加信息 经常与jsp:include jsp:forwordjsp:plugin动作元素作为他们的子标签使用
jsp:useBean 可以在jsp创建一个javaBean 里面的参数为 id 用于定义一个javaBean的标识符程序中通过这个来对javaBean进行引用 scope:指定 javaBean的作用域 可选择值有 page,request,sesson, application 默认值是page calss:指定java的完整类名 beanName指定 java完整类名 无法和Class同时存在、
jsp:setProperty
jsp:getProperty用来读取 或者设置javaBean的属性 其中各个参数为 name 要读取或者设置的javabBean的属性 如果为“*”表示所有的属性
value指定为JavaBean属性赋值

<%-- 指令元素小栗子--%>
<%@ page  extends=“类名”
          import= “java类列表”
          session=“true|false”
          buffer="namo|自定义大小  <%-- 定义缓冲区大小--%>
          inThreadSafe="true|false"
          info  =“页面内容”
          errorPage=“页面出错是要转换到的页面”
          isErrorPage=“true|false”
          contentType=“text/html”;charset=“gb2312”<%--设置输出到客户端的文件类型 和编码方式 --%>
          pagEncoding=“UTF-8”    <%--指定设置的jps页面编码方式为utf-8--%>
          isELIgnored="true|false"     <% 这设置是否可以使用el表达式%>
          taglib url= "http://java.sun.com/jsp/jstl/core" prefix="c"    <%--这里演示的是导入JSTL 标签库--%>
          include file="foot.html"  
          include file="D:\\jsp"
          include file="www.baidu.com"<%-- 可以导入 本地路径 和相对路径  还有网络资源路径--%>
%>


       <%--jsp动作元素小栗子--%>
<jsp: include  page="5.html" fluseh="true">
         <jsp:param  name="title"  value="english'> <%-- 这里是设置了被包含文件的 init参数  这里导入的是5.html --%>
         <jsp:param   name="content" value="fugui">
</jsp:include>

<jsp:forward page="b.jsp">  
     <jsp:parm name ="paramName' value="fugui">  <%--这里设置了转发传递的参数 可以通过 request.getParameter("paramName")获取到 --%>
</jsp:forward>

<jsp:useBean id="name" scope ="page'  class="fistbean.FBean" >   
<jsp:setParoperty name="name' property="propertyname" value="fugui"><%--设置name  propertyname属性的值 设置为fugui--%>
<jsp:getParoperty  name="name"  property="propertyname">  <%--获取属性值 这里在页面显示出来只是这个属性的值--%>

2注释

html注释 这个注释不安全 例如 在客户端页面显示为 <!-- 2010-6-24 9:20:07 -->
jsp注释 <%-- --%>隐藏注释在运行时第一行注释为隐藏 不显示

3 jsp内置对象简介

   request:这个是用户请求对象里面封装了请求的和一切信息 但是他没有可用的实际协议所以经常把他强制转换为他的子类HttpServletRequest 里 面多了很多http协议方法 作用域为请求期间
       response  这个为返回给客户端的相应信息 一般需要强制转换为他的子类 HttpServletResponse对象 作用域 为相应期间
       out   将结果输出到客户端 可以通过指令来设置缓存区的大小  作用域为页面执行期间
       session 会话对象是自动创建的 技术没有引入会话也会创建 除非在指令元素page属性中见会挂关闭  作用域为一次会话
       application 用于在同一个应用中传递参数 作用于为整个web应用
       page    这个对象为页面本身
       pageContext 它用于获得jsp页面的内置对象 
       config  用于读取服务器配置信息
       exception 仅在页面产生错误的时侯

request请求信息

Http请求信息
http请求有一个信息或者多个信息组成每个标题都有一个名称和值为了返回所有客户请求的标题名 返回返回所有客户亲求的标题名 getHeaderNames()方法通过getHeader()获取相应的标题名和值各个标题头意义如下
Accept: 浏览器可以接受的MIME类型
Accept-Charset: 浏览器能够进行解码的数据编码方式
Accept-Encoding:浏览器能够解码的数据编码方式
Accept-Language:浏览器希望获得的语言种类
connection: 是否需要持久链接
content-Length:表示请求消息正文的长度
cookie: 向服务器返回的Cookie 这Cookie 是先前有服务器发送到浏览器的
Host: 初始的url的主机和端口
中文乱码的解决方案

<%  String name = new String(request.getParamenter("name").getBytes("ISO-8859-1"),"UTF-8");//当请求参数中文乱%>
          <%  request.setCharacterEncoding("utf-8") //当提交表单时候获取到的中文信息为乱码 可以加上设置编码格式%> 

response响应对象

设置相应头
请求信息带着信息头过来 相应信息也会带一个相应头过去 用于回应给浏览器一个信息帮助他正确的显示内容 可以使用标签和他的属属性 设置也可以 通过setHeader(“头的名称”,“属性值”) addHeader(“头的名称”,“属性值”)来设置相应头和创建自定以相应头和例子:

<%-- 通过meta标签设置缓存和有效期--%>
<meta http-equiv="pragma" content="no-cache">   
<meta http-equiv="cache-control" content="no-cache">   
<meta http-equiv="expires" content="0">
<%--通过脚本来设置--%>
 <% response.setHeader( "Pragma", "no-cache" );   
    response.setDateHeader("Expires", 0);   
    response.addHeader( "Cache-Control", "no-cache" );//浏览器和缓存服务器都不应该缓存页面信息
 %>
<% response.setHrader("Refresh","1");//客户端收到这相应头后没间隔1s刷新一次页面
%>

请求的重定向
当服务器收到请求有些时候需要把客户带到一个新的资源里面使用sendRedirect()重新定向 还可以用response指定一个错误的状态码 这个方法 可以接受一个错误状态码和与一条可选的错误信息返回给客户端这个方法是sendError(200,“这个页面出错了”)

EL表达式

用来获取简单数据防止jsp里面出现大量的java代码不整洁
EL表达式的基本用法
${数据} 如果想el表达式失效在前面加个反斜杠就行了
变量获取的例子

${pageScope.username}   //在page中寻找username属性如果找不到返回null
${requestScope.username}//在request中寻找如果找不到返回null
${sessionScope.username}//在session中寻找如果找不到返回null
${applicationScope.username}//在application中寻赵如果找不到返回null

//使用el获取javaBean的属性这里举例是userBean
${userBean.username}//获取userBean的username属性
${userBean[username]}//和上面一样只是使用方式不同

//使用El获取数组 list map的值这里举例是 在request下面 获取 数组user 和list listuser  和mapuser的值
${request.user[0]} //取出user数组下表为0的数据
${reqeust.userlist[0]}//取出userlist下面的下表为0的数据
${reqeust.usermap["nema"]}//取出usermap下面name属性

EL算数运算符
el有 + - * / % 等 和java一样
注意:在使用el表达式的时候写法要 ${reqeust.name == request.nema2};
可以使用三元运算符和java一样

${password=="123"?"密码正确":"密码错误"}

empty运算符判断是否为空为空返回true

${empty expression} //判断expression是不是空

el访问内置对象
内置对像 pageContext param paramValues header headerValues cookie initPram pageScope requestScope sessionScope applicationScopedu 对象
访问取属性值或者访问内置对象有两种方法
一种 使用点语法 一直使用中括号加单引号 单参数拥有 + - * 等运算符的时候 el表达式会认为这不是一个参数名字而是一个运算你就需要使用[’’]例子在下
补充:其实所有域都是map 都是由key 和 value组成的 我们通过他的key取出他的value 如果需要获取域对象的属性 还需要 pageCaonext取出request对象使用.才可以 pageContext可以取出jsp隐含对象

在这里插入图片描述

//当域里面拥有指定的特殊字符 比如 有个 属性 叫做  student-x  那么这个时候点语法会获取不到对象 因为 - 会被理解成减号 这个时候就应该使用 []语法
requestScope.student-x //这个是错误的取不出来值
requestScope['student-x'] //这个是正确的
requestScope["student-x"]//单引号和双引号一样

${pageContext.request.scheme}  // 获取request对象里面的协议属性
${pageContext['request']}//第二种方法等同于上面的方法
${pageContext.response}//获取response对象

${param.user}//获取user的参数值
${paramValues.subject[0]} //用来获取一个参数拥有多个值取出指定的值 这里取出的第一个值

${header.host} //获取头的host属性
${header[host]}//和上面一样

${cookie.username.value}//获取cookie对象中username的属性
${initParam.username}//获取指定的web初始化参数

自定义el函数

需要配置xml映射文件 一般在web-inf 下建立一个 .tib文件
需要配置一个实现类
自定以tib文件的模板

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
  <!-- 标签库的描述 -->
  <description>JSTL 1.1 functions library</description>

  <display-name>JSTL functions sys</display-name>

  <!-- 标签库的版本号 -->
  <tlib-version>1.1</tlib-version>
<!-- taglib指令中prefix需要制定的部分,可以任意写,但是尽可能和文件名保持一致,方便管理。 -->
  <short-name>fns</short-name>

<!-- taglib指令中URI需要指定的部分,可以任意写 -->
  <uri>http://java.sun.com/jsp/jstl/functionss</uri>


<!-- 自定义函数标签 -->
  <function>
   <!-- 自定义函数描述 -->
    <description>获取字典对象列表</description>

    <!-- 在使用EL表达式时使用的函数名 -->
    <name>getDictList</name>

   <!-- 自定义函数需要绑定的Class的全名 -->
    <function-class>zdybq.DictUtils</function-class>

   <!-- 自定义函数签名的完整写法,忽略形参:方法返回类型 方法名 (参数的类型列表...) -
    <function-signature>String getDictList(java.lang.String)</function-signature>
  </function>
   
</taglib>

//使用栗子
${Fun:join("123","abc")}

JSTL标签库

有五个不同的标签库组成 分别是 核心标签库 格式标签库 sql标签库 xml标签库 函数标签库 在使用这些库的时候 必须在之前引入<%@ tabglib%>
jstljar下载地址:官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

导入库

需要在导入相对的jar包:jstl1.2以前,需导入 jstl.jar和standard.jar
如果是jstl1.2以上,就不需要引用stardard.jar库了
并且在web.xml文件中加如以下配置

 <jsp-config>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
    <taglib-location>/WEB-INF/fmt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri>
    <taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/c.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri>
    <taglib-location>/WEB-INF/c-rt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
    <taglib-location>/WEB-INF/sql.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri>
    <taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
    <taglib-location>/WEB-INF/x.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri>
    <taglib-location>/WEB-INF/x-rt.tld</taglib-location>
    </taglib>
    </jsp-config>
</web-app>

jsp导入五个标签库实例

核心标签库

<c:out> 将表达式值输出到jsp页面 相当于<%=%>
<c:set> 在指定的范围内或者为指定的对象那个设置属性值
<c:remove>从指定的jsp范围内删除指定多个的变量
<c:catch> 捕获程序的异常 相当于cry…catch
<c:import>导入站内的静态文件和动态文件
<c:redirect>将request请求重新定向
<c:url>使用正确的url重写规则构造一个url
<c:param>为其他标签提供参数信息 ,通常与其他标签结合使用
<c:if> 符合条件和if 一样
<c:choose>,<c:when>,<c:otherwise> switch语句
<c:forEach> forEach循环
<c:forTokens> 和forEach差不多只不过他的 item值只能是一个字符串 delims 属性用来指定分割符

//设置属性
<c:set scope="request" var="name" value="我的天"></c:set>    //修改指定作用域里面的参数
<c:set   property="username" target="${requestScope.stu}"  value="富贵"></c:set>  //修改指定对象的参数  property="变量名" terget="要修改的对象"  value="要修改的值"

<c:remove var="stu" scope="request"></c:remove> //删除指定域中的值

<c:if test="${stu.age>=18}" scope="request" var="flag"> //flag储存test判断的结果  var变量名  scope指定储存的域
  <h2>富贵成年了</h2>
</c:if>
<c:if test="${stu.age<18}">
<h2>富贵未成年</h2>
</c:if>


<c:choose>
    <c:when test="${stu.age>18}">      //otherwise必须放到最后  when和 otherwise 必须由choose包裹
    <h2>富贵成年了</h2>
    </c:when>
    <c:when test="${stu.age == 18 }">
    <h2>富贵除了宪法没人能阻止他了</h2>
    </c:when>
    <c:otherwise>
    <h2>富贵上小学</h2>
    </c:otherwise>
</c:choose>

<c:forEach begin="1" end="3"  items="<%=list%>" var="i"   varStatus="status">   // begin指定开始 end指定结束  items指定集合  
    ${pageScope.i}                                                              //var每次遍历的值  status参数的详细信息
                                                                                //其实 i就是存在page域里面的
</c:forEach>

<c:forTokens items="google,runoob,taobao" delims="," var="name">  //items指定便利的字符串 var指定变量 delims指定分割符
   <c:out value="${name}"/><p>
</c:forTokens>

<c:redirect url="http://www.runoob.com"/>  //转发

"<c:url value="http://www.runoob.com"/>"//这个具体自己也不知道

函数标签库

fn:contains("","")判断第一个字符串 是否包含第二个字符串 包含返回True 区分大小写
fn:containsIgnoreCase("","")判断第一个字符串是否包含第二个 返回boolean 不区分大小写
fn:endsWith("","")判断字符串是否以指定的字符串开头
fn:startsWith("","")判断指定字符串是否以指定的字符串开头
fn:indexOf("","")返回指定字符串的下表
fn:replace("","","")使用第三个参数替换掉第一个参数包含的第二个参数如果不包含那就不替换
fn:substring("",int,int)截取字符串从指定的下表接到结尾

自定义标签库

需要一个实现了SimpleTag接口的类或者继承了SimpleSupport 还需要要给 tid文件(实际上是一个xml)
标签的参数需要在实现类里面设置set方法来进行接收
配置文件模板

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
  <tlib-version>1.0</tlib-version><!-- 标签版本好-->
  <short-name>dd</short-name><!-- 标签库短名 也就调用之前的前缀 -->
  <uri>http://www.ziding.cn/tag2.0</uri><!-- 导入标签库的uri -->
  
   <tag>  <!--表示一个独立的自定以标签 -->
   <name>max</name>              <!-- 标签名 -->        
   <tag-class>tag.MaxTig</tag-class> <!-- 标签的实现类 -->
   <body-content>empty</body-content><!-- 标签体的内容是否为空标签 
    还可以设置为
    scriptless:不可以传jsp表达式,e1及其他正常
    scriptless可以传的jsp也可以,还可以传入jsp表达式。
    tagdependent:传入是啥就是啥- >
   -->
  
  <attribute>    <!-- 标签的属性-->
       <name>sum1</name>    <!-- 属性名字-->
       <required>true</required>  <!-- 是否是必须-->
       <rtexprvalue>true</rtexprvalue> <!-- 是否至此动态获取 el->
  </attribute>
  <attribute>
       <name>sum2</name>
       <required>true</required>
       <rtexprvalue>true</rtexprvalue>
  </attribute>
  
  </tag>


   <tag>
   <name>io</name>
   <tag-class>tag.IoTig</tag-class>
   <body-content>empty</body-content>
  
  </tag>
  </taglib>

实现类案例

public class MaxTig implements SimpleTag {
     private String sum1;
     private String sum2;
     public String getSum1() {
           return sum1;
     }
     public void setSum1(String sum1) { //接受标签的属性
           this.sum1 = sum1;
     }
     public String getSum2() {
           return sum2;
     }
     public void setSum2(String sum2) {
           this.sum2 = sum2;
     }
     @Override
     public void doTag() throws JspException, IOException {  //这个是真正的逻辑调用
           JspWriter wirter = this.jspContext.getOut();
            wirter.write(Math.max(Integer.parseInt(sum1),  Integer.parseInt(sum2))+"");
     }
     @Override
     public JspTag getParent() {   //会自动的获取父类
           // TODO Auto-generated method stub
           return null;
     }
     @Override
     public void setJspBody(JspFragment arg0) { //获取他的标签体
           // TODO Auto-generated method stub
     }
     private JspContext jspContext;  //获取context对象
     public void setJspContext(JspContext arg0) {
           this.jspContext = arg0;
     }

猜你喜欢

转载自blog.csdn.net/weixin_43979902/article/details/120191271