首页 > 代码库 > JSP
JSP
1 什么是JSP
a) html + java代码 + JSP动态标签
b) 在静态页面上添加动态信息就可以了,如果是Servlet还需要一行一行的输出。
c) 通常在前台开发人员给出静态页面后,后台开发人员只需在静AA态页面中添加动态信息即可,而不用再使用Servlet一行一行的去输出了。
2 JSP真身:Servlet
a) 当客户请求的是JSP页面时,服务器会查看JSP对应的Servlet是否存在,如果存在,那么直接调用Servlet的service()方法来处理请求。如果不存在,那么服务器会先把JSP编译成.java,再把.java编译成.class,然后调用service()方法。当这个JSP页面,第二处理请求时,就直接调用直身的service()方法了。
b)JSP是Servlet,JSP与我们编写的Servlet有什么不同呢?通常我们编写的Servlet就不需要输出HTML代码了,而是转发到JSP页面。
c)即Servlet不再负责显示页面,而由JSP来完成!而Servlet专注与控制层内容!
3 Java代码块
a)JSP中的Java代码块就是最常见的动态信息。它分为三种:
a)<%...%>:代码片段。代码片段会原模原样的出现在真身中,不会有变动。正常的Java代码都可以在代码片段中出现;
b)<%=…%>:表达式。表达式会在“编译成Servlet”中输出,例如:<%=a%>,对应真身中的out.print(a)。只能出现常量、变量,以及有返回值的方法调用,而且不能出现分别!即在out.println()的合法参数都可以!
<%=a%>对应out.println(a);
<%=”a”%>对应out.println(“a”);
<%=fun()%>对应out.println(fun());
<%=a;%>对应out.println(a;),所以出错;
<%=System.out.println(“hello”)%>对应out.println(System.out.println(“hello”)),所以出错。
c)<%!...%>:声明。声明对应“真身”中的属性和方法!
a)<%!...%>:声明。声明对应“真身”中的属性和方法!
B)语法:<%! java语句;%>
C)作用:定义成员属性、方法,静态代码块。
1>Jsp声明中的java代码被翻译到_jspService方法的外面。
2>可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。
3>JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
d) JSP只有一种注释:<%-- … --%>,注释中的内容会被JSP编译系统忽略!
e) HTML的注释:<!-- … -->,因为最终向客户端响应的内容还是HTML,所以在HTML注释中的内容还是看不内的。但是可以通过在浏览器中右键à查看源代码,查看<!-- … -->中的内容。
<!-- <%=String.format("%tF %<tT", new Date())%> --> <%-- <%=String.format("%tF %<tT", new Date())%> --%> |
5、JSP指令
作用:不是给JSP用的,写在JSP中的。给JSP引擎(服务器)用的。SP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。指令在“servlet”中不存在,生成“servlet”时需要使用指令!Tomcat编译系统会根据JSP的指令信息来编译JSP,生成Java文件。在生成的Java文件中,不存在指令信息!
语法:<%@ 指令名称 属性1="值1" 。。。%>
举例:<%@ page contentType="text/html;charset=gb2312"%>
page:
属性:
language:指示JSP中使用脚本语言。默认是java,目前只支持java。
extends:指示JSP生成的那个Servlet的爸爸是谁。不要修改。
*import:JSP中java脚本用到的类导入。java代码中的import一样的。
import="java.io.*,java.util.Date"
*session:默认值是true。指示是否创建HttpSession对象。
*buffer:指示JSP中的输出流的缓存大小。默认8Kb。
*isThreadSafe:指示JSP对应的Servlet是否是线程安全的。false才继承SingleThreadModel接口(过时了)
*errorPage:当JSP出现异常时,转向的页面
以下配置是全局错误信息
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
*isErrorPage:指示JSP对应的Servlet中是否产生exception内置对象。
*contentType:作用就是response.setContentType("")
*pageEncoding:指定JSP引擎读取JSP文件时使用的编码
pageEncoding有双重作用,在实际开发中,指定为UTF-8即可
TOmcat会用UTF-8读JSP
同时JSP对应的Servlet字符输出流使用UTF-8,还告知了IE用UTF-8进行显示
*isELIgnored:是否忽略EL表达式。默认是false。
include:
作用:包含.静态包含,多个文件翻译成一个文件
动作指令:<jsp:include/>动态包含,文件还是独立的,但是服务器还是合一起输出
静态包含比动态包含少占资源,能用静态就用静态包含.
<jsp:include/>:静态包含
<%@include file="2.jsp" %>
<jsp:include/>:动态包含
<%@include page="2.jsp" %></jsp:include>
<jsp:forward/>:转发
<jsp:forward page="2.jsp"></jsp:forward>
taglib:
作用:引入外部标签
在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。
一、JSP九大隐式对象(记住):在JSP的java脚本或表达式中直接可以使用的对象
1、原理:就是JSP对应的Servlet的service方法中的局部变量。
注意,九大隐式对象是对象,不是范围
2、九大隐式对象
----------------------------------
引用变量名 | 类型
----------------------------------
request | HttpServletRequest
response | HttpServletResponse
session | HttpSession (不一定有 @page session="true")
application | ServletContext
config | ServletConfig
page | this
exception | java.lang.Throwable (不一定有 @page isErrorPage="true")
---------------------------------------------
out | javax.servlet.jsp.JspWriter (作用和response.getWriter返回的PrintWriter功能一样)
pageContext | javax.servlet.jsp.PageContext
案例:
一般不要用自己new一个PrintWriter,然后调用writer()方法写入字符,否则会先刷PrintWriter中的缓存区字符,再关闭jsp的时候,发现jsp中的缓存中有数据,然后再刷jsp的缓存区数据到PrintWriter缓存中数据的后面
out.write("a");
response.getWriter().write("b");
会打印ba.
要想打印ab,有以下两个办法
1,刷新,把数据刷出来.
2,把缓存设置为0
exception对象不是所有页面都可以使用的,只能在错误页中可以使用!
二、out和pageContext
因为字符输出流out和字节输出流InputStream不能同时存在
所以在jsp中要进行下载,可以把所有不需要的字符都删掉.就不报错了
要是有输出的字符,虽然仍然会下载成功,但是会报错.
(记住)Tips:在JSP中尽量只输出字符,且尽量使用out内置对象。
(灰常重要)javax.servlet.jsp.PageContext
pageContext功能分为五部分:
1、它本身(PageContext)是一个域对象,操作自身域对象数据:(PageContext的存活范围是当前页面,最小的范围)
java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
void setAttribute(java.lang.String name, java.lang.Object value)
2、获取JSP中其它八个隐式对象
它本身(PageContext)是一个域对象且能操作其他(ServletRequest HttpSession ServletContext)域对象中的内容
操作其他三个域:
java.lang.Object getAttribute(java.lang.String name, int scope)
void removeAttribute(java.lang.String name, int scope)
void setAttribute(java.lang.String name, java.lang.Object value, int scope)
pageContext.setAttribute( "p" , "pp" ); //设置页面域范围属性
pageContext.setAttribute( "p" , "RP" ,pageContext. REQUEST_SCOPE ); //request域范围
pageContext.setAttribute( "p" , "sp" ,pageContext. SESSION_SCOPE ); //session域范围
pageContext.setAttribute( "p" , "cp" ,pageContext. APPLICATION_SCOPE );应用域范围
3、获取JSP中其它八个隐式对象
java.lang.Exception getException()
java.lang.Object getPage()
javax.servlet.ServletRequest getRequest()
javax.servlet.ServletResponse getResponse()
javax.servlet.ServletConfig getServletConfig()
javax.servlet.ServletContext getServletContext()
javax.servlet.http.HttpSession getSession()
JspWriter getOut()
4、从四个域作用范围中按pageContext,request,session,application顺序依次查找
java.lang.Object findAttribute(java.lang.String name)
Object obj = pageContext.findAttribute( "p" );
从page request session application范围依次搜索,找到为止。
5、提供了转发和包含功能的方便的方法
void forward(java.lang.String relativeUrlPath)
void include(java.lang.String relativeUrlPath)
对照JSP真身(servlet)查看内置对象
我们发现,在JSP中的内容会出现在“真身”的_jspService()方法中,而且在_jspService()方法上方还有一些其实代码:
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {
PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; 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页面的内容 }… |
JSP中的内容都出现在try块中,而且在try块的正文!上方是对隐藏对象的初始化!!!
上面代码只是给出普通页面的“真身”,而错误页面的“真身”你会看到exception对象的出现。
三、四大域对象(灰常重要)
1、页面范围域对象pageContext(javax.servlet.jsp.PageContext):
存放到此处的数据,只能当前页面使用。(使用很少)
2、请求范围域对象request(javax.servlet.ServletRequest):显示完就没有了
存放在此处的数据,只有转发才能传递给别人。(很高)
应用场景:用在一些数据显示给用户后就没有用了。
3、会话范围域对象session(javax.servlet.http.HttpSession):整个会话
存放在此处的数据,只要是同一次就能取到。(很高)
应用场景:一次请求产生了一些数据,当前用户日后可能还要用。典型的就是,登陆信息和购物车。
4、应用范围域对象application(javax.servlet.ServletContext):整个应用
存放在此处的数据,只要是同一个应用取到,不管是哪个客户端。(很少)。
应用场景:存放全局数据。一定要做好同步处理。
四、JavaBean概念:
1、什么才是一个JavaBean
a、必须是public的
b、必须有默认的构造方法。
c、字段都是私有的。符合java命名规范。private boolean name;
d、提供public的getter或setter方法。getName(isName只对boolean字段有效) setName(String name) 属性
e、一般需要实现java.io.Serializable
2、在企业开发中JavaBean充当什么角色?封装数据
3、JSP中操作JavaBean的动作元素
<jsp:useBean>:
作用:按照指定的范围(scope)查找名称为id指定的对象。
找到就找到了
没有找到:调用默认构造方法创建对象(class),然后以id的名字放到socpe指定的域范围中
属性:
id:名称为id的对象
class:调用默认方法创建对象(class)
scope:默认值是page(页面范围)。可选值:page request(请求) session(会话) application(应用)
<jsp:getProperty>
作用:获取JavaBean中的属性值
属性:
name:那个JavaBean。该标签之前必须使用useBean.
property:属性名称。切记:它对应的是getter方法,与字段名称无关。
name===getName()
以下表示获取age的值
<jsp:getProperty property="age" name="p"/>
<jsp:setProperty>
作用:设置JavaBean中的属性值
属性:
name:那个JavaBean。该标签之前必须使用useBean.
property:属性名称。切记:它对应的是setter方法,与字段名称无关。
name===setName(String name)
value:设置的值
以下表示设置p对象的name,设置的值为name的值
<jsp:setProperty property="name" name="p" param="name"/>
六、JavaWeb开发模型:
模型1:JSP+JavaBean
模型2:MVC+三层架构
M:Model JavaBean
V:View JSP
C:Controller Servlet
JSP