学习参考书目:Java Web 整合开发 王者归来
一、基础
客户端程序分为RCP/TCP。rich和thin。
网络程序的结构分为B/S和C/S。
从浏览器请求到服务器接收并处理回应的这种模式叫 请求-响应模式。 -------典型的Web应用程序的访问过程。
二、深入浏览器-服务器
在其中间起作用的是Servlet和HTTP协议。( ※ HTTP协议由Tomcat服务器和浏览器实现好了,程序开发者只需了解。
- 浏览器发送的数据遵循HTTP协议,内容包括(访问方式Get or Post、HTTP版本、页面地址等)
- 服务器返回的数据,二进制数据或者HTML文本,包括(HTTP版本号、响应日期Date、过期时间Expires、服务器软件BWS、输出总长度、输出类型、源代码)
- 访问方式,两种常用,五种几乎不用。
△ HTTP头数据。包括,User-Agent 浏览器信息;Accept 格式;Cookie 记录用户状态;Referer 单击链接的原地址。
1、GET,查询内容显示在浏览器地址栏,网址不能超过256个字符。(search word)
http://www.baidu.com/s?wd=Java 即 Telnet www.baidu.com 80 和 GET /s?wd=Java Http/1.0
2、Post,大量数据,要求严格,提供数据类型和长度。
POST /s HTTP/1.1
Content-Type
Content-Length
wd=Java
※ 实操:Telnet在cmd中演示。
- Telnet 网址 80 --------连接HTTP协议,即访问网站的默认端口
- Ctrl+) 回显
- 回车 --------打开输入界面
- GET/HTTP/1.0 --------访问方式Get,协议是HTTP 1.0,/ 表示访问首页
- 两次回车 --------本命令结束换号;提交
三、Servlet概述和实现
1、工作流程
Servlet是一种实现javax.servlet.Servlet接口的类。
主要处理业务逻辑,如读取数据库、权限检查、业务处理等。
Servlet并没有执行方法,由Tomcat服务器调用Servlet方法来完成处理过程。
Tomcat接收并解析,封装成两个对象,HttpServletRequest类型的requset对象(通过方法查询Http头文件)
和HttpServletResponse类型的response对象。
把两个对象作为参数,代入到Servlet的相应方法中,如doPost(requset,response)和doGet(requset,response)
还有一种方法是long getLastModified(HttpServletRequset requset)返回该文档的最后修改时间,默认为-1表示最新。
2、实现Servlet
在JDK中javax.servlet.http.HttpServlet类已经实现了Servlet接口的所有方法。编写时直接继承并覆盖需要的方法即可。
UID为串行化版本统一标识符。
把Java对象转化字节序列的过程叫作对象序列化。(字节序列的用处是,保存在硬盘或者网络传输)
重写doGet和doPost方法。(log为HttpServlet自带的日志函数输出信息到控制台)
文档更新时间 getLastmodified
执行方法
1、设置两个对象的编码方式
2、获取URI
3、获取访问方式
4、获取参数
5、设置response文档类型
6、创建PrintWriter的对象进行输出(注意flush和close)
3、配置Servlet
在web.xml配置Servlet类文件和访问方式 -------Web容器必须知道浏览器怎么访问这个Servlet。
Servlet类文件用servlet标签。
servlet类文件中必须配置标签servlet-name和servlet-class,
可选配置标签init-param(param-name和param-value)用来初始化参数。
可选配置标签load-on-startup用来配置该Servlet的加载方式,1为Tomcat启动加载,0为第一次请求才加载。
访问方式用servlet-mapping标签。
包含两个标签servlet-name和url-pattern。
后者为访问方式。允许使用通配符进行通配符映射,这样无论用何种后缀都可以访问,可以达到隐藏服务器语言的目的。
访问网址:/工程名+应用程序路径(如果使用通配符。后缀可以为.asp/.php/.java等等访问)
四、实现浏览器与客户端的信息交互-----请求与响应
1、获取request变量----采集客户端的信息
浏览器发送的请求被封装成HttpServletRequest对象,这个对象包括了你的请求地址,请求参数,提交数据,上传文件,客户端IP,客户端操作系统。
私有了四个方法,分别用来反馈客户端的文件类型、语言环境、浏览器信息和操作系统
doGet方法
本地IP,名称,端口号,语言环境,web根目录,访问方式,交互协议,查询字符串
服务器名称,端口号,信息。客户端IP,端口号,用户,SessionID,URI,URL,协议头,servlet路径,用户标识,浏览器支持的文件格式,单击链接的原地址,UserAgent。
页面输出
结果(web.xml自行配置)
2、用response随机生成图片验证码----反馈信息
服务器做出的响应封装成HttpServletResponse对象。操作这个对象即可对浏览器操作。用getWriter()方法获得PrintWriter对象(OutputStream子类)可以输出字符型数据(见上图),如果输出二进制数据则用getOutputStream获得ServletOutputStream对象输出。
定义随机字符字典。编写获取随机字符,获取随机颜色,获取反色的三个方法。
doGet方法
设置输出类型,定义图片宽高,获取随机颜色和反色,获取一个随机字符,并放到session中。
创建彩色图片bi,获取绘图对象g,设置字体,设置获取的颜色和反色,绘制背景,绘制随机字符,绘制随机降噪点。
获取输出二进制数据的对象,JPEG类型编码,图片编码,输出。
结果(web.xml自行配置)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<script>
function reloadImage(){
document.getElementById('btn').disabled =true;
document.getElementById('identity').src='servlet/IdentityServlet?ts='+new Date().getTime();
}
</script>
<body>
<img src="servlet/IdentityServlet" id="identity" onload="btn.disabled=false;" />
<input type= button value="换个图片" onclick="reloadImage()" id="btn">
</body>
</html>
并未成功
五、读取web.xml参数
1、初始化参数---在配置文件中配置变量无需更改servlet类。
获取所有参数名称:getInitParameterNames( )
获取初始化参数值:getinitParameter(String param)
也可以用getServletConfig()获得ServletConfig对象,然后方法同上
WEB/INF下的文件是受保护的,从客户端不能通过浏览器直接访问,只能由服务器访问或者在页面通过权限程序可以访问。如下,通过用户名密码登录验证获得机密文件的权限。
这里doGet方法写了前台页面,表单提交方法用post
结果
输入正确则跳转下面页面,也就是机密页面,若不正确则不跳转。
2、上下文参数---全局参数<context-param>
获取context-param可以使用ServletContext对象。
Servlet中通过getServletConfig( ).getServletContext( )来获取ServletContext对象。---获取对象
通过getInitParameterNames( )方法获取所有context-param即全局参数名称。 ---获取参数名称
通过getInitParameter( )方法获取指定名称的参数。 ---获取参数
下面实例是:读取文档参数
配置文件
结果
3、资源注射---Java5.0引入的注解
※ 支持JavaEE5规范、Tomcat6.X以后的版本
之前的例子都是在servlet中编写代码读取web.xml的初始参数
而用资源注射,不需要主动读取资源,在tomcat启动时将把配置信息自动注射到servlet。
————————————————————————————————————————————
资源注射,通过Java5.0引入的新特性注解完成的,注解是一种特殊的接口,标志符号是“@”。
@Resource(name="messageNameInWebXml")
private String message ;
简化: private @Resource( name="messageNameInWebXml") String message ;
而在web.xml中用<env-entry>标签配置资源。※只能配置java.lang包下的标准类型的变量如String、Integer、Double。
servlet与servlet-mapping自行配置。
结果:
4、使用JNDI获取资源
资源注射的原理是JNDI,即Java命令与目录接口(Java Naming and Directory Interface),也可以不使用@Resource,通过查找JNDI同样可以获取到这三个资源。
// 实例化一个Context对象
Context ctx = new InitialContext();
// 查找资源
String message=(String)ctx.lookup("message");
Integer i=(Integer)ctx.lookup("i");
String persons=(String)ctx.lookup("persons");
5、注射数据源(留)
※两条命令解决tomcat8080端口被占用
netstat -ano | findstr 8080
taskkill -pid 进程pid -f
六、 提交表单信息
Web程序的任务就是实现服务器端与客户端浏览器的信息交互。通过表单以参数的形式提交给服务器。
提交信息的方式包括GET与POST,分别触发Servlet的doGet方法和doPost方法。最早HTTP协议设计的是,GET用于从服务器获取信息(请求信息),而POST用于向服务器提交数据(普通POST提交与可上传文件的POST提交)
一、GET实现搜索引擎
当以GET方式提交数据时,浏览器把表单内容组织成一个查询字符串,各变量以&连接,然后以Servlet路径加问号“?”加查询字符串的形式获取服务器内容。
如向某个Servlet提交两个参数a和b,http://servername/someServlet?a=aValue&b=bValue。
Servlet中HttpServletRequest对象通过方法getParameter("a")获取到a的值aValue。
外接搜索引擎API 略。
※ 要想在搜索引擎搜索中文,需要修改Tomcat目录下的\conf\server.xml里设置默认的GET的编码方式,不指定将默认是ISO-8859-1编码。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEn
coding="UTF-8"/>
URIEn
coding="UTF-8"/>
二、POST表单提交个人信息
同GET方式一样,可以通过HttpServletRequest对象的getParameter(String param)方法来获取param对应的参数值。但POST方式不会使用?和&符号来组织一个QueryString,因此使用getQueryString()会返回null。
下面用一个例子提交用户信息表单。
省略配置文件。
三、POST上传文件
(1)客户端
Web文件上传也是使用POST,与之前表单不同的是,需要设置FORM的enctype属性为multipart/form-data,因为文件会比较大所以设置该参数指定使用二进制上传;不设置默认将使用过ASCLL向服务器发送数据,导致失败。
文件域用<input type="file"/>
结果
(2)服务器端
由于上传的是二进制数据,因此Servlet不能简单地通过HttpServletRequest的getParameter()方法来获取文本域以及文本域内容。要想获取内容必须根据HTTP协议所规定的格式解析浏览器所提交的Request。
于是使用类库来完成。如SmartUpload(是一个商业类库,解析的数据会存放在内存里,速度快,但容易发生内存溢出),Apache Commons Fileupload。由于DiskFileUpload已经过时,于是用ServletFileUpload代替。下载两个开源包:Commons-fileupload、Commons-io。
四、带进度条的文件上传(Session&Ajax)
五、实现文件下载
七、Servlet生命周期
八、Servlet之间的跳转
九、线程安全