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>