2014-08-16 日志

本文介绍了JSTL的基本用法,包括核心标签库和格式化标签库的使用,以及如何创建自定义标签来增强JSP页面的灵活性和复用性。
JSTL


Apache提供的标签库,
jar包:jstl-1.2.jar,如果傅MyEclipse,它会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入。


------------------


导入JSTL核心标签库
<%taglib prefix="c" uri="http://java.sun.com/jstl/core"%>




<c:set> 
* <c:set var="a" value="hello"/> 创建名为a,值为hello的域属性,范围:page
* <c:set var="a" value="hello" scope="session"/> 范围为session


<c:out>
* <c:out value="aaa"/> 输出字符串aaa
* <c:out value="${aaa"/> 输出域属性aaa,其中与${aaa}相同
* <c:out value="${aaa}" default="xxx"/>如果${aaa}不存在,那么输出xxx字符串
* <c:out value="${aaa}" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击


<c:remove>
* <c:remove var="a"/> 删除名为a的域属性
* <c:remove var="a" scope="page"/> 删除page域中名为a的域属性


<c:url>
* <c:url value="/AServlet"/> 输出URL:/项目名/AServlet
* <c:url value="/AServlet" var="url" scope="page"/> 把生成的url保存到page域中,而不会输出
* <c:url value="/AServlet">:输出URL:/项目名/AServlet?username=%xx%xx%xx%xx%xx%xx,其中张三会被URL编码
   <c:param name="username" value="张三"/>
  </c:url/>


<c:if>
* <c:if test="${条件}"> 当条件为true时执行标签体内容
    hello
  </c:if>


<c:choose>
* <c:choose>
    <c:when test="${条件1}">a</c:when>
    <c:when test="${条件2}">b</c:when>
    <c:when test="${条件3}">c</c:when>
    <c:otherwise>d</c:otherwise>
  </c:choose>


  等同与:
  if() {
  } esle if() {
  } esle if() {
  } else if() {
  } else {
  }


-------------


<c:forEach>


可以用来遍历数组、List、Map、


1. 计数循环


<c:forEach begin="1" end="10" var="i">
 ${i}
</c:forEach>
等同于
for(int i = 1; i <= 10; i++) {
  out.println(i);
}




<c:forEach begin="1" end="10" var="i" step="2">
 ${i}
</c:forEach>
等同于
for(int i = 1; i <= 10; i+=2) {
  out.println(i);
}


-------------


2. 遍历数组


<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item " items="${ns } ">
<c:out value="name: ${item } "/><br/>
</c:forEach>




-------------


3. 遍历List


<%
List<String> names = new ArrayList<String>();
names.add("zhangSan");
names.add("liSi");
names.add("wangWu");
names.add("zhaoLiu");
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }"> 
<c:out value="name: ${item }"/><br/>
</c:forEach>


-------------


4. 遍历Map


<%
Map<String,String> stu = new LinkedHashMap<String,String>();
stu.put("number", "N_1001");
stu.put("name", "zhangSan");
stu.put("age", "23");
stu.put("sex", "male");
pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item " items="${stu }">
<c:out value="${item.key }: ${item.value } "/><br/>
</c:forEach>




-------------


5. 循环状态对象


循环状态对象是用来说明循环的状态的,属性如下:
count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前项目。


<c:forEach var="item" items="${ns }" varStatus="vs" >
<c:if test="${vs.first } ">第一行:</c:if>
<c:if test="${vs.last } ">最后一行:</c:if>
<c:out value="第${vs.count } 行: "/>
<c:out value="[${vs.index } ]: "/>
<c:out value="name: ${vs.current } "/><br/>
</c:forEach>




------------------


导入JSTL格式化标签库


<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


<%
Date date = new Date();
pageContext.setAttribute("d", date);
%>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss "/>


---------


<%
double d1 = 3.5;
double d2 = 4.4; 
pageContext.setAttribute("d1", d1);
pageContext.setAttribute("d2", d2);
%>
<fmt:formatNumber value="${d1 }" pattern="0.00 "/><br/>
<fmt:formatNumber value="${d2 }" pattern="#.## "/>


* pattern:0.00,表示小数不足两位时,使用0补足两位
* pattern:#.##,表示小数不足两位时,有几位显示几位,不会补足




============================
============================
============================




自定义标签


自定义标签:


1. 实现Tag接口,即传统标签。不建议使用!
2. 实现SimpleTag接口,即简单标签。建议使用!


JavaWeb中还提供了SimpleTagSupport类,继承它要比实现SimpleTag接口方便。


-----------------


步骤:
1. 标签处理类:继承SimpleTagSupport类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
// 获取JspContext对象,再获取out对象,再向页面输出
// 获取到的JspContext其实就是当前页面的pageContext对象
this.getJspContext().getOut().write("<p>Hello SimpleTag!</p>") ;
}
}


2. 标签描述符文件(tld)


/WEB-INF/tlds/itcast.tld


<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" 
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 ">


<tlib-version>1.0</tlib-version> 
<short-name>itcast</short-name> 
<uri>http://www.itcast.cn/tags</uri> 
<tag> 
<name>hello</name> <!--标签名称-->
<tag-class>cn.itcast.tag.HelloTag</tag-class> <!--标签处理类名称-->
<body-content>empty</body-content> <!--标签体为空,即空标签-->
</tag>
</taglib>


3. jsp页面中使用自定义标签


<%@ taglib prefix="it"  uri="/WEB-INF/hello.tld"  %>
......
<it:hello/>


----------------------


有标签体的标签


1. 标签处理类
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
PageContext pc = (PageContext) this.getJspContext();
HttpServletRequest req = (HttpServletRequest) pc.getRequest();
String s = req.getParameter("exec");
if(s != null && s.endsWith("true")) {
// 获取标签体对象
JspFragment body = this.getJspBody() ;
// 执行标签体
body.invoke (null);
}


}
}


2. tld


<tag>
<name>hello</name>
<tag-class>cn.itcast.tags.HelloTag</tag-class>
<body-content>scriptless</body-content> <!--标签体内容不可以是java脚本,但可以是el、jstl等-->
</tag>


----------------------


不执行标签下面的页面内容


public void doTag() throws JspException, IOException {
this.getJspContext().getOut().print("<h1>只能看到我!</h1>");
throw new SkipPageException();
}


----------------------


带有属性的标签


public class IfTag extends SimpleTagSupport {
private boolean test;//设置属性,提供getter/setter方法
public boolean isTest() {
return test;
}
public void setTest (boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {//如果test为true,执行标签体内容
this.getJspBody().invoke(null);

}
}


<tag> 
<name>if</name> 
<tag-class>cn.itcast.tag.IfTag</tag-class> 
<body-content>scriptless</body-content>
<!--部署属性-->
<attribute> 
<name>test</name> <!--属性名-->
<required>true</required> <!--属性是否为必须的-->
<rtexprvalue>true</rtexprvalue> <!--属性值是否可以为EL或JSTL等-->
</attribute> 
</tag>


-------------------


MVC


1. 什么是MVC
  MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。


* 控制器Controller:对请求进行处理,负责请求转发;
* 视图View:界面设计人员进行图形界面设计;
* 模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;


2. Java与MVC


JSP Model1第一代:JSP + DB
JSP Model1第二代:JSP + javabean + DB
JSP Model2:JSP + Servlet + JavaBean + DB


-------------------


JavaWeb三层框架


* Web层(表述层):与Web相关的,例如jsp、servlet都是Web层
* Business层(业务逻辑层):封装业务逻辑,通常对应一个业务功能,例如登录、注册都是一个业务功能。
* Data层(数据访问层):封装对数据库的操作,通常对应一次对数据库的访问,例如添加、修改、删除、查询等。

[root@ecs-web ~]# systemctl restart php-fpm Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details. [root@ecs-web ~]# systemctl status php-fpm.service ● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Sat 2025-11-08 16:40:20 CST; 12s ago Process: 11309 ExecStart=/usr/sbin/php-fpm --nodaemonize (code=exited, status=78) Main PID: 11309 (code=exited, status=78) Nov 08 16:40:20 ecs-web systemd[1]: Starting The PHP FastCGI Process Manager... Nov 08 16:40:20 ecs-web php-fpm[11309]: [08-Nov-2025 16:40:20] ERROR: [/etc/php-fpm.d/zabbix.conf:6] unknown entry 'listen.acl_users' Nov 08 16:40:20 ecs-web php-fpm[11309]: [08-Nov-2025 16:40:20] ERROR: Unable to include /etc/php-fpm.d/zabbix.conf from /etc/php-fpm.conf at line 6 Nov 08 16:40:20 ecs-web php-fpm[11309]: [08-Nov-2025 16:40:20] ERROR: failed to load configuration file '/etc/php-fpm.conf' Nov 08 16:40:20 ecs-web php-fpm[11309]: [08-Nov-2025 16:40:20] ERROR: FPM initialization failed Nov 08 16:40:20 ecs-web systemd[1]: php-fpm.service: main process exited, code=exited, status=78/n/a Nov 08 16:40:20 ecs-web systemd[1]: Failed to start The PHP FastCGI Process Manager. Nov 08 16:40:20 ecs-web systemd[1]: Unit php-fpm.service entered failed state. Nov 08 16:40:20 ecs-web systemd[1]: php-fpm.service failed. [root@ecs-web ~]#
最新发布
11-09
<think>我们已知在PHP 5.4.16版本的php-fpm中,配置项`listen.acl_users`不被支持,导致重启失败。 解决方法:移除或注释掉该配置项。 步骤: 1. 编辑配置文件 `/etc/php-fpm.d/zabbix.conf` 2. 找到 `listen.acl_users = apache,nginx` 这一行 3. 在该行前面加上分号 (;) 将其注释,或者直接删除该行。 4. 保存文件后,重新测试配置文件并重启php-fpm服务。 具体命令如下: ```bash # 备份配置文件(可选) sudo cp /etc/php-fpm.d/zabbix.conf /etc/php-fpm.d/zabbix.conf.bak # 注释掉 listen.acl_users 行 sudo sed -i 's/^listen.acl_users = apache,nginx/;listen.acl_users = apache,nginx/' /etc/php-fpm.d/zabbix.conf # 或者直接删除该行(两种方法二选一) # sudo sed -i '/listen.acl_users = apache,nginx/d' /etc/php-fpm.d/zabbix.conf # 检查配置文件语法 php-fpm -t # 如果显示 "Configuration file is valid",则重启php-fpm sudo systemctl restart php-fpm ``` 注意:由于PHP 5.4.16版本较旧,可能还有其他不兼容的配置项。如果重启后仍然有问题,请检查日志文件(通常位于`/var/log/php-fpm/error.log`)以获取更多信息。 另外,考虑到PHP 5.4已经停止支持很久,建议升级到更高版本的PHP(如5.6或7.x),但升级需谨慎,因为可能涉及应用程序的兼容性。 引用说明:根据用户提供的引用[1]和[2],可以看出在安装PHP 5.4.16时可能会遇到依赖包版本冲突的问题。因此,如果决定升级PHP版本,也需要处理好这些依赖关系。 生成相关问题: </think>### 解决 PHP 5.4.16 php-fpm 因 `listen.acl_users` 配置失败的方法 #### 问题原因分析 `listen.acl_users` 配置项在 PHP 5.4.16 中不被支持(该功能在更高版本引入),导致配置文件解析失败。以下是具体解决步骤: #### 解决步骤 1. **修改配置文件** 编辑 `/etc/php-fpm.d/zabbix.conf`,注释或删除 `listen.acl_users` 行: ```bash sudo vi /etc/php-fpm.d/zabbix.conf ``` 修改前: ```ini listen.acl_users = apache,nginx # 会导致报错 ``` 修改后: ```ini ; listen.acl_users = apache,nginx # 添加分号注释掉 ``` 2. **添加替代权限设置**(必需步骤) 由于移除 `listen.acl_users` 会影响套接文件权限,需手动设置: ```bash # 创建套接文件目录 sudo mkdir -p /run/php-fpm # 设置目录权限(与配置文件中的用户一致) sudo chown apache:apache /run/php-fpm ``` 3. **验证配置文件语法** ```bash sudo php-fpm -t ``` 成功时应显示:`Configuration file is valid` 4. **重启服务** ```bash sudo systemctl restart php-fpm sudo systemctl status php-fpm # 检查状态应为active ``` #### 补充说明 1. **套接文件权限验证** 重启后检查套接文件权限: ```bash ls -l /run/php-fpm/zabbix.sock ``` 应显示:`srw-rw----. 1 apache apache` 2. **兼容性注意** PHP 5.4 已于2014年停止支持[^1],建议升级至少到PHP 5.6(支持至2018年)或更高版本,避免安全风险。 3. **替代解决方案** 若需保留 `listen.acl_users` 功能,可升级PHP版本: ```bash # 添加Remi仓库(示例) sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm sudo yum --enablerepo=remi-php56 install php php-fpm ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值