1 什么是JSP
Java Server Pages(Java服务器端页面),也和Servlet一样用于开发动态Web。
最大的特点:
- 写JSP就像在写HTML
- HTML只提供静态数据
- JSP中可以嵌入JAVA代码,为客户提供动态数据
2 JSP原理
JSP是怎么执行的?
- 代码层面没有问题
- 服务器内部工作
Tomcat中有一个work目录
IDEA中使用Tomcat的会在IDEA的Tomcat中也创建一个work目录
电脑中的地址:C:\Users\用户名\.IntelliJIdea2017.3\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\cookie01\org\apache\jsp
发现页面转变为了Java程序!
浏览器向服务器发出请求,不管是访问什么资源,都是在访问Servlet,JSP最终也会被转换为一个Java类
JSP本质上是一个Servlet
在JSP中只要是Java代码,就会原封不动输出
如果是Html代码,就会被转换为一行行的out.write("\r\n");
源码解析:
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
//判断请求类型
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
}
//内置一些对象
final javax.servlet.jsp.PageContext pageContext;//页面上下文
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;//applicationContext
final javax.servlet.ServletConfig config;//配置 config
javax.servlet.jsp.JspWriter out = null;//输出 out
final java.lang.Object page = this;//当前页
javax.servlet.jsp.JspWriter _jspx_out = null;//
javax.servlet.jsp.PageContext _jspx_page_context = null;
//输出
try {
//输出页面前的一些操作
response.setContentType("text/html;charset=UTF-8");//设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
//以上的这些对象,可以在jsp页面中直接使用!
//输出页面
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Hello</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" <h3>Hello</h3>\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
3 JSP基础语法
任何语言都有自己的语法,JSP相较于JAVA有自己一些扩充的语法,JAVA所有语法都支持。
JSP表达式:
<%--JSP表达式
作用:用来将程序输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
JSP脚本片段:
<%--JSP脚本片段--%>
<%
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
out.println("<h1>sum = "+sum+"</h1>");
%>
脚本片段的再实现:
<%--在代码中嵌入HTML元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>Hello,World! <%= i %></h1>
<%
}
%>
JSP声明:
会被编译到JSP生成的Java的类中,其他的生成到_jspService方法中!
在JSP中嵌入Java代码
<%--全局变量--%>
<%! static {
System.out.println("Servlet加载中~");
}
private int globalvar = 0;
public void jspInit(){
System.out.println("进入初始化方法~");
}
%>
4 JSP指令
<%--@ page 后跟参数类型和定义--%>
<%@ page ... %>
<%@ page errorPage="error/500.jsp" %>
<%--将两个页面合并--%>
<%@ include file="common/header.jsp"%>
<h1>网页主体</h1>
<%@ include file="common/footer.jsp"%>
<hr>
<%--jsp标签--%>
<%--通过静态资源获取,拼接页面,本质还是三个--%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>
5 JSP九大内置对象
- PageContext
- Request 存东西
- Response 存东西
- Session 存东西
- Application【ServletContext】存东西
- config 【ServletConfig】
- out
- page
- exception
<%--内置对象--%>
<%
pageContext.setAttribute("name1","明夜1");//保存的数据只在一个页面中有效
request.setAttribute("name2","明夜2");//保存的数据只在一次请求中有效,转发会携带
session.setAttribute("name3","明夜3");//保存的数据只在一个session中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","明夜4");//保存的数据在服务器中有效,从打开服务器到关闭服务器
%>
request:客户端向服务器发送的请求,产生的数据只需要取一次,用完就没用了。
session:产生的数据用户用完,可能还需要再次取到。
application:产生的数据用户用完,其他用户还能用,比如聊天记录
6 JSP标签、JSTL标签、EL表达式
需要引入以下依赖:
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式:${}
- 获取数据
- 执行运算
- 获取Web开发常用对象
JSP标签:
<jsp:forward page="jsptag2.jsp">
<jsp:param name="name" value="mingye"></jsp:param>
<jsp:param name="age" value="21"></jsp:param>
</jsp:forward>
JSTL标签:
- 引入对应的taglib
- 使用其中的方法
- 在Tomcat中导入对应的包
<form action="coreif.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果用户名为管理则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎您!"></c:out>
</c:if>
<c:out value="${isAdmin}"></c:out>