JSP
概念:
- 长的像html页面的servlet。当访问这个jsp页面的时候tomcat会把jsp变成xxx_servlet.java文件,并且执行编译后的servlet代码
向jsp中插入java代码
- <% java code%>
jsp指令
- 格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %>
- page指令:contentType:告诉浏览器如何解析
– import导包
– isErrorPage:标识当前也是是否是错误页面,true可以使用exception - include指令:功能:把多个页面中的共同数据提取到单个页面,多个页面引入这个页面即可好处:以后修改一个页面代码就行了 <%@include file=“nav.jsp”%>
- taglib指令
注释
- html注释:
<!-- -->:只能注释html代码片段 - jsp注释:推荐使用
<%-- --%>:可以注释所有
配置全局异常处理的页面
- 在web目录下引入404.html和505.html
- 配置WEB.XML
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
jsp九大内置对向raps process
- 在jsp页面中不需要创建,直接使用的对象
* 一共有9个:
变量名 真实类型 作用
* pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
* request HttpServletRequest 一次请求访问的多个资源(转发)
* session HttpSession 一次会话的多个请求间
* application ServletContext 所有用户间共享数据,一个项目下的所有的servlet
* response HttpServletResponse 响应对象
* page Object 当前页面(Servlet)的对象 this
* out JspWriter 输出对象,数据输出到页面上
* config ServletConfig Servlet的配置对象
* exception Throwable 异常对象
4 个作用域的区别
-
pageContext 这个作用域中存储的数据只在当前页面有效
-
request 在一次请求中有效,比如说客户端将表单数据发送给servlet这是一次请求。或者说AServlet转发到BServlet这也是一次请求
-
session:在多次请求中有效。用于区分用户。
-
application 表示servletContext对象,可以被所有的servlet共享,可以被所有当用户所共享
MVC概念
- M model javabean
- V view jsp
- C controller servlet
EL 表达式
起源
- js对象获取属性的两种方式
格式
- ${obj==null} 等价于 ${empty obj}
- o b j ! = n u l l 等 价 于 {obj!=null}等价于 obj!=null等价于{not empty obj}
- 判断含有长度属性的对象(string,array,集合)时不仅仅判断是否为空,还会判断长度是否为0
概念
- Expression Language 表达式语言,可以放表达式,也可以放域中对应的名称
- 所有EL都是以${为起始、以}为结尾的。
- EL 提供 . 和 [ ] 两种运算符来导航数据,. 和 [ ] 也可以同时混合使用
- 当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ]
- EL 变量
EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。
EL四大域对象的优点
- 为了提高查找速度默认获取对象写法是 n a m e , 先 从 p a g e S c o p e 作 用 域 找 , 找 不 到 从 r e q u e s t S c o p e 作 用 域 找 , 再 找 不 到 从 s e s s i o n S c o p e 中 找 , 最 后 从 a p p l i c a t i o n S c o p e 找 。 为 了 加 快 查 找 速 度 可 以 直 接 指 定 从 哪 找 {name},先从pageScope作用域找,找不到从requestScope作用域找,再找不到从sessionScope中找,最后从applicationScope找。为了加快查找速度可以直接指定从哪找 name,先从pageScope作用域找,找不到从requestScope作用域找,再找不到从sessionScope中找,最后从applicationScope找。为了加快查找速度可以直接指定从哪找{sessionScope.name}。
- 避免重名问题 比如说request和session作用域中都有name,但是想要使用session作用域中的name,就必须加sessionScope
- pageScope
- requestScope
- sessionScope
- applicationScope
EL获取域对象中数据的格式
- 存在域对象的变量是简单类型 ${name}
- 使用EL获取对象的属性的语法 p e r s o n . n a m e 或 者 {person.name}或者 person.name或者{person[“name”]},本质上会调用getter方法
- 使用EL获取数组,集合中的数据 ${arr[索引]} ${map[“key”]}
pageContext的作用
- 1.作为域对象
- 2.获取其他8个JSP内置对象,获取虚拟路径${pageContext.request.contextPath}
EL表达式中四个域对象与JSP四个内置域对象的关系
- EL pageScope, requestScope,sessioScope, applicationScope
- JSP pageContext ,request,session ,application
- EL的域对象只能根据属性,获取对应的值(获取)
- JSP的域对象是共享数据的,添加,删除,获取数据
- requset,responsee还能获取头信息
- 总结:EL表达式的语法和JS一致,想要获取数据要么使用.要么使用[],如果在不同的作用域中出现了同名的变量,需要前面加XXScope
JSTL标签库
概念
- JavaServer Pages Tag Library,Apache组织提供的开源的jsp标签
- 作用是简化jsp上的java代码
- 使用步骤:
- 导入jstl相关jar包
- 引入标签库:taglib指令: <%@ taglib %>
- 使用标签
if
- 格式<c:if test="${ 条件}"> 条件成立执行 </c:if> 条件一般是跟域中的值有关系
<%
pageContext.setAttribute("age",30);
%>
<c:if test="${age>=30}">
<span style="color: greenyellow">你真好看</span>
</c:if>
choose
- 格式: 相当于switch 语句 otherwise=default
- <c:choose>
<c:when test="${}">执行语句</c:when>
<c:otherwise>执行语句</c:otherwise>
</c:choose>
<%
request.setAttribute("number",3);
%>
<c:choose>
<c:when test="${number==1}"><span style="color: indianred">1</span></c:when>
<c:when test="${number==2}"><span style="color: indianred">2</span></c:when>
<c:when test="${number==3}"><span style="color: indianred">3</span></c:when>
<c:when test="${number==4}"><span style="color: indianred">4</span></c:when>
<c:when test="${number==5}"><span style="color: indianred">5</span></c:when>
<c:otherwise>你的输入有误</c:otherwise>
</c:choose>
foreach
- 格式 items相当于容器(数组,集合变量名称),var 取出来的元素变量名称,status表示状态,后面的名字可以随意起,有两个属性index索引,count 遍历的轮次
- <c:forEach items="${listt}" var=“xx” varStatus=“s”>
${xx} ${s.index} ${s.count}
</c:forEach>
<%
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"孙悟空","bajie","shaseng","tangshen");
pageContext.setAttribute("listt",list);
%>
<c:forEach items="${listt}" var="xx" varStatus="s">
${xx} ${s.index} ${s.count}
</c:forEach>
三层架构
- controller/web: 就是servlet
- 获取并且封装表单数据
- 负责页面的跳转
- 调用service层,将表单的数据传递过去
- service
- 编写纯粹的业务逻辑,不需要考虑如何获取表单数据,也不需要考虑如何操作数据库
- dao:
- 数据库的增删改查
书写步骤
- 在dao包中定义UserDao接口在接口中定义功能
- 编写UserDao的实现类
- 在service包中UserService
- 编写UserService的实现类
- 编写Servlet,调用service