JavaWeb_day5-监听器和过滤器

002E:day6-EL.txt:00:1:14=4A4DBF6E:16=47d21313:003F:day7-自定义标签和JSTL.txt:01207:1:14=48FFDE3E:16=47d21313:一自定义标签:


1.JSP标签的形式:
开始标记                      主体 结束标记
<前缀:标签名 [属性名="值"...]>主体</前缀:标签名>
<前缀:标签名 [属性名="值"...] />


2.自定义标签的执行过程
jsp                 -->    servlet
<jsp:useBean .../>  -->    标签处理类(Java类)


3.两种方式的处理类实现:
1)传统标签类: 
  a)只能决定是否显示主体内容 TagSupport:
                   <my:Tag1  att="value"   - setAtt(..)
  doStartTag()               att2="value"> - setAtt2(..)
  doAfterBody()     body content
  doEndTag()       </my:Tag1>


 执行流程:
 1. 遇到开始标记: 调用属性的set方法,把属性的值传到处理类中,然后调用doStartTag()
 2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主体内容)直接跳到第4步。
                        EVAL_BODY_INCLUDE(要求JSP容器要显示标签主体内容)执行第3步 
 3. 显示主体内容,然后调用doAfterBody(),如果它返回SKIP_BODY,它就执行第4步,如果它返回EVAL_BODY_AGAIN,重复执行主体内容.
 4. 遇到结束标记,调用doEndTag(),返回EVAL_PAGE,它就继续处理剩下的页面,如果返回SKIP_PAGE,这个标签之后的所有内容不再处理。


  b)还可以决定是否更改主体内容 BodyTagSupport:
                  <my:Tag1  att="value"   - setAtt(..)
  doStartTag()              att2="value"> - setAtt2(..)    
  doAfterBody()     body content     - doInitbody(), setBodyContent() 缓存主体内容
  doEndTag()      </my:Tag1>
  执行流程:
  1. 遇到开始标记: 调用属性的set方法,把属性的值传到处理类中,然后调用doStartTag()
  2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主体内容)直接跳到第4步。
                        EVAL_BODY_INCLUDE(要求JSP容器要显示标签主体内容)执行第3步
                       EVAL_BODY_BUFFERED , 就会执行setBodyContent()和doInitBody()
  3. 显示主体内容,然后调用doAfterBody(),如果它返回SKIP_BODY,它就执行第4步,如果它返回EVAL_BODY_AGAIN,重复执行主体内容.
  4. 遇到结束标记,调用doEndTag(),返回EVAL_PAGE,它就继续处理剩下的页面,如果返回SKIP_PAGE,这个标签之后的所有内容不再处理。


2)简单标签处理类:SimpleTagSupport:   doTag()
  与传统标签处理类不同之处,页面中每遇到一次对应的标签时,容器都要创建一个实例。而传统标签处理类是针对一类标签只有一个处理类的实例。




4. 标签库描述文件xxx.tld放置在WEB-INF或jar包的META-INF下:


5. 在页面的使用:
  1)导入标签库描述文件:<%@ taglib uri="指定在tld文件中声明的url" 
                                    prefix="指定引用自定义标签的前缀" %>
  2)使用自定义的标签: <前缀:标签名 ...></前缀:标签名>
   
6. 自定义标签示例:
1) <my:hello name="zs"/>    - 页面显示:hello: zs  TagSupport
2) <my:upper count="3">hello,world</my:upper>  -页面显示效果: HELLO,WORLD HELLO,WORLD HELLO,WORLD    - BodyTagSupport


3) <my:if test="true|false">主体内容</my:if> 如果test为true,就执行主体内容,否则不执行主体                   - SimpleTagSupport


4) 数据分页的自定义标签
<my:pager pageSize="10" pageNo="1" recordCount="100" url="index.jsp" />


7.自定义标签打包:
-->jar包     用winrar来打成xxx.zip改成xxx.jar
   |-- 处理类的字节码
   |--META-INF
         |-- MANIFEST.MF
         |-- XXX.tld 


8. 用标签文件实现自定义标签:--功能不够强大。






二JSTL:JSP标准标签库
 1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 完成一些通用的功能
   1). <c:out value="${}" /> 会把一些HTML的特殊字符进行转换
   2). <c:set value="..." var="变量" scope=""/>
   3). <c:if test="布尔表达式" var="">....</c:if>
   4). <c:choose>
          <c:when test="">...</c:when>
          <c:when test="">...</c:when>
          <c:otherwise>...</c:otherwise>
       </c:choose>
 ★5). <c:forEach var="i" begin="1" end="100" step="1">${i}</c:forEach>
       <c:forEach var="str" items="${requestScope.list}"> ${str}</c:forEach>
       <c:forEach var="str" items="${requestScope.list}" varStatus="s">
           ${s.index}-${s.count}-${str}
       </c:forEach>
   6). <c:forTokens />


   7). <c:url value="URL路径" var="" scope="">
          <c:param name="名" value="值"/>
       </c:url>   --> URL路径?名=值 ;不支持Cookie: URL路径;sessionid=xxxx?名=值


 2. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 国际化和格式化
   格式化:<fmt:formatNumber/> <fmt:formatDate/>
         <fmt:formatDate value="${date}" type="both"/>
   国际化:<fmt:setLocale>  <fmt:bundle>  <fmt:setBundle>   <fmt:message> 


 3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql"  prefix="sql" %> 操作数据库
 
 4. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml"  prefix="xml" %> 操作XML文件


 5. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions"  prefix="fn" %> 一些函数的调用.只能用在EL中 ${fn:xxx(...)} 
     ${fn:length(collection)}, ${fn:trim(string)}



































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现省市区三级联动的关键是建立好数据库,并且编写好对应的 SQL 语句。以下是一个简单的数据库设计: - 省份表 province,包括字段 id 和 name。 - 城市表 city,包括字段 id、name 和省份的外键 province_id。 - 区县表 district,包括字段 id、name 和城市的外键 city_id。 接下来是建表语句: ```sql -- 省份表 CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 城市表 CREATE TABLE `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `province_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `province_id` (`province_id`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`province_id`) REFERENCES `province` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 区县表 CREATE TABLE `district` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `city_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `city_id` (`city_id`), CONSTRAINT `district_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 接下来是查询省份、城市、区县的 SQL 语句: ```sql -- 查询所有省份 SELECT id, name FROM province; -- 查询某个省份下的所有城市 SELECT id, name FROM city WHERE province_id = ?; -- 查询某个城市下的所有区县 SELECT id, name FROM district WHERE city_id = ?; ``` 在 Java Web 项目中,可以使用 Ajax 和 JSON 技术实现省市区三级联动。前端页面发送 Ajax 请求,后端通过 JDBC 连接数据库,查询对应的省份、城市、区县信息,并以 JSON 格式返回给前端页面。前端页面再解析 JSON 数据,更新页面的省份、城市、区县下拉框选项。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值