Servlet中的技术

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

服务端:

  1. 获得客户端发送请求的url
  2. 解析url路径,获得servlet中的***url***(/helloServlet)
  3. 通过解析的***url***,在内存中进行查找到对应的servletMapping
  4. 获得servletMapping中的servletName
  5. 通过servletName获得servlet标签中的ServletClass
  6. 通过反射实例化servlet对象Class.forName(完全限定名)
  7. 通过反射调用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}  <!-- 判断是否为空 -->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值