nullJSP和ServletJSP和Servlet什么是JSP什么是JSPJSP(Java Server Page)和Servlet是Java EE规范的两个基本成员,它们是Java Web开发的基础和重点知识。
早期JSP的使用非常广范,一个WEB应用可以全部由JSP组成。由于应用的规模的扩大和复杂程度的提高,以及Java EE标准的出现,JSP才逐渐向单一的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
现层发展。
替代技术:FreeMarker、Velocity、Tapestry构建一个WEB应用构建一个WEB应用进入TOMCAT的安装目录的WEBAPPS目录,新建一个文件夹(假定目录名为test。
进入test文件夹,建立目录:js、images、css、WEB-INF。
在WEB-INF中建立目录:classes、lib。
从其他应用中复制一个web.xml文件到WEB-INF中,并把该文件修改成只有一个根元素的XML文件。
在test文件夹中建立firstpage.jsp。
启动TOMCAT。
在IE中访问http://localhost:8080/test/firstpage.jsp
演示代码设置默认首页设置默认首页编辑web.xml文件
在根元素下添加
元素,该元素可以包含多个元素。
TOMCAT按照中元素的顺序进行查找。
JSP的基本原理JSP的基本原理JSPJaveBean最简单的JSP页面最简单的JSP页面只要把Java代码放在<%和%>之间,就可以在JSP页面上运行了~稍微复杂了一点点稍微复杂了一点点当我们需要在JSP页面的静态部分引用动态部分的变量值或表达式值时,我们需要使用:<%=[表达式]%>。可以动态拼个标记出来吗?比如H1到H6……静态部分:标准的HTML标签。
动态部分:受Java程序控制的内容,它们由Java代码动态生成,和静态部分合在一起,返回给用户浏览器。JSP到底是个什么东西JSP到底是个什么东西打开TOMCAT安装目录中的work\Catalina\localhost\model1\org\apache\jsp目录,你看到了什么?
打开那个.java的文件,在一堆令人头晕眼花的out.write()中,是不是发现了我们刚刚写的代码~~
这个类继承了HttpJspBase类,其实它是Servlet的子类,所以……JSP就是Servlet!从刚才的代码中我们能发现什么从刚才的代码中我们能发现什么去掉方法名字的”_jsp”前缀,我们发现了三个方法:
init(); 初始化JSP/Servlet的方法。
destory(); 销毁JSP/Servlet之前的方法。
service(); 对用户请求生成响应的方法。
这是由WEB容器负责生成的,我们不管它!
由此可见由此可见当第一位访客请求JSP页面的时候,由WEB容器(TOMCAT)对JSP页面进行编译,生成对应的Servlet,再根据请求动态生成标准的HTML页面返回给用户。
如果Servlet已存在,则每次请求都会动态生成HTML文档。
所以,JSP文件必须在JSP服务器上运行,我们把页面文件拖进IE看结果的日子一去不复返啦!提示:当我们在调试JSP程序时,如果发生无论怎么刷新页面都不更新内容的情况,那就把我们刚才看到的Servlet类果断删除,让服务器重新编译吧。基本语法基本语法注释:
<%--注释内容--%>
注意它和HTML注释的区别:
会显示在页面的源代码里,而JSP注释不会。JSP声明JSP声明用于声明变量和方法。
看起来在JSP中声明的变量和方法不在类中,可以脱离类而独立存在,但别忘了,整个JSP会被编译成Servlet,它们会变成Servlet类的成员变量(属性)和成员方法。
语法格式: <%! 声明 %>提示:JSP中声明的变量和方法会变成Servlet类的成员,所以可以使用public、private访问控制修饰符,也可以使用static,但不能用abstract,想一想为什么。试一试:几个同学一起访问一个人的页面,看看count值是各计各的,还是计总数,为什么会这样?JSP的三个编译指令JSP的三个编译指令是通知JSP引擎的消息,不直接生成输出且都有默认值,所以开发人员不必为每个指令设置值。
page:针对当前页面的指令。
include:用于指定包含另一个页面。
taglib:用于指定和访问自定义标签。
格式:<%@ 指令名 属性名=“属性值” %>include是静态导入,注意和后面的动态导入的区别
page指令page指令language:默认值为Java。
extends :指定JSP编译所产生的类的父类或实现的接口。
import :导入包。
session :设定这个页面是否需要HTTP Session。
buffer :指定输出缓冲区的大小,默认8K,可设为none。
autoFlush :缓冲区即将溢出时是否强制输出其内容。
info :
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
当前页的说明,Servlet.getServletInfo()取得。
errorPage :指定错误处理页面。
isErrorPage :本页是否为错误处理页面。
contentType :设定字符集和文件格式。
pageEncoding :指定生成页面的字符集。include指令include指令使用include指令可以将外部文件(可以是静态文本,也可以是动态的JSP页面)嵌入到当前页面。
静态导入:<%@ include file=“xxx.jsp”%>
动态导入:
JSP的七个动作指令JSP的七个动作指令jsp:forward 页面转向
jsp:param 传递参数
jsp:include 包含页面
jsp:plugin 下载JavaBean或Applet
jsp:useBean 创建一个JavaBean实例
jsp:setProperty 设置JavaBean属性
jsp:getProperty 输出JavaBean属性可以用HTML的标记实现,所以很少用到。forward指令forward指令功能:将页面转发到另外的页面,可以是静态页面、动态页面或Servlet。
语法:
或:
提示:注意IE地址栏,而且转向指令,并没有看起来那么简单!include指令include指令功能:只将指定包含的页面的BODY部分插入本页面,并不会导入目标页面的编译指令。
格式:
输出缓存是否导入到本文件中。useBeanuseBean功能:初始化一个JavaBean实例。
格式:
[value]: page 该实例在当前页面有效
request 该实例在本次请求有效
session 该实例在本次会话有效
application 该实例在本应用有效实例的名类名(含包名)setProperty、getPropertysetProperty、getProperty功能:对JavaBean实例的属性进行设置和获取。
格式:
属性名和JavaBean中的属性名并无直接对应关系,而是和get/set方法的名有关JSP中的九个内置对象JSP中的九个内置对象application:代表JSP所属的Web应用本身,用于页面之间交换信息。
pageContext:JSP页面上下文对象,用于访问页面中的共享数据。
request:客户端请求参数的封装对象。
response:代表服务器对客户端的响应,多用于重定向。
session:会话实例,常用于保存登录用户信息的传递。
page:代表页面本身,即Servlet的this,用处不大。
config:页面的配置信息,JSP大多无需配置,常用于Servlet。
out:代表JSP页面输出流,用于输出内容,形成HTML页面。
exception:其他页面的异常,即:只有异常处理页面才有此对象。
requestrequest常用方法:
String getParameter(“paramName”);
Map getParameterMap();
Enumeration getParameterNames();
String[] getParameterValues(String name);
void setAttribute(“attrName”,”attrValue”);
Object getAttribute(“attrName”);applicationapplicationWEB容器中存在四个MAP:
application
session
request
page
这四个MAP用于存储数据,由同名实例对它们进行操作。
application的常用方法:
setAttribute(“objName”,obj);
getAttribute(“objName”);
getInitParameter(“paraName”);在Servlet中使用application对象在Servlet中使用application对象Servlet中没有application内置对象,需要通过WEB应用的ServletContext实例来访问。
ServletContext sc = getServletConfig().getServletContext();
String username=sc.getAttribute(“username”);configconfig常用方法:
config.getServletName()
config.getInitParameter(“paramName”);web.xml文件中还可以设置JSP文件的url-patternexceptionexceptionexception对象是Throwable的实例。
一般的JSP页面中不对异常进行处理,统一由page指令的errorPage属性所设置的异常处理页面进行处理。pageContextpageContext代表页面上下文的对象,主要用于访问JSP之间的共享数据。
常用方法:
getAttribute(String attrName) 取得page内的属性值。
getAttribute(String attrName, int scope) 最得指定范围的属性值。
findAttribute(String attrName) 在四个范围内依次查找指定属性。
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE猜一猜setAttribute方法的参数列表应该是什么样的~~responseresponse代表器对客户端响应的对象。多用于重定向请求。
常用方法:
sendRedirect(“destination-page.jsp”);
void addCookie(Cookie cookie);
redirect与forward不同,它会生成新的request对象。JSP的自定义标签JSP的自定义标签JSP脚本HTML和Java代码混合,难以阅读和维护,也使美工无法参与开发,所以允许程序员自己开发标签。
开发自定义标签的步骤:
开发自定义标签处理类。(类中的属性必须有对应的getter和setter方法)
建立一个和标签库对应的.tld文件。
使用标签库中的自定义标签。TLD文件tag标记详解TLD文件tag标记详解taglib常用子元素有:
tlib-version:自定义版本号,无实际意义。
short-name:默认短名,即简称。
uri:指定标签库自己的唯一标识。
tag标记常用子元素有:
name:标签的名称,JSP页面用这个名称来调用标签。
tag-class:指定标签处理的类。含包名。
body-content:指定标签体的内容。
tagdependent:指定标签处理类自己负责处理的标签体。
empty:指定该标记为空标记。
scriptless:指定此标记只能包含HTML和EL表达式,不包含JSP
JSP:可以包含JSP脚本。
dynamic-attributes:是否支持动态属性。带属性的标签带属性的标签步骤:
标签实现类中增加属性及其对应的getter和setter
在tld文件中设置该标签的属性信息
name:属性名。
required:是否必须。
fragment:是否支持JSP脚本、表达式等动态内容。
在JSP页面中使用自定义标签并使用属性把刚才的TagTest1改进成
可以设置字体颜色的~EL--表达式语言EL--表达式语言EL是JSP2的一个重要特性,是一种数据访问语言,可以让美工避开JSP脚本而访问到应用程序的数据。
语法格式:${expression}
示例:${23}, ${18*4-24/3}, ${objName[“attrName”]}
EL的自定义函数EL的自定义函数步骤:
开发函数处理类。(一个函数对应一个静态方法)
在tld文件中定义函数。
在taglib元素中增加function元素,其子元素有:
name:函数名
function-class:对应的处理类
function-signature:在处理类中的方法名
使用自定义函数:prefix-name:functionName([param1][,param2]…)EL的内置对象EL的内置对象pageContext:与JSP的pageContext对象相同。
pageScope:用于获取page范围的属性值。
requestScope:用于获取request范围的属性值。
sessionScope:用于获取session范围的属性值。
applicationScope:用于获取application范围的属性值。
param:用于获取请求参数值。
paramValues:同上,用于获取值为数组的值。
header:用于获取请求头属性值。
headerValues:同上,用于获取值为数组的值。
initParam:用于获取WEB应用的初始化参数。
cookie:用于获取指定Cookie的值。ServletServletJSP的本质就是Servlet。
Servlet是一种特殊的类,必须继承HttpServlet,
为了响应客户端的请求,根据需要来重写四个方法:
doGet()
doPost()
doPut()
doDelete()
如果需要响应所有请求,但处理相同,可以重写service()方法,即可响应客户端的所有请求。大部分时候我们只需要重写doGet和doPostServletServlet开发Servlet的步骤:
编写Servlet类。
在web.xml文件中配置Servlet。
在IE中访问Servlet。
从Servlet3.0开始还可以在Servlet类中使用@WebServletAnnotationServletServletServlet和JSP的区别:
Servlet中没有内置对象,需要自己实例化。
静态的HTML标记,需要使用页面输出流进行输出。Servlet和JSP的生命周期Servlet和JSP的生命周期当Servlet在WEB容器中运行时,它的实例何时创建、何时销毁都不是由程序员决定的。
创建实例可以在客户端第一次访问容器时进行,大部分Servlet都属于这种情况。
WEB容器可以设置为启动时立即创建Servlet实例。
标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。Servlet的config对象Servlet的config对象获得方法:
ServletConfig config = getServletConfig();
使用方法:
config.getInitParameter(“AttrName”);MVCMVCJava Web应用的结构经历了Model1到Model2两个时代,是技术发展的必然。
Model1:整个应用几乎全部由JSP组成,JSP页面负责接收和处理客户端请求并作出响应。
Model2:Servlet作为控制器(C)接收客户请求,调用后端JavaBean(M)完成业务处理,最后转发到JSP(V)页面进行显示。nullModel1Index.jsp
<%@ page contentType="text/html; charset=ISO8859_1" language="java" errorPage="" %>
欢迎
Login.jsp
<%@ page contentType="text/html; charset=ISO8859_1" language="java" errorPage="" %>
用户登录
<%
String username = (String)request.getParameter("username");
String password = (String)request.getParameter("password");
if( (username!=null && "admin".equals(username)) && (password!=null && "123".equals(password)) )
{ %>欢迎登录,Admin。
<% } else { %>
错误的用户名或密码!
<% } %>
Model2Model2FilterFilter可以认为Filter是Servlet的加强版,主要用于对request的预处理和response的后处理。
正确使用Filter:Filter对用户请求进行预处理,然后把请求交给Servlet进行处理并生成响应,最后由Filter对响应进行后处理,再交给客户端浏览器。
Filter的种类:
用户授权的Filter
日志Filter
负责解码的Filter
能改变XML内容的XSLT FilterFilter可以拦截多个请求或响应,也可以为一个请求或响应设置多个Filter创建Filter创建Filter创建Filter处理类。
Filter必须实现javax.servlet.Filter接口中的三个方法:
void init(FilterConfig config):用于初始化
void destory():用于销毁前的资源回收
void doFilter(ServletRequest req,ServletResponse res,FilterChain chain):实现过滤功能。
在web.xml中配置Filter。Filter用途Filter用途代码一代码二代码三代码二代码一代码三ListenerListener当WEB应用运行的时候,内部会不断地发生各种事件,如:应用启动、停止,用户Session开始、结束,用户请求到达等。Servlet API提供了大量 监听器对WEB应用的内部事件进行监听,并允许产生事件时回调监听器内的方法。ListenerListener开发步骤:
编写Listener实现类。
在web.xml中配置Listener。
常用Listener常用ListenerServletContextListener
功能:监听Web应用的启动和关闭。
需要实现的方法:
contextInitialized(ServletContextEvent sce)
contextDestroyed(ServletContextEvent sce)常用Listener常用ListenerServletContextAttributeListener
功能:监听ServletContext范围(application)内属性的改变事件。
需要实现的方法:
attributeAdded(ServletContextAttributeEvent event)
attributeRemoved(ServletContextAttributeEvent event)
attributeReplaced(ServletContextAttributeEvent event)常用Listener常用ListenerServletRequestListener
功能:监听用户请求到达(初始化)、结束(销毁)事件。需要实现的方法:
requestInitialized(ServletRequestEvent sre)
requestDestroyed(ServletRequestEvent sre)常用Listener常用ListenerServletRequestAttributeListener
功能:监听Request范围内的属性变化事件。
需要实现的方法:
attributeAdded(ServletRequestAttributeEvent event)
attributeRemoved(ServletRequestAttributeEvent event)
attributeReplaced(ServletRequestAttributeEvent event)
常用Listener常用ListenerHttpSessionListener
功能:监听用户session的创建和销毁。
需要实现的方法:
sessionCreated(HttpSessionEvent sc)
sessionDestroyed(HttpSessionEvent sd)常用Listener常用ListenerHttpSessionAttributeListener
功能:监听Session范围内属性值的改变。
需要实现的方法:
attributeAdded(ServletSessionAttributeEvent event)
attributeRemoved(ServletSessionAttributeEvent event)
attributeReplaced(ServletSessionAttributeEvent event)
结束结束