JSP学习总结
JSP(Java Server Pages)Java 服务器端页面,Sun Microsystems 一种动态网页技术标准,跨平台。
JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。JSP文件后缀名为(*.jsp)。JSP开发的WEB应用可以跨平台使用,既可以运行在Linux上也能运行在Window上。
什么是Java Server Pages?
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息
JSP的优势 ,以下列出了使用JSP带来的其他好处:
与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。
与纯 Servlets相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
与静态HTML相比:静态HTML不包含动态信息。
把网页逻辑与网页设计和显示分离开来,JSP页面由HTML代码(静态元素)和Java代码(动态元素)组成,返回客户端一个HTML文件。
JSP技术离不开Servlet机制,JSP页面为Servlet实例,JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。Tomcat会根据JSP页面生成对应Servlet的Java文件和class文件。
JSP文件必须在JSP服务器内运行,必须生成Servlet才能执行,每个JSP页面的第一个访问者速度很慢,JSP页面的访问者无需安装任何客户端,甚至不需要可以运行Java的运行环境。
元素:
HTML标签
指令<%@ 指令值 属性=“”%>
声明<%! 声明部分(变量或方法)%>,程序代码、表达式;
注释:显示:<!-- -->,隐式:<%-- --%>;
输出表达式:<%= 表达式%>(不能使用一个分号)。
JSP的内置对象(暗对象9个):直接使用,不需构建
Application:javax.servlet.ServletContext的实例、代表JSP所属的Web应用本身、getAttribute() setAttribute() getInitParameter()、在整个Web应用的多个JSP、Servlet之间共享数据、可以存放全局变量,获得Web应用配置参数、服务器的启动和关闭决定了application对象的生命
Config:javax.servlet.ServletConfig的实例、代表JSP的配置信息,在web.xml中进行配置,getInitParameter() getInitParameterNames() 该对象更多在Servlet中有效
Exception:java.lang.Throwable的实例、getMessage() printStackTrace()
Out:javax.servlet.jsp.JspWriter的实例、输出流
Page:代表页面本身
pageContext:javax.servlet.jsp.PageContext的实例、JSP上下文、getServletContext() getServletConfig()
request:javax.servlet.http.HttpServletRequest的实例、getParameter() getParameterValues() setAttribute() getAttribute() setCharacterEncoding() 每个request对象封装了一次用户请求,且请求参数也封装在request对象中。请求头通常有浏览器自动添加、一次请求总是包含若干请求头,请求参数需要开发人员控制添加,get和post两种方式。Request能够执行forword和include 代替JSP中的forword include。Cookie在网站上记录客户的某些信息,session会随浏览器的关闭而失效,cookie会一直在客户端机器上,除非超出cookie的生命期限。
response:javax.servlet.http.HttpServletResponse的实例、代表服务器端对客户端的响应、用于重定向、getOutputStream() sendRedirect()
session:javax.servlet.http.HttpSession的实例、该对象代表一次对话、getAttribute() setAttribute() 一次终端用户与交互系统进行通信的时间间隔。Session的属性值可以是任何可序列化的Java对象。
JSP的内置对象的实质是:
方法_jspService()的形参或者局部变量,可直接在JSP脚本中调用无需创建,不能在JSP声明中使用内置对象。并不是每个表单域都会生成请求参数,需要有name属性。
转发(forword)一次请求、一次响应、地址栏的URL不变,重定向(redirect)两次请求、两次响应、原有的请参数、request范围的属性全部失去,地址栏的URL发生变化。
构建Web应用(IDE工具Eclipse),web.xml(描述所有Web应用共同的配置属性)配置描述文件,必须放在WEB-INF目录下
tomcat安装目录:
注意目录名不能有中文和空格。目录介绍如下:
bin:二进制执行文件。里面最常用的文件是startup.bat,如果是 Linux 或 Mac 系统启动文件为 startup.sh。
conf:配置目录。里面最核心的文件是server.xml。可以在里面改端口号等。默认端口号是8080,也就是说,此端口号不能被其他应用程序占用。
lib:库文件。tomcat运行时需要的jar包所在的目录
logs:日志
temp:临时产生的文件,即缓存
webapps:web的应用程序。web应用放置到此目录下浏览器可以直接访问
work:编译以后的class文件。
JSP:
就像其他普通的网页一样,浏览器发送一个HTTP请求给服务器。
Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。
JSP声明周期
编译阶段:
servlet容器编译servlet源文件,生成servlet类
初始化阶段:
加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
执行阶段:
调用与JSP对应的servlet实例的服务方法
销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
JSP编译的过程包括三个步骤:
解析JSP文件。
将JSP文件转为servlet。
编译servlet。
脚本程序的语法格式:<% 代码片段 %>
中文编码问题
如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
JSP声明的语法格式:<%! declaration; [ declaration; ]+ ... %>
JSP表达式的语法格式:<%= 表达式 %>
JSP注释
JSP注释主要有两个作用:为代码作注释以及将某段代码注释掉。
<%-- 该部分注释在网页中不会被显示--%>
JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
JSP指令语法格式:<%@ directive attribute="value" %>
JSP 读取表单数据
getParameter(): 使用 request.getParameter() 方法来获取表单参数的值。
getParameterValues(): 获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkbox类型
getParameterNames():该方法可以取得所有变量的名称,该方法返回一个Emumeration。
getInputStream():调用此方法来读取来自客户端的二进制数据流。
重新设置系统运行的模式
怎样设置MyEclipse的编码方式/项目的编码方式/每种文件的编码方式:
JSP过滤器
Servlet和JSP中的过滤器都是Java类,它们存在的目的如下:
在请求访问后端资源时拦截它
管理从服务器返回给客户端的响应
过滤器将会被插入进web.xml文件中,然后映射servlet、JSP文件的名字,或URL模式。
部署描述文件web.xml可以在 <Tomcat-installation-directory>\conf 目录下找到。当JSP容器启动网络应用程序时,它会创建每一个过滤器的实例,这些过滤器必须在部署描述文件web.xml中声明,并且按声明的顺序执行。
JSP Cookie处理
Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息。在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持
JSP Session
删除Session数据
当处理完一个用户的会话数据后,您可以有如下选择:
移除一个特定的属性:
调用public void removeAttribute(String name) 方法来移除指定的属性。
删除整个会话:
调用public void invalidate() 方法来使整个session无效。
设置会话有效期:
调用 public void setMaxInactiveInterval(int interval)方法来设置session超时。
登出用户:
支持servlet2.4版本的服务器,可以调用 logout()方法来登出用户,并且使所有相关的session无效。
配置web.xml文件:
如果使用的是Tomcat,可以向下面这样配置web.xml文件:
超时以分钟为单位,Tomcat中的默认的超时时间是30分钟。
Servlet中的getMaxInactiveInterval()方法以秒为单位返回超时时间。如果在web.xml中配置的是15分钟,则getMaxInactiveInterval()方法将会返回900。
2、JSP 标准标签库(JSTL)
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
核心标签
格式化标签
SQL 标签
XML 标签
JSTL 函数
核心标签
核心标签是最常用的JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
XML 标签
JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
JSTL(Java Server Pages Standard Tag Library)JSP的标准标记库;
导入jstl.jar standard.jar <%@ taglib uri=… prefix=…%>。
JSTL标签的构成(5种):Core核心标签库、I18N= Internationalization编写国际化Web应用的标签及格式化的标签、Sql访问关系数据库的标签、Xml对Xml文档进行操作的标签、Functions一组通用的EL函数。
Core标签库:一般用途、条件、迭代、URL相关的标签。
<c:if>实现Java语言中的if语句的功能
<c:choose><c:when><c:otherwise>实现Java中if-else的功能
(<c:when> <c:otherwise>不能单独使用,必须位于<c:choose>父标签中)。
<c:forEach>遍历集合中的对象;
<fmt:formatNumber>数字、货币、百分比的格式化处理。
JSP 表达式语言
JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。
expr指的是表达式。在JSP EL中通用的操作符是"."和"[]"。这两个操作符允许您通过内嵌的JSP对象访问各种各样的JavaBean属性
JSP EL中的函数
JSP EL允许您在表达式中使用函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:
${ns:func(param1, param2, ...)}
ns指的是命名空间(namespace),func指的是函数的名称,param1指的是第一个参数,param2指的是第二个参数,以此类推。
E L(Expression Language)目的:
为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。
${Java表达式 }提取数据,显示数据。
EL 提供“.“和“[ ]“两种运算符来存取数据,JSP引擎会按照page、request、session、application的范围搜索user关键字,然后将该对象取出,并显示其对应的成员。
JSP异常处理
当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方。JSP代码中通常有以下几类异常:
检查型异常:
检查型异常就是一个典型的用户错误或者一个程序员无法预见的错误。举例来说,如果一个文件将要被打开,但是无法找到这个文件,则一个异常被抛出。这些异常不能再编译期被简单地忽略。
运行时异常:
一个运行时异常可能已经被程序员避免,这种异常在编译期将会被忽略。
错误:
这里没有异常,但问题是它超出了用户或者程序员的控制范围。错误通常会在代码中被忽略,几乎不能拿它怎么样。举例来或,栈溢出错误。这些错误都会在编译期被忽略。
JSP调试
使用System.out.println()
System.out.println()可以很方便地标记一段代码是否被执行。当然,我们也可以打印出各种各样的值。此外:
自从System对象成为Java核心对象后,它便可以使用在任何地方而不用引入额外的类。使用范围包括Servlets,JSP,RMI,EJB's,Beans,类和独立应用。
与在断点处停止运行相比,用System.out进行输出不会对应用程序的运行流程造成重大的影响,这个特点在定时机制非常重要的应用程序中就显得非常有用了。
使用JDB Logger
J2SE日志框架可为任何运行在JVM中的类提供日志记录服务。因此我们可以利用这个框架来记录任何信息。
调试工具
NetBeans是树形结构,是开源的Java综合开发环境,支持开发独立的Java应用程序和网络应用程序,同时也支持JSP调试。
NetBeans支持如下几个基本的调试功能:
断点
单步跟踪
观察点
cookie:
编写一个serlvet,如果某个客户端浏览器是第一次来访问这个serlvet,那么看到“欢迎您第一次光临”。如果是第二次或者以上的访问这个serlvet,那么看到"欢迎您再次回来"。
HttpSession session = request.getSession(true=不填|false);
session.setAttribute("key",Object);
session.getAttribut("key");
class Cookie {
private String name;
private String value;
public Cookie (String name,String value){
this.name = name;
this.value=value;
}
getName();
getValue();
}
class HttpSessionImple implements HttpSession {
Map<String,Object> map = new HashMap()...;
public void setArrtibute(String key,Object obj){
map.put(key,obj);
}
public Object getAtrribute(String key){
return map.get(key);
}
}
class HttpServletRequestImpl implements HttpServletRequest {
public Cookie[] getCookies(){
}
public HttpSession getSession(){
Cookie[] cs = this.getCookies();
Cookie cc = null;
for(Cookie c : cs){
if("sessionId".equals(c.getName)){
cc = c;
break;
}
}
}
if(cc!= null){
String value = cc.getValue();
return ServeltContext.getAtrritbute(value);
} else {
String sessionId = generateSessionId();// uuid
HttpSession s = new HttpSessionImpl();
ServletContext.setAtrribute(sessionId,s);
Cookis cookie = new Cookie("sessionId",sessionId);
response.addCookies(cookie);
return s;
}
}
JSP就是一个Servlet(动态资源)
JSP引擎---负责将jsp变成servlet,即java文件,第一次不会很快见到jsp页面。
没有解析java的程序,需放在容器、tomcat中,才能访问。
JSP提供了三种基本标签
<%!--------全局变量
// 声明变量
// 声明方法
成员变量不安全
%>
<%// java代码片段----对应servlet中的service方法,局部变量%>
<%=Java表达式 %>赋值表达式
指令标签:
<%@ page 属性=值 属性=值%>
<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8”%>
contentType charset
error.jsp:
%@........isErrorPage=“true” exception.printStackTrace();
一般进行i/o操作,记录下来,日志文件,便于后期维护
<%@ page language=”java” import=”java.util.*” contentType=” application/vnd.ms-excel”%> 生生成excel表格
Response.addHeader(“Content-Disposition”,”filename=aaa.xls”);
out PrintWriter,注意方法调用的次数,不能多次输出流,如果有需要可以用servlet
class HttpRespone {
public OutputStream getOutputStream(){
return skt.getOutputStream(); //字节流
}
public PrintWriter getPrintWriter(){
return new PrintWriter(this.getOutputStream());
}
}