JavaEE-JSP基础
一.介绍
jsp作用: 便于使用java代码输出HTML
jsp在第一次被访问时,会被服务器翻译成Servlet类(从此驻留内存重复利用),以后对jsp访问都是由该Servlet执行输出
在/WEB-INF/web.xml 配置jsp路径映射
<servlet>
<servlet-name>myJsp</servlet-name>
<jsp-file>/myJsp.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>myJsp</servlet-name>
<url-pattern>/myJsp</url-pattern>
</servlet-mapping>
二.jsp基本成分
1.HTML元素
<html> <div> 在Servlet中直接输出到HTML: out.write("<html> <div>");
2.<%=java表达式 %>
<%=23%> 在Servlet中直接输出到HTML: out.write(23);
3.<% java源码 %>
直接复制到Servlet.service()方法内, 不同源码块可以相互访问
<% String str = "hello"; %>
<br/>
<% out.write(str) %>
4.<%! java源码 %>
直接复制到Servlet方法外,成为Servlet类成员
<%!
public class MyClass{}
public void myMethod(){}
static{}
{}
int i = -1;
%>
5.注释
<%--
jsp注释,只保留在jsp
--%>
<%
/* java注释 */
// Java注释 直接复制到java,但不被编译到class
%>
<!--
HTML注释,直接输出到HTML
-->
<!-- <% out.write("java没有被注释"); %> -->
翻译大致结果:
out.write("<!--");
out.write("java没有被注释");
out.write("-->");
三.jsp指令
1.page
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
language="java" 开发语言
import="java.util.*" 导入java包
extends="" 由jsp翻译的Servlet要继承的类(必须是Servlet子类)
isThreadSafe="false" 由jsp翻译的Servlet是否实现接口 SingleThreadModel (已经过时被抛弃)
pageEncoding="UTF-8" 通知jsp翻译引擎jsp编码(自动设置 contentType)
contentType="text/html; charset=UTF-8" 通知浏览器HTML编码
buffer="none|8kb" 设置jsp自带的输出缓冲区大小,默认8kb
autoFlush="true" 当jsp输出缓冲区装满时,是否自动刷新到浏览器(默认true,装满而没有刷新就会抛出异常)
isELIgnored="true" 当前jsp是否支持EL表达式(默认true,)
session="true" 当前jsp是否自动创建session对象(默认true, request.getSession())
errorPage="relative_url" 当前jsp出错时要跳转的错误页面url(可在web.xml统一配置)
isErrorPage="true|false" 当前jsp是否为错误页面(隐含exception对象, 上个页面抛出的异常)
在/WEB-INF/web.xml 统一配置错误页面
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
2.include
静态包含(include指令): 运行时多个jsp合并一个servlet,输出HTML
将include指令加入JSP中需要的位置即可, 因为是同一个servlet,所以变量可以共享
<body>
<%@ include file="/title.jsp"%>
<p>...段落...</p>
<%@ include file="/e.jsp"%>
</body>
动态包含(请求包含): 运行时多个jsp分别生成多个servlet,合并输出HTML(明显效率较低),变量无法共享.
3.taglib
引入标签库: <%@ taglib uri="x.tld文件命名空间" prefix="命名空间缩写" %>
四.jsp内置对象(九大隐式对象)
对象名 对象类型
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
pageContext PageContext 可以获取其它八大对象
out JspWriter 向浏览器输出HTML
exception Throwable
page Object 当前jsp生成的Servlet对象(很少用)
1).out
out 对象是jsp的输出对象, 相当于 response.getWriter(), 但是输出顺序不同
<p>
我是段落
<%
out.write("1");
response.getWriter().write("a");
out.write("2");
response.getWriter().write("b");
%>
</p>
输出: ab 我是段落 12
输出乱序的原因:
out对象自带输出缓冲区(大小受page指令的buffer限制),
当out缓冲区满时,自动刷新到response的缓冲区,
很明显,输出到浏览器时先输出response缓存区,在输出out(JSPWriter)缓冲区
所以,同时使用out(JSPWriter)和response输出会导致乱序
结论: 在jsp中应该使用out(JSPWriter)输出,不要使用response输出
2).pageContext
本身是域对象(内有map变量,Page域)
作用域: 只在当前jsp页面(四大作用域最小)
生存期: 对jsp访问时创建,访问结束时销毁
操作page域
pageContext.setAttribute(String name, Object value);
pageContext.getAttribute(String name);
pageContext.removeAttribute(String name);
操作四大域
pageContext.findAttribute(String name); //查找,顺序是小到大域: pageContext/request/session/application
pageContext.getAttribute(String name, int scope);
pageContext.getAttributeNamesInScope(int scope);
pageContext.removeAttribute(String name, int scope);
pageContext.setAttribute("name", "ps",PageContext.PAGE_SCOPE );
pageContext.setAttribute("name", "rs",PageContext.REQUEST_SCOPE );
pageContext.setAttribute("name", "ss",PageContext.SESSION_SCOPE );
pageContext.setAttribute("name", "as",PageContext.APPLICATION_SCOPE );
获取其他8个内置对象
pageContext.getRequest();
pageContext.getResponse();
pageContext.getSession();
pageContext.getServletContext();
pageContext.getServletConfig();
pageContext.getOut();
pageContext.getException();
pageContext.getPage();
提供请求转发和请求包含快捷方法
pageContext.include("/index.jsp");
pageContext.forward("/index.jsp");
简书: http://www.jianshu.com/p/495e90684311
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54646844
GitHub博客:http://lioil.win/2017/01/21/JSP.html
Coding博客:http://c.lioil.win/2017/01/21/JSP.html