JavaWeb笔记(4)
JSP
JSP技术
JSP的简介
- 什么是JSP
JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。
在JSP中java代码与HTML发共同存在,其中HTML代码用于展示静态的内容,java代码用来展示动态的内容。 - 为什么出现JSP技术
1997年Java Web中只有servlet,生成html技术也需要在servlet中完成,虽然servlet 也可以完成所有的输出工作,但是使用过程比较麻烦,部署也比较复杂。为了克服这些缺点,1999年SUN公司推出了JSP技术。该技术在生成HTML代码的时候相比servlet方便了许多 - 对于servlet和JSP技 术的理解:
- servlet:在java代码中嵌入html代码,更擅长编写java业务代码。
- JSP:在html中 嵌入java代码,更擅长页面展示。
JSP的运行原理
- jsp在第一次被访 问时会被Web容器翻译成servlet,即jsp本质上就是Servlet
- 过程:
第一次访间---->helloServlet. jsp---- >hel loServlet_ jsp. java---->编译运行 - 被翻译后的servlet在Tomcat的work目录中可以找到,使用IDEA会单独为项目维护- -个目录
- 通过观察发现jsp会转化为java文件,并且间接的继承了HttpServlet,实现了其中的主要方法,init、 service、 destory, 并且将html代码通过java方式输出给浏览器
JSP的脚本和注释
- JSP脚本
- <
%java代码%>
<%=java变量或表达式>
<%!Java代码%>
- <
- JSP注释
- Html注释:
<!--注释内容-->
- java注释:
//单行注释/*多行注释*/
- jsp注释:
<%--注释内容--%>
- Html注释:
JSP指令
JSP指令是指导jsp翻译和运行的命令,jsp包括三大指令
JSP指令内容
- page指令
- 属性最多的指令(实际开发中page指令默认)属性最多的一个指令,根据不同的属性,指导整个页面特性格式:
<%@ page属性名1= "属性值1”属性名2= "属性值2" ...%>
- 常用属性如下:
- language: jsp脚本中可以嵌入的语言种类contentType: response. set
- ContentType (text/html ;charset=UTF- 8)
- session:是否jsp在翻译时自动创建session
- import:导入java的包
- errorPage:当当前页面出错后跳转到哪个页面
- 属性最多的指令(实际开发中page指令默认)属性最多的一个指令,根据不同的属性,指导整个页面特性格式:
- include指令
- 页面包括(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
- 格式:
<%@ include file="被包含的文件地址"%>
- taglib指令
- 在jsp页面中引入标签库(jstl标签库、struts2标签库)
- 格式:
<%@ tagilb uri="标签库地址" prefix="前缀"%>
JSP隐式对象
什么是JSP隐式对象
- 当jsp被翻译成servlet的时候,service方法内部有九个对象定 义并初始化,这九个对象被称为隐式对象
JSP标签
什么是JSP标签
- JSP标签用来控制JSP的行为,执行- -些常用的JSP页面动作,通过标签可以实现很多行
java代码才能够实现的功能,比如请求转发的功能
常用的JSP标签
- 页面包含(动态包含) :
<jsp:include page="被包含的页闻"/>
- 请求转发:
<jsp:forward page=" 要转发的资源”/>
JSTL
EL表达式
EL表达式概述
- EL全名为Expression Language. 它提供了在JSP中简化表达式的方法,让Jsp的代码更加简化,可以嵌入在jsp页面内部,减少jsp脚本的编写。
EL从域中取数据
- jsp脚本:
<%=request.getAttribute (name)%>
- EL表达式替代上面的脚本:
${requestScope.name}
- EL最主要的作用是获得四大域中的数据,格式
${EL表达式}
- EL获得pageContext域中的值:
$(pageScope.key);
- E获得request域中的值:
$GrequestScope.key);
- EL获得session域中的值:
${sessi onScope.key}:
- EL获得application域中的值:
$aplicationScope.key};
- El从四个域中获得某个值
$(key};
- —同样是依次从pageContext域,request域, sessision域,application域中获取属性,在某个域中获取后将不再向后寻找。
- EL获得pageContext域中的值:
EL的内置对象和执行表达式
EL的内置对象
- pageScope, requestScope, sess ionScope, applicationScope-获取JSP中域中的数据
- param, paramValues - 接收参数.
相当于request.getParameter() request.getParameterValues()
- header, headerValues-获取请求头信息
相当于request.getHeader (name)
- ini tParam-获取全局初始化参数
相当于this.pgetServletContext(). getInitParameter(name)
- cookie-WEB开发中cookie
相当于request.getCookies()-->cookie.getName ()--->cookie.getValue()
- pageContext - WEB开发中的pageContext.
- pageContext获得其他八大对象I
JSTL简介
简介
- JSTL (JSP Standard Tag Library), JSP标准标签库, 可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同EL-一样也是要代替js页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库
JSTL-if标签
FollowServlet.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "FollowServlet",urlPatterns = "/follow")
public class FollowServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String follow=request.getParameter("follow");
request.setAttribute("follow",follow);
request.getRequestDispatcher("/jstl/jstl.jsp").forward(request,response);
}
}
jstl/jstl.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--使用JSTL的时候需要配合EL表达式--%>
<c:if test="${requestScope.follow eq 1}">
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
</body>
</html>
JSTL-forEach标签
<e: forEach>
用来循环遍历集合对象中的元素,如List、 Map、 数组等和java代码中的for循环-一样,它也有两种形式。
jstl/jstl.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--使用JSTL的时候需要配合EL表达式--%>
<c:if test="${requestScope.follow eq 1}">
取消关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<c:if test="${requestScope.follow eq 0}">
关注
<%--如果test等于true 则会执行内部代码,如果是false则不会执行内部代码--%>
</c:if>
<%
List<User> list=new ArrayList<>();
User user1=new User();
user1.setName("小强");
user1.setSex("男");
User user2=new User();
user2.setName("小丽");
user2.setSex("女");
list.add(user1);
list.add(user2);
for (int i = 0; i < list.size(); i++) {
System.out.println(i);
}
request.setAttribute("list",list);
for (User user : list) {
System.out.println(user.getName());
}
%>
<c:forEach begin="0" end="${list.size()-1}" var="i">
${list[i].name}
</c:forEach>
<%--items代表的是一个集合或者是数组--%>
<c:forEach items="${list}" var="user">
${user.name}
</c:forEach>
</body>
</html>