jsp技术:
Java Server pages:jsp是sun提供动态web资源开发技术。为了解决在Servlet中拼写html内容css、js内容十分不方便的问题,sun提供了这样一门技术。如果说Servlet是在java中嵌套HTML,则jsp就是在HTML中嵌套java代码,从而十分便于组织html页面 jsp页面在第一次被访问到时会被jsp翻译引擎翻译成一个Servlet,从此对这个jsp页面的访问都是由这个Servlet执行后进行输出
jsp被编译后会生成servlet,拿eclipse来说,编译后的路径:
工程\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\JspProject\org\apache\jsp
2.jsp语法
(1)JSP模版元素 :jsp页面中书写的HTML内容称作JSP的模版元素,在翻译过来的Servlet中直接被out.write()输出到浏览器页面上了
(2)JSP表达式 <%= java表达式 %> 在翻译过来的Servlet中,计算java表达式的值后,被out输出到浏览器上
(3)JSP脚本片断 <% 若干java语句 %> 在翻译过来的Servlet中,直接被复制粘贴到了对应的位置执行. 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素 多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
(4)JSP声明 <%! 若干java语句 %> 在翻译过来的Servlet中会被放置到和Service方法同级的位置,变成了类的一个成员
(5)JSP注释 <%-- 注释的内容 --%> 被jsp注释注释掉的内容,在jsp翻译引擎将jsp翻译成Servlet的过程中会被丢弃,在翻译过来的Servlet中没有这些信息<%//java注释%> java注释被当作jsp脚本片段被翻译到了Servlet中,在.java文件被翻译成.class文件的时候注释信息被丢弃 <!-- HTML注释 --> html注释被当作模版元素输出到了浏览器上,浏览器认识html注释不予显示
3.JSP指令:
JSP指令的基本语法格式:<%@ 指令 属性名="值" %>举例:<%@ page contentType="text/html;charset=gb2312"%>
jsp指令是为jsp引擎而设计的,是用来告诉引擎如何处理jsp页面如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。例如:<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.util.Date"%>
page指令:
<%@ page
[ language="java" ] 生明用哪个语言
[ extends="package.class" ] 翻译过的servlet继承哪个
[ import="{package.class | package.*}, ..." ] 导包
[ session="true | false" ] 是否有回话
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ errorPage="relative_url" ]相对路径;
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true | false" ]
%><%@ page import="java.util.Date,java.sql.*,java.io.*"%>
上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
<%@ page import="java.util.Date"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.io.*"%>
errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。
如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location></error-page><error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location></error-page><error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/500.jsp</location></error-page>
JSP引擎会根据page指令的contentType属性生成相应的调用ServletResponse.setContentType方法的语句。
page指令的contentType属性还具有说明JSP源文件的字符编码的作用。
可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:
使用page指令来是实现解决中文乱码问题:
JSP程序存在有与Servlet程序完全相同的中文乱码问题输出响应正文时出现的中文乱码问题 读取浏览器传递的参数信息时出现的中文乱码问题JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题 JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。 如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。
如何解决JSP引擎翻译JSP页面时的中文乱码问题 :
通过page指令的contentType属性说明JSP源文件的字符集编码page指令的pageEncoding属性说明JSP源文件的字符集编码
Include指令:
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
细节:
被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
taglib指令:引入标签函数
JSP标签
JSP内置对象
九大隐示对象:在翻译过来的servlet中的service方法自动帮我们前置定义九个对象
request:请求
response:响应
config:配置
application:
page:用来告诉jsp引擎如何处理页面
[ buffer="none | 8kb | sizekb" ] 用来禁用out缓冲区或设置out的大小默认为8kb[ autoFlush="true | false" ]
用来设置当out缓冲区满了以后写入数据时如何处理;如果为true时:满了以后将数据写到response中;;false时,满了会出现异常;
pagecontent:域对象:
1.可以获取其他八大隐示对象的引用
- getException方法返回exception隐式对象
- getPage方法返回page隐式对象
- getRequest方法返回request隐式对象
- getResponse方法返回response隐式对象
- getServletConfig方法返回config隐式对象
- getServletContext方法返回application隐式对象
- getSession方法返回session隐式对象
- getOut方法返回out隐式对象
自定义标签时用:
2.四大作用域的入口,可以操作四大域中的属性
pageContext对象的方法
- public void setAttribute(java.lang.String name,java.lang.Object value)
- public java.lang.Object getAttribute(java.lang.String name)
- public void removeAttribute(java.lang.String name)
- pageContext对象中还封装了访问其它域的方法
- public java.lang.Object getAttribute(java.lang.String name,int scope)
- public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
- public void removeAttribute(java.lang.String name,int scope)
代表各个域的常量
- PageContext.APPLICATION_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.PAGE_SCOPE
findAttribute方法 (*重点,查找各个域中的属性) EL表达式
可以搜寻四大域中属性,如果找不到返回null
作用范围:当前jsp页面
生明周期:访问jsp页面开始,jsp页面结束
作用:在当前jsp中共享数据;
3.提供请求转发
- request.getRequestDispatcher().include();
- pageContent.include("/");
- request.getRequestDispatcher().forward();
- pageContent.forward("/");
- exception:异常
- out:输出
相当于response.getWriter得到的Printwriter
out和response.getWriter获取的流不同在于:out
本身就具有一个缓冲区,先写到缓冲区,直到缓冲区满或则整个页面结束
时out缓冲区才会被写到response缓冲区中
在jsp需要数据输出时用out输出而不用response.getWriter()
jsp映射:
<servlet>
<servlet-name>SimpleJspServlet</servlet-name>
<jsp-file>/jsp/simple.jsp</jsp-file>
<load-on-startup>1</load-on-startup >
</servlet>
<servlet-mapping>
<servlet-name>SimpleJspServlet</servlet-name>
<url-pattern>/xxx/yyy.html</url-pattern>
</servlet-mapping>
jsp和servlet:
让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。JSP页面不写java代码,只用来显示数据,
四大域:
pageContext(称之为page域)
request(称之为request域)
session(称之为session域)
servletContext(称之为application域)
使用时根据生命周期使用:
在当前页面:pageContent
在servlet中用还要请求转发点到其他servlet中用request
会话级别的用session,自己用过一会自己还用自己用其他人一会也用 用servletContent域