深入理解JSP原理

JSP工作原理:

1.JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,是一种动态网页技术标准。
2.说明:jsp在返回给浏览器的数据默认是text/html格式的,默认编码和pageEncoding一致;
3.<%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8" import="java.util.*"%>
   - pageEncoding:设置JSP文件自身的编码;
   - contentType:设置向浏览器输出的内容的格式及编码;
4.jsp可以不单独使用,可以被其他jsp引用。由于其他JSP内已经包含了head、body,所以该JSP可以省略这2个标签;
5.jsp中可以直接写HTML、CSS、JS;

5.翻译过程:

隐含(内置)对象:

1. request<HttpServletRequest>
2. response<HttpservletResponse>
3. out<JspWriter和PrintWriter一样>
4. config<ServletConfig>
5. application<ServletContext>
6. exception<Throwable、必须在发生异常时才能使用>
7. session<HttpSession>
8. page<Object、就是对当前JSP的引用其实就是对Servlet的引用、相当于this>
9. pageContext<PageContext、页面的环境可以给页面提供数据、通过该对象可以获取其他8个对象>

使用示例:

1. <% String str=request.getParameter("user");%>
2. <%=request.getParameter("user");%>

开发模式(MVC):

1.web组件的内容包含了HTML和Java,耦合度高,不利于团队开发和维护代码;
2.MVC模式是经典的设计模式,是代码的分层思想:
   - M:Model,即业务层,用来处理业务;
   - V:View,即视图层,用来显示数据;
   - C:Controller,即控制层,用来管理和调度程序,它是M和V的桥梁;
3.其目的是降低代码之间的耦合度,便于团队开发及维护;

转发和重定向:

1.转发和重定向都是用来解决WEB组件之间的跳转问题;
2.WEB组件:处理请求的组件,Servlet和JSP;
3.依赖时用转发,不依赖时用重定向;
4.转发:
   - 一次请求;
   - 地址不变;
   - 共用一个request,所以可以共用数据;
   - 不能转发到外部资源;
//findEmp是网名,即跳转到另一个Servlet组件上
res.sendRedirect("findEmp");
5.重定向:
   - 二次请求;
   - 地址改变;
   - 两个request,不能通过它共享数据;
   - 可以重定向到外部资源;
//构造数据,查询所有的员工
EmpDao dao = new EmpDao();
List<Emp> list = dao.findAll();
		
//将请求转发给JSP
//1.将数据绑定在request上,以提交给JSP。
req.setAttribute("emps", list);
//2.转发给JSP
req.getRequestDispatcher("emp_list.jsp").forward(req, res);
6.通常,查询时用转发;增加、修改、删除后重定向到查询;

EL和JSTL:

 JSTL原理:


EL和JSTL使用案例:

1.JSTL常见的使用if、choose、forEach以及自定义标签:
<%@page pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="/lhh-tag" prefix="s"%>
<!doctype html>
<html>
<head>
   <meta charset="utf-8">
</head>
<body>
 <h1>JSTL</h1>
 <!-- 1. if -->
 <c:if test="${stu.sex=='M' }">男</c:if>
 <c:if test="${stu.sex=='F' }">女</c:if>
 <!-- 2. choose -->
 <c:choose>
	<c:when test="${stu.sex=='M' }">男</c:when>
	<c:otherwise>女</c:otherwise>
 </c:choose>
 <!-- 3. forEach 
	每次循环JSTL会创建一个对象,用来存储循环次数等值。可以通过varStatus属性声明该对象的变量,从而来访问该对象,获取循环次数等值。
 -->
 <c:forEach items="${stu.interests }" var="itr" varStatus="s">
	${itr },${s.index },${s.count }
 </c:forEach>
 <!-- 4.自定义标签 -->
 <s:sysdate />
 <s:sysdate format="yyyy-MM-dd" />
</body>
2.EL常见使用获取bean属性、支持运算、获取请求参数:
<%@page pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="/lhh-tag" prefix="s"%>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
	<h1>EL</h1>
	<!-- 
	 1.获取bean属性
	 stu.name == request.getAttribute("stu").getName()
	 stu.course.id == request.getAttribute("stu").getCourse().getId()
	-->
	<p>姓名:${stu.name }</p>
	<p>年龄:${stu["age"] }</p>
	<p>课程ID:${stu.course.id }</p>
	<!-- 
		EL默认从以下4个对象(范围)中依次取值:
		  page,request(*),session(*),application
		即:
		  -> page.getAttribute("stu")
		  -> request.getAttribute("stu")
		  -> session.getAttribute("stu")
		  -> application.getAttribute("stu")
		取值对象(范围)也可以指定:
		  sessionScope.stu.name
	-->
	<p>课程:${requestScope.stu.course.name }</p>
	<!-- 2.支持运算 -->
	<p>年龄+10:${stu.age+10 }</p>
	<p>是否大于20:${stu.age>20 }</p>
	<p>是否介于20-30:${stu.age>20 && stu.age<30 }</p>
	<p>是否为空:${empty stu }</p>
	<p>是否为空换个写法:${stu == null }</p>
	<!-- 3.获取请求参数:
	   param.x == request.getParameter("x")
	   paramValues.y == request.getParameterValues("y")
	 -->
	<p>参数:${param.x }</p>
</body>
</html>






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值