一、jsp是如何执行的?
step1,
容器将jsp文件转换成一个servlet类。
html(css,js) -----> service方法里,使用
out.write输出。
<%java语句;%> -----> service方法里,照搬。
<%= java表达式%> --->service方法里,使用
out.print(java表达式)输出。
step2,容器调用servlet。
二、jsp隐含(内置)对象
1.request
-HttpServletRequest
2.response
-HttpServeltResponse
3.out
-JSPWriter类似于PrintWriter
4.config
-ServletConfig
5.application
-ServletContext
6.exception
-Throwable
-jsp翻译成的Servlet所抛出到异常
7.session
-httpsession
8.page
-Object相当于this,用来指代翻译成的那个Servlet
9.pageContext
-是管理者,通过它可以获取其他8个隐含对象
三、如何在jsp上使用隐含对象呢?
<%Object user=session.getAttribute(“user”);%>
<%=session.getAttribute(“user”)%>
四、设计模式
1.Model 1
<%@page pageEncoding="utf-8" contentType="text/html; charset=utf-8" import="entity.*,java.util.*"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>查询员工</title>
</head>
<body>
<table border="1" cellspacing="0" width="40%">
<tr>
<td>编号</td>
<td>姓名</td>
<td>职位</td>
<td>月薪</td>
</tr>
<%
List<Emp> list=(List<Emp>)request.getAttribute("emps");
if(list!=null){
for(Emp e:list){
%>
<tr>
<td><%=e.getEmpno() %></td>
<td><%=e.getEname() %></td>
<td><%=e.getJob() %></td>
<td><%=e.getSal() %></td>
</tr>
<%
}
}
%>
</table>
</body>
</html>
2.MODEL 2
引入了MVC
模式,是代码的分层思想:
M:model 业务层,用来处理业务 (DAO)
V:view 视图层,用来展现数据 (JSP)
C:control 控制层,用来进行调度,是业务层和视图层的桥梁(Servlet)
其目的是要将代码解耦,便于团队开发及维护。
五、转发和重定向
1.转发和重定向的相同点:都是解决web组件之间的跳转问题
web组件:servle/jsp
2.转发和重定向的不同点:
转发:依赖时用转发
重定向:不依赖时用重定向
3.官方解释
转发:
(1)一次请求;地址不变;
(2)一个请求只有一个request
(3)a和b可以通过它共享数据
(4)只能转发到项目内部的资源
重定向:
(1)2次请求 .地址改变
(2).两个请求有两个request
(3)a和b无法通过它共享数据
(4)可以重定向到项目外部的资源
4.一般情况:
查询时用转发
增加、修改、删除后重定向到查询
六、EL表达式
见例子
1.取Bean
2.运算
3.获取请求参数
七、JSTL
step1:将JSTL标签对应的jar文件拷贝到WEB-INF/lib目录下
step2:使用taglib指令导入要使用的JSP标签
<%@atglib uri=”” prefix=””%>
uri:;JSP标签的命名空间
prefix:命名空间的前缀
<%@page pageEncoding="utf-8" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>EL和JSTL</title>
</head>
<body>
<h1>JSTL</h1>
<!-- 1.if -->
<p>
<c:if test="${stu.sex=='M'}">男</c:if>
<c:if test="${stu.sex=='F'}">女</c:if>
</p>
<!-- 2.choose -->
<p>
<c:choose>
<c:when test="${stu.sex=='M'}">男</c:when>
<c:otherwise>女</c:otherwise>
</c:choose>
</p>
<!-- 3.forEach items:声明遍历的数据 var:给每次循环所获得数据命名-->
<p>
<c:forEach items="${stu.interests }" var="i">
${i }
</c:forEach>
</p>
<h1>EL</h1>
<!-- 1.获取Bean属性 -->
<!-- -request.getAttribute("stu").getName() -->
<p>姓名:${stu.name}</p>
<!-- -request.getAttribute("stu").getAge() -->
<p>年龄:${stu["age"]}</p>
<!-- -request.getAttribute("stu").getCouse().getId() -->
<p>课程id:${stu.course.id}</p>
<!-- EL的取值范围:
1.EL默认从如下4个对象中依次取值取值page、request、session、application,这4个隐含对手是EL默认的取值范围
2.也可以指定取值范围requestScope.stu.name/sessionScope.stu.name
3.设计默认取值的目的是为了开发者经常写范围,为了简化EL表达式-->
<p>性别:${requestScope.stu.sex }</p>
<!-- 2.支持运算 -->
<p>年龄+5:${stu.age+5 }</p>
<p>20-30间:${stu.age>20 && stu.age<30 }</p>
<p>判空:${empty stu }</p>
<!-- 3.获取请求参数 -->
<p>参数:${param.user }</p>
</body>
</html>