Servlet
1、Servlet的执行过程
|<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.yang.sevlet.HelloServlet</servlet-class></servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
客户端:
http://localhost:8080/day01**/helloServlet**?name=zhangsan
服务端:
- 获得客户端发送请求的url
- 解析url路径,获得servlet中的***url***(/helloServlet)
- 通过解析的***url***,在内存中进行查找到对应的servletMapping
- 获得servletMapping中的servletName
- 通过servletName获得servlet标签中的ServletClass
- 通过反射实例化servlet对象Class.forName(完全限定名)
- 通过反射调用service方法,完成请求和响应
2、Servlet的生命周期
servlet的实例化:调用的是无参构造方法,在第一次向某个servlet发送请求的时候;
服务器启动的时候就实例化了对象
servlet是属于单例模式的,故在整个项目中只存在一个servlet对象
servlet的初始化:
调用init() 方法,给servlet加载一些远程的数据
servlet提供服务:
调用service()方法,完成请求接收,处理,响应
servlet销毁:
调用destory()方法,在服务器关闭的时候,调用该方法进行资源的释放
3、Filter过滤器
Filter和Servlet一样,也是属于javaee体系中的组件,运行在服务端的组件。
客户端到服务端的请求或者服务器到客户端的响应数据都可以使用Filter过滤。
Filter相当于在服务器上所有的请求资源前面建立起一道网,可以对客户端到服务端的请求,服务端到客户端的响应进行过滤或者拦截。
情况一:过滤器受到请求后,将请求转发给后面的servlet或者下一个Filter(完成具体的处理和响应)。
情况二:过滤器受到请求直接给客户端响应。拒绝访问后面的资源。
过滤器先于Servlet对象创建,且为单例模式
<!-- 配置单个过滤器 -->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.yang.filter.LoginFliter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置多个过滤器链,执行顺序为配置顺序 -->
<!-- 过滤器1 -->
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.yang.filter.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 过滤器2 -->
<filter>
<filter-name>filter2</filter-name>
<filter-class>com.yang.filter.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>filter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 过滤器3 -->
<filter>
<filter-name>filter3</filter-name>
<filter-class>com.yang.filter.Filter3</filter-class>
</filter>
<filter-mapping>
<filter-name>filter3</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、Listener监听器
Listener属于javaee服务端技术,有一个对象去监听另一对象的状态(如对象的创建,对象的销毁,以及对象中数据的变化)
监听器的分类:用来监听request(ServletRequest)对象的监听器
用来监听session(HttpSession)对象的监听器
用来监听application(ServletContext)对象的监听器
监听器的创建先于Filter过滤器,是最早的
<!-- 监听器的配置 -->
<!-- 配置request监听器- -->
<listener>
<listener-class>com.yang.listener.RequestListener</listener-class>
</listener>
<!-- 配置session监听器- -->
<listener>
<listener-class>com.yang.listener.SessionListener</listener-class>
</listener>
<!-- 配置application监听器- -->
<listener>
<listener-class>com.yang.listener.ApplicationListener</listener-class>
</listener>
5、EL表达式
el表达式访问的是四大作用域中保存的内容(pageContext,Request,Session,Application),范围由小到大;
5.1、El表达式访问简单数据类型
<% request.setAttribute("key","value") %>
简单数据类型: ${key}
5.2、El表达式访问List集合
<%
Student s = new Student();
s.setId(12);
s.setName("达文西");
Student s2 = new Student();
s2.setId(22);
s2.setName("凌凌漆");
Student s3 = new Student();
s3.setId(33);
s3.setName("苏察哈尔灿");
//
List<Student> list = new ArrayList<>();
list.add(s);
list.add(s2);
request.setAttribute("list", list);
%>
el表达式访问List集合对象
${list[0].id}------${list[0].name}<br/>
${list[1].id}------${list[1].name}<br/>
${list[2].id}------${list[2].name}<br/>
5.3、El表达式访问Map集合
注:Map集合中的key不可以使用Integer类型,最好使用String类型作为key
<%
Student s = new Student();
s.setId(12);
s.setName("达文西");
Student s2 = new Student();
s2.setId(22);
s2.setName("凌凌漆");
Student s3 = new Student();
s3.setId(33);
s3.setName("苏察哈尔灿");
//
Map<String, Student> map = new HashMap<>();
map.put("111", s);
map.put("222", s2);
map.put("333", s3);
req.setAttribute("map", map);
%>
el表达式访问Map集合对象
${map['111'].id}-----${map['111'].name}
${map['222'].id}-----${map['222'].name}
${map['333'].id}-----${map['333'].name}
6、JSTL标准标签库
6.1、JSTL的核心标签
6.1.1、c:if标签
<%
Integer sex = 1;
pageContext.setAttribute("sex", sex);
%>
<%-- c:if 标签
test = 判断条件,结合el表达式
所有的比较都在{}里面,也可以比较两个对象
--%>
<c:if test="${sex == 1 }">
男
</c:if>
<c:if test="${sex == 0 }">
女
</c:if>
6.1.2、c:foreach
<%
Student s = new Student();
s.setId(12);
s.setName("达文西");
Student s2 = new Student();
s2.setId(22);
s2.setName("凌凌漆");
Student s3 = new Student();
s3.setId(33);
s3.setName("苏察哈尔灿");
//
List<Student> list = new ArrayList<>();
list.add(s);
list.add(s2);
list.add(s3);
pageContext.setAttribute("list", list);
%>
<%-- c:foreach标签
var 定义变量,表示集合中的元素
items 表示需要遍历的集合,从作用域中获取
begin 表示开始遍历的位置
end 表示结束的位置
step 遍历的步长
--%>
<c:forEach var="list" items="${list }" begin="0" end="2" step="1" varStatus="ls">
${list.id } --------- ${list.name } ===== ${ls.index }<br/>
</c:forEach>
6.1.3、c:choose
%
pageContext.setAttribute("grade", 3);
pageContext.setAttribute("score", 79);
%>
<%-- c:choose 选择结构,可以是等值判断,也可以是条件判断 --%>
<c:choose>
<c:when test="${grade == 1 }">☆</c:when>
<c:when test="${grade == 2 }">☆☆</c:when>
<c:when test="${grade == 3 }">☆☆☆</c:when>
<c:when test="${grade == 4 }">☆☆☆☆</c:when>
<c:when test="${grade == 5 }">☆☆☆☆☆</c:when>
<c:otherwise>○○○○</c:otherwise>
</c:choose>
<br/><br/><hr/>
<c:choose>
<c:when test="${score>=90 && score <=100 }">优秀</c:when>
<c:when test="${score>=75 && score <90 }">良好</c:when>
<c:when test="${score>=60 && score <=75}">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
6.1.4、c:redirect
<%-- c:redirect: 在页面上 实现重定向的跳转
url 指定需要跳转的路径
--%>
<c:redirect url="el.jsp">
<%-- c:params 指定跳转路径的参数
name 参数名
value 参数值
--%>
<c:param name="age" value="10"></c:param>
</c:redirect>
6.2、JSTL格式化标签
<%
double balance = 1234567.0987;
pageContext.setAttribute("balance", balance);
pageContext.setAttribute("date", new Date());
%>
<%-- 数字格式化 --%>
数字格式化一:
<fmt:formatNumber value="${balance }" type="currency"></fmt:formatNumber><br/><br/>
数字格式化二:
<fmt:formatNumber value="${balance }" type="number" pattern="#,###.#####"></fmt:formatNumber><br/><br/>
<%-- 日期格式化 --%>
日期格式化一:
<fmt:formatDate value="${date }"/><br/><br/>
日期格式化二:
<fmt:formatDate value="${date }" type="both"/><br/><br/>
日期格式化三:
<fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/><br/><br/>
6.3、JSTL的数据库标签
<sql:setDataSource
driver="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost/day01?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false"
user="root"
password="****"
var="conn"
/>
<!-- 查询数据库 -->
<sql:query var="result" sql="select * from user" dataSource="${conn }">
</sql:query>
<!-- 遍历 -->
<!-- 这里result可类型表示整个表的数据,想要遍历就是在得到一行为一个对象进行遍历 -->
<c:forEach var="user" items="${result.rows }">
${user.id }----${user.name } ----${user.address }<br/><br/>
</c:forEach>
6.4、JSTL其他特殊说明
<%
pageContext.setAttribute("key","zhansan");
request.setAttribute("key","lisi");
session.setAttribute("key","wangwu");
application.setAttribute("key","fengqi");
%>
<!-- 通过指定EL表达式的作用域访问范围 -->
${sessionScope.key}
<!-- 支持的运算 -->
${1 eq 2} <!--相等 -->
${1 gt 2} <!--大于 -->
${1 lt 2} <!-- 小于 -->
${1 ge 2} <!-- 大于等于-->
${1 le 2} <!-- 小于等于 -->
${empty keys} <!-- 判断是否为空 -->