1)直接新建一个Java项目
2)右键新建的项目名,点击Add framework Support…
3)添加Web Application 勾选Create web.xml
4)添加Maven
5)配置pom.xml
6)点击Add Configuration…然后点击加号添加Tomcat服务器
1)Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2)Servlet的工作模式
客户端发送请求至服务器
服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端
3)Servlet API 概览
Servlet API 包含以下4个Java包:
1.javax.servlet 其中包含定义servlet和servlet容器之间契约的类和接口。
2.javax.servlet.http 其中包含定义HTTP Servlet 和Servlet容器之间的关系。
3.javax.servlet.annotation 其中包含标注servlet,Filter,Listener的标注。它还为被标注元件定义元数据。
4.javax.servlet.descriptor,其中包含提供程序化登录Web应用程序的配置信息的类型。
4)Servlet 的使用方法
Servlet技术的核心是Servlet,它是所有Servlet类必须直接或者间接实现的一个接口。在编写实现Servlet的Servlet类时,直接实现它。在扩展实现这个这个接口的类时,间接实现它。
5)Servlet 的工作原理
Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。
对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
6)Servlet 的生命周期
其中,init( ),service( ),destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。Servlet容器(例如TomCat)会根据下面的规则来调用这三个方法:
1.init( ),当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,但是这个方法在后续请求中不会在被Servlet容器调用,就像人只能“出生”一次一样。我们可以利用init( )方法来执行相应的初始化工作。调用这个方法时,Servlet容器会传入一个ServletConfig对象进来从而对Servlet对象进行初始化。
2.service( )方法,每当请求Servlet时,Servlet容器就会调用这个方法。就像人一样,需要不停的接受老板的指令并且“工作”。第一次请求时,Servlet容器会先调用init( )方法初始化一个Servlet对象出来,然后会调用它的service( )方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
3.destory,当要销毁Servlet时,Servlet容器就会调用这个方法,就如人一样,到时期了就得死亡。在卸载应用程序或者关闭Servlet容器时,就会发生这种情况,一般在这个方法中会写一些清除代码。
7)Servlet 的其它两个方法
getServletInfo( ),这个方法会返回Servlet的一段描述,可以返回一段字符串。
getServletConfig( ),这个方法会返回由Servlet容器传给init( )方法的ServletConfig对象。
8)ServletRequset接口
Servlet容器对于接受到的每一个Http请求,都会创建一个ServletRequest对象,并把这个对象传递给Servlet的Sevice( )方法。其中,ServletRequest对象内封装了关于这个请求的许多详细信息。
9)ServletResponse接口
javax.servlet.ServletResponse接口表示一个Servlet响应,在调用Servlet的Service( )方法前,Servlet容器会先创建一个ServletResponse对象,并把它作为第二个参数传给Service( )方法。ServletResponse隐藏了向浏览器发送响应的复杂过程。
10)编写第一个Servlet
11)部署servlet,用@WebServlet("/")
12)servlet四个重要对象:
HttpServletRequest 请求对象:获取请求信息
HttpServletResponse 响应对象: 设置响应对象
ServletConfig对象 servlet配置对象
ServletContext对象 servlet的上下文对象
JSP(Java Server Pages)是JavaWeb服务器端的动态资源,它与html页面的作用是相同的,显示数据和获取数据。
1)jsp的组成
jsp = html + java脚本 + jsp标签(指令)
jsp中可直接使用的对象一共有9个,被称之为9大内置对象
2)3种java脚本
<%…%>:写java代码片段,(类似方法)
<%=…%>:用于输出,用于输出一条表达式(或变量)的结果。
<%!…%>:声明,用来创建类的成员变量和成员方法(类似与类)
3) jsp注释
<%– … –%>当服务器把jsp编译成java文件时已经忽略了注释部分!
4)jsp九大内置对象
request:请求对象
response:响应对象
pageContext:JSP的上下文对象
session:会话对象
application:ServletContext对象
config:ServletConfig对象
out:JSP输出流对象
page:指向当前JSP的对象
exception:异常对象
5)JSP四大域对象
pageContext:PageContext类,当前JSP页面那你范围有效
request:HttpServletRequest类,一次请求内有效
session:HttpSession类,一次会话范围内有效(从浏览器打开到浏览器关闭)
application:ServletContext类,整个web工程范围内都有效(只要web工程不停止,数据都在)
6)jsp原理(看源码)
jsp其实是一种特殊的Servlet
当jsp页面第一次被访问时,服务器会把jsp编译成java文件
然后再把java编译成.class
然后创建该类对象
最后调用它的service()方法
第二次请求同一jsp时,直接调用service()方法。
7)jsp三大指令
- page
pageEncoding和contentType:
pageEncoding:它指定当前jsp页面的编码,只要不说谎,就不会有乱码!在服务器要把jsp编译成.java时需要使用pageEncoding!
contentType:它表示添加一个响应头:Content-Type!等同与response.setContentType(“text/html;charset=utf-8”);
如果两个属性只提供一个,那么另一个的默认值为设置那一个。
如果两个属性都没有设置,那么默认为iso
import:导包!可以出现多次
errorPage和isErrorPage
errorPage:当前页面如果抛出异常,那么要转发到哪一个页面,由errorPage来指定
isErrorPage:它指定当前页面是否为处理错误的页面!当该属性为true时,这个页面会设置状态码为500!而且这个页面可以使用9大内置对象中的exception!
- include –> 静态包含 与RequestDispatcher的include()方法的功能相似! <%@include%>
它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!
RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class!他们只是把响应的内容在运行时合并了!
作用:把页面分解了,使用包含的方式组合在一起,这样一个页面中不变的部分,就是一个独立jsp,而我们只需要处理变化的页面。
- taglib –> 导入标签库 两个属性: prefix:指定标签库在本页面中的前缀!由我们自己来起名称! uri: 指定标签库的位置!
<%@taglib prefix=”s” uri=”/struts-tags”%> 前缀的用法
4. Filter与Listener Listener监听器8)JSP中与JavaBean相关的标签
jsp:useBean jsp:setProperty jsp:getProperty
Javaweb开发中的监听器,是用于监听web常见对象 ,例如HttpServletRequest、HttpSession、ServletContext等。
监听器就是监听某个对象的的状态变化的组件。
- 监听机制
事件源:被监听的对象 —– 三个域对象 request、session、servletContext
监听器:监听事件源对象、 事件源对象的状态的变化都会触发监听器 —- 6+2
注册监听器:将监听器与事件源进行绑定
响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 —- 程序员编写代码 - 监听器有哪些
第一维度:按照被监听的对象划分:ServletRequest域 HttpSession域 ServletContext域
第二维度:监听的内容分:监听域对象的创建与销毁的, 监听域对象的属性变化的 - 监听三大域对象的创建与销毁的监听器
(1)监听ServletContext域的创建与销毁的监听器ServletContextListener
(2)Servlet域的生命周期
何时创建:服务器启动创建
何时销毁:服务器关闭销毁
(3)监听器的编写步骤(重点):
a、编写一个监听器类去实现监听器接口
b、覆盖监听器的方法
c、需要在web.xml中进行配置—注册
(4)监听的方法
contextInitialized(),contextDestroyed()
(5)配置文件
(6)监听三大域对象的属性变化
域对象的通用的方法:
setAttribute(name,value) — 触发添加属性的监听器的方法
getAttribute(name) — 触发修改属性的监听器的方法
removeAttribute(name) — 触发删除属性的监听器的方法
监听器方法
监听ServletContext属性变化 ServletContextAttributeListener
监听HttpSession属性变化 HttpSessionAttributeListener
监听HttpServletRequest属性变化 ServletRequestAttributeListener
Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理.
- 步骤:
1)编写一个过滤器的类实现Filter接口
2)实现接口中尚未实现的方法(着重实现doFilter方法)
3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)
注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)那么资源是不会被访问到的。
2.FilterChain
FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
问题:怎样可以形成一个Filter链?
答:只要多个Filter对同一个资源进行拦截就可以形成Filter链。
问题:怎样确定Filter的执行顺序?
答:由来确定。
3.filter生命周期及其与生命周期相关的方法
1)Servlet生命周期:
实例化 –》 初始化 –》 服务 –》 销毁
当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.
2)Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法
init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行
doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法
destory():代表是filter销毁方法 当filter对象销毁时执行该方法
Filter对象的生命周期:
Filter何时创建:服务器启动时就创建该filter对象
Filter何时销毁:服务器关闭时filter销毁
3)doFilter方法中的参数
ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。
FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求
4.FilterConfig
在Filter的init方法上有一个参数,类型就是FilterConfig,FilterConfig它是Filter的配置对象,它可以完成下列功能。
1)获取Filtr名称
2)获取Filter初始化参数
3)获取ServletContext对象。
5.Filter的作用
1)公共代码的提取
2)可以对request和response中的方法进行增强(装饰者模式/动态代理)
3)进行权限控制
1)MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:
模型(Model)、视图(View)和控制器(Controller)。
视图View:界面设计人员进行图形界面设计;
控制器Controller:对请求进行处理,负责请求转发;
模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;
2)MVC不是Java的东西,几乎现在所有B/S结构的软件都采用了MVC设计模式。
3)MVC 模式中三个组件的详细介绍如下:
模型(Model):用于封装与应用程序业务逻辑相关的数据以及对数据的处理方法。Model 有对数据直接访问的权力,例如对数据库的访问。Model 不依赖 View 和 Controller,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,由此,View 可以了解在数据 Model 上发生的改变。(如,软件设计模式中的“观察者模式”);
视图(View):能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(即 Model),因此应该事先在被它监视的数据那里注册;
控制器(Controller):起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。
4)低耦合
通过将视图层和业务层分离,允许更改视图层代码而不必重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变,只需要改动 MVC 的模型层(及控制器)即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
模型层是自包含的,并且与控制器和视图层相分离,所以很容易改变应用程序的数据层和业务规则。如果想把数据库从 MySQL 移植到 Oracle,或者改变基于 RDBMS 的数据源到 LDAP,只需改变模型层即可。一旦正确的实现了模型层,不管数据来自数据库或是 LDAP 服务器,视图层都将会正确的显示它们。由于运用 MVC 的应用程序的三个部件是相互独立,改变其中一个部件并不会影响其它两个,所以依据这种设计思想能构造出良好的松耦合的构件。
5)重用性高
随着技术的不断进步,当前需要使用越来越多的方式来访问应用程序了。MVC 模式允许使用各种不同样式的视图来访问同一个服务端的代码,这得益于多个视图(如 WEB(HTTP)浏览器或者无线浏览器(WAP))能共享一个模型。
比如,用户可以通过电脑或通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式(流程)是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面(视图)使用。例如,很多数据可能用 HTML 来表示,但是也有可能用 WAP 来表示,而这些表示的变化所需要的是仅仅是改变视图层的实现方式,而控制层和模型层无需做任何改变。
由于已经将数据和业务规则从表示层分开,所以可以最大化的进行代码重用了。另外,模型层也有状态管理和数据持久性处理的功能,所以,基于会话的购物车和电子商务过程,也能被 Flash 网站或者无线联网的应用程序所重用。
6)生命周期成本低
MVC 模式使开发和维护用户接口的技术含量降低。
7)可维护性高
分离视图层和业务逻辑层使得 WEB 应用更易于维护和修改。
8)没有明确的定义
完全理解 MVC 模式并不是很容易的。使用 MVC 模式需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考软件的架构。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。
9)不适合小、中型应用程序
花费大量时间将 MVC 模式应用到规模并不是很大的应用程序通常会得不偿失。
10)增加系统结构和实现的复杂性
对于简单的界面来说,非要严格遵循 MVC 模式,使模型、视图与控制器分离的话,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
11)视图对模型数据的低效率访问
依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
说明:如果通过控制器访问模型层(而非视图层直接访问),或许可避免对未变化数据的不必要的频繁访问,从而解决此问题。
6. Ajax1)Ajax 全名 async javascript and XML(异步Javascript和XML)
2)AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。
3)什么是 AJAX ?
AJAX = 异步 Javascript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。
4)GET 还是 POST?
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
无法使用缓存文件(更新服务器上的文件或数据库)
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
5)GET 请求
一个简单的 GET 请求:
xmlhttp.open(“GET”,“demo_get.asp”,true);
xmlhttp.send();
在上面的例子中,您可能得到的是缓存的结果。
为了避免这种情况,请向 URL 添加一个唯一的 ID:
xmlhttp.open(“GET”,“demo_get.asp?t=” + Math.random(),true);
xmlhttp.send();
如果您希望通过 GET 方法发送信息,请向 URL 添加信息:
xmlhttp.open(“GET”,“demo_get2.asp?fname=Bill&lname=Gates”,true);
xmlhttp.send();
6)POST 请求
一个简单 POST 请求:
xmlhttp.open(“POST”,“demo_post.asp”,true);
xmlhttp.send();
如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:
xmlhttp.open(“POST”,“ajax_test.asp”,true);
xmlhttp.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);
xmlhttp.send(“fname=Bill&lname=Gates”);
7)url - 服务器上的文件
open() 方法的 url 参数是服务器上文件的地址:
xmlhttp.open(“GET”,“ajax_test.asp”,true);
该文件可以是任何类型的文件,比如 .txt 和 .xml,或者服务器脚本文件,比如 .asp 和 .php (在传回响应之前,能够在服务器上执行任务)。
8)异步 - True 或 False?
AJAX 指的是异步 Javascript 和 XML(Asynchronous Javascript and XML)。
XMLHttpRequest 对象如果要用于 AJAX 的话,其 open() 方法的 async 参数必须设置为 true:
xmlhttp.open(“GET”,“ajax_test.asp”,true);
对于 web 开发人员来说,发送异步请求是一个巨大的进步。很多在服务器执行的任务都相当费时。AJAX 出现之前,这可能会引起应用程序挂起或停止。
通过 AJAX,Javascript 无需等待服务器的响应,而是:
在等待服务器响应时执行其他脚本
当响应就绪后对响应进行处理
9)responseText 属性
如果来自服务器的响应并非 XML,请使用 responseText 属性。
responseText 属性返回字符串形式的响应,因此您可以这样使用:
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
responseXML 属性
如果来自服务器的响应是 XML,而且需要作为 XML 对象进行解析,请使用 responseXML 属性:
请求 books.xml 文件,并解析响应:
xmlDoc=xmlhttp.responseXML;
txt="";
x=xmlDoc.getElementsByTagName(“ARTIST”);
for (i=0;i
txt=txt + x[i].childNodes[0].nodevalue + “
”;
}
document.getElementById(“myDiv”).innerHTML=txt;
10)使用 Callback 函数
callback 函数是一种以参数形式传递给另一个函数的函数。
如果您的网站上存在多个 AJAX 任务,那么您应该为创建 XMLHttpRequest 对象编写一个标准的函数,并为每个 AJAX 任务调用该函数。
该函数调用应该包含 URL 以及发生 onreadystatechange 事件时执行的任务(每次调用可能不尽相同)
文件上传1)文件上传分析
1.普通表单提交默认enctype=“application/x-www-form-urlencoded”;但是当表单中存在文件类型时,需要设置enctype=“multipart/form-data”,它不对字符进行编码,用于发送二进制的文件(即所有文件类型,如视频、图片、音乐、文档都可以用此类型entype);还有一种enctype="text/plain"用于发送纯文本内容。
2.表单请求方式必须为post。
3.接收时不能再用request.getParameter(),而是request.getInputStream()解析二进制流,得到ServletInputStream对象。
2)FileUpload分析
fileUpload是apache的commons组件提供的上传组件,它最主要的工作就是帮我们解析request.getInpustream()。可以参考在线API文档:http://tool.oschina.net/apidocs/apidoc?api=commons-fileupload
3)使用fileUpload组件首先需要引入两个jar包:
commons-fileUpload.jar
commons-io.jar
fileUpload的核心类有DiskFileItemFactory、ServletFileUpload、FileItem。
4)使用fileUpload固定步骤:
创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory();
创建解析器:ServletFileUpload upload=new ServletFileUpload(factory);
使用解析器解析request对象:List list=upload.parseRequest(request);
5)一个FileItem对象对应一个表单项。FileItem类有如下方法:
String getFieldName():获取表单项的name的属性值。
String getName():获取文件字段的文件名。如果是普通字段,则返回null
String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。
String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。
long getSize():获取字段内容的大小,单位是字节。
boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。
InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流。
6)使用fileUpload组件实现文件上传除了上面的那些方法之外还要注意的:
- 文件名中文乱码处理:servletFileUpload.setHeaderEncoding(“utf-8”) 或 request.setCharacterEncoding(“utf-8”);
- 表单普通字段中文乱码处理:new String(str.getBytes(“iso-8859-1”,“utf-8”));
- 设置内存缓冲区的大小,默认为10KB:diskFileItemFactory.setSizeThreshold(1024*1024);
4.指定临时文件目录,如果单个文件的大小超过内存缓冲区,该文件将会临时缓存在此目录下:diskFileItemFactory.setRepository(file); - 设置单个文件大小限制,如果有某个文件超过此大小,将抛出FileUploadbase.FileSizeLimitExceededException:servletFileUpload.setFileSizeMax(1024102410);
- 设置所有文件,也就是请求大小限制,如果文件总和超过此大小,将抛出FileUploadbase.SizeLimitExceededException:servletFileUpload.setSizeMax(1024102420);
- 利用UUID生成伪随机字符串作为文件名避免重复:UUID.randomUUID().toString();
- 将文件写到硬盘上。写完之后,系统会自动将放在临时文件目录的该文件删除:fileItem.write(new File(path,fileName));



