一、JSTL
1.1 概念
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
首先,将jstl jar包放到web app libraries下,这样就导入jar包了
1.2 使用
在一个jsp下,taglib标签注明引入的标签,在使用引入标签的方法标签进行使用,页面显示效果如下
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:out value="你好">你好</c:out>
<c:set var="text" value="你好111" scope="session"></c:set>
${sessionScope.text}
<table>
<tr><td>ID</td><td>账号</td><td>密码</td></tr>
<c:forEach items="${userlist}" var="user">
<tr><td>${user.id }</td><td>${user.username}</td><td>${user.userpass}</td></tr>
</c:forEach>
</table>
<h1>
<c:if test="${empty LOGINUSER}">
请登录
</c:if>
<c:if test="${!empty LOGINUSER}">
${LOGINUSER.username}
</c:if>
</h1>
<c:forEach begin="0" end="9" step="1" var="temp">
${temp }
</c:forEach>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:forTokens items="12345123412341212" delims="3" var="str">
${str }
</c:forTokens>
<c:set var="it" value="文本" scope="request"></c:set>
<c:choose>
<c:when test='${it eq "数字" }'>
这是一个数字
</c:when>
<c:when test='${it eq "文本" }'>
这是一个文本
</c:when>
<c:otherwise>
我也不知道是啥
</c:otherwise>
</c:choose>
<sql:setDataSource driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydata?useSSL=false&characterEncoding=utf8"
user="root"
password="123456" var="ds" scope="request"
/>
<sql:query sql="select * from t_user" dataSource="${ds }" var="list" scope="request"></sql:query>
<c:forEach items="${list.rows }" var="row">
${row.username }
</c:forEach>
</body>
</html>
二、jsp生命周期
三、Filter 过滤
以LoginFilter为例,当访问到/pages/cart时,就会执行该filter,根据条件判断是否通过,当通过时,执行 chain.doFilter(request, response); 通过过滤 执行下一阶段
@WebFilter("/pages/cart")
public class LoginFilter implements Filter{
public void destroy() {
//销毁时执行的方法
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
//登陆验证? 登陆不登陆有何区别
//登录后的账号的session中存在LOGINUSER的值
//获取session对象,从中取LOGINUSER对应的值,取得到就登陆过
if(req instanceof HttpServletRequest) {
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp;
HttpSession session=request.getSession();
Object obj=session.getAttribute("LOGINUSER");
if(obj!=null) {
chain.doFilter(request, response);
}else {
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
response.sendRedirect(basePath+"index.html");
}
}
return;
}
public void init(FilterConfig arg0) throws ServletException {
//初始化的方法
}
PageServlet是一个跳转器 过滤完就会执行到servlet,这里就执行到该servlet,然后通过servlet跳转到web-inf下的jsp文件
//跳转器
@WebServlet("/pages/*")
public class PageServlet extends HttpServlet{
/**
* 跳转页面用的服务
* 规范page/cart 跳转到cart.jsp
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uri=request.getRequestURI();
//xiangmu/page/cart
int index=uri.lastIndexOf("/");
//获取最后分路径
String page=uri.substring(index+1);
request.getRequestDispatcher("../WEB-INF/page/"+page+".jsp").forward(request, response);
}
}
在添加一个编码格式的过滤器,凡是经过/*的网页 都需要经过该过滤器,执行该过滤器的doFilter方法
@WebFilter("/*")
public class CharterFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//设置请求对象的编码格式
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void destroy() {}
public void init(FilterConfig filterConfig) throws ServletException {} }
四、监听
以MySessionListener 为例,创建一个session监听器,当创建该session对象时,执行sessioncreated方法,销毁该session对象时,执行sessiondestroyed方法
@WebListener
public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{
public void sessionCreated(HttpSessionEvent se) {
HttpSession session=se.getSession();
ServletContext sc=session.getServletContext();
Integer onlineNum=(Integer)sc.getAttribute("ONLINE_NUM");
if(onlineNum==null) {
sc.setAttribute("ONLINE_NUM", 1);
}else {
sc.setAttribute("ONLINE_NUM", onlineNum+1);
}
}
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session=se.getSession();
ServletContext sc=session.getServletContext();
Integer onlineNum=(Integer)sc.getAttribute("ONLINE_NUM");
sc.setAttribute("ONLINE_NUM", onlineNum-1);
//System.out.println("=-----saiodjnioas");
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
HttpSession session=event.getSession();
ServletContext sc=session.getServletContext();
Integer onlineNum=(Integer)sc.getAttribute("ONLINE_LOGIN_NUM");
if("LOGINUSER".equals(event.getName())) {
if(onlineNum==null) {
sc.setAttribute("ONLINE_LOGIN_NUM", 1);
}else {
sc.setAttribute("ONLINE_LOGIN_NUM", onlineNum+1);
}
}
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
}
五、一些html语句
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="static/img/back.jpg">
</head>
<body>
<img src='static/img/back1.jpg' alt="图片不见了">
<a href="https://www.baidu.com" target="_blank">百度</a>
<a href="javascript:void(0);">空链接</a>
<a href="javascript:;">空链接</a>
<a href="mailto:"></a>
<div>34</div>
<span></span>
<h1>h1标题大 </h1><h6>h6标题小</h6>
<p>段落</p>
</body>
</html>