Servlet
一、基本概念
我们的程序根据是否需要访问网络,可分为网络程序和非网络程序。而
网络程序又分为B/S结构和C/S结构。
什么是C/S?即客户端(Client)/服务器(Server)模式。这种模式的
客户端需要安装一个胖客户端(RCP)的程序,与服务器进行通讯交换数据。比
如:QQ、迅雷、视频播放器等。
优点:
1.C/S架构的界面和操作可以很丰富。
2.安全性能可以很容易保证,实现多层认证也不难。
3.由于只有一层交互,因此响应速度较快。
缺点:
1.适用面窄,通常用于局域网中。
2.用户群固定。由于程序需要安装才可使用,因此不适合面向
一些不可知的用户。
3.维护成本高,发生一次升级,则所有客户端的程序都需要改变。
什么是B/S?即浏览器(Browser)/服务器(Server)模式。一般的网站都
是B/S结构的,比如:Google、Baidu、购物网站、交友网站、网上营业厅等。
优点:
1.客户端无需安装,有Web浏览器即可。
2.可以直接放在广域网上,通过一定的权限控制实现多客户访问的
目的,交互性较强。
3.无需升级多个客户端,升级服务器即可。
缺点:
1.在跨浏览器上,B/S架构不尽如人意。
2.前端表现要达到C/S程序的程度需要花费不少精力。
3.在速度和安全性上需要花费巨大的设计成本.(由于基于HTTP协议的)
这是B/S架构的最大问题。
4.客户端服务器端的交互是请求-响应模式,通常需要刷新页面,
这并不是客户乐意看到的。

Web访问的基本原理:
1.输入网址在浏览器
2.浏览器向服务器端发生请求
3.服务器端接收并处理请求生成处理结果(如HTML)
4.服务器将响应结果发送给浏览器
5.浏览器根据结果在浏览器中进行相应的显示。

HTTP超文本传输协议:
浏览器与服务器间的应用层通信协议,其基于TCP/IP协议之上。
通信过程:
1.建立连接(Socket)
2.发送请求消息
3.发送响应消息
4.关闭连接

静态页面与动态页面:
静态页面:显示内容保持不变
缺点:
不能即时消息,更新困难,不能满足用户多样性需求。
动态页面:
CGI:公用网关接口。服务器端的一个程序。
缺点:
每次请求启动一个系统进程且加载运行一个CGI程序,
开销大。
需重复编写处理网络协议的代码,麻烦,工作量大。
Servlet:改良后的CGI
缺点:
后台处理与前台显示不分离
JSP:
HTML+Servlet
二、环境搭建
1.JDK
2.Browser: chrome、firefox、ie.....
3.Web服务器:
IIS:支持ASP,或通过插件支持PHP
Apache:处理静态页面效率高
Tomcat:轻量级Java Web服务器,支持Servlet/JSP,插件支持PHP
不支持EJB
JBoss:开源的重量级Web服务器,良好支持J2EE各种规范
Weblogic和WebSphere:商业服务器
我们选择的是Tomcat。

主要的目录结构:
1)bin:放置的是启动和关闭tomcat服务器等这些命令,
包括windows和unix下面的俩类命令
2)conf:放置的是tomcat这个软件的配置文件
(1).context.xml
文件中描述了tomcat读取项目中的配置文件(web.xml)的路径
(2).server.xml
可以配置tomcat运行的时候所监听的端口号,以及这个端口号
上面绑定的协议,我们主要关注的是Http协议
(3).tomcat-users.xml:
tomcat为我们提供了一些用户,可以用这些用户登陆到tomcat中
去管理tomcat里面放置的javaWeb项目资源以及tomcat的一些属性
配置,我们还可以自定义一些tomcat用户
(4).web.xml
用来web应用程序配置信息:
比如Welcome页面、servlet、servlet-mapping、
filter、listener、启动加载级别等
3)lib:放置tomcat中的所有Web项目公用的jar包
4)logs:放置tomcat在运行中所产生的日志文件
5)temp:放置tomcat在运行中所临时文件
6)webapps:项目部署目录
7)work:和jsp的编译和运行相关的一个目录
配置环境变量:
CATALINA_HOME
path
eclipse引用
项目部署:
手动部署
WebTest——
|——WEB-INF
|——classes 自定义java类的字节码
|——lib 第三方jar包
|——web.xml
|——自定义目录
自动部署
ware包部署
三、Servlet
Java Web应用程序中的所有请求与响应都是由Servelet来完成的。
0.相关包:
javax.servlet
javax.servlet.http
1.三种创建servlet的方式
1.实现javax.servlet.servlet接口
必须实现5个方法
init(servletconfig config)
service(servletrequest req,servletresponse resp)
destroy()
getservletconfig()
getservletinfo()

2.继承javax.servlet.GenericServlet
提供了servlet接口的基本实现,所以他的子类都必须实现service()方法
3.继承 javax.servlet.http.HttpServlet
扩展了genericservlet并且提供了servlet接口中具体于http的实现,
它更象一个其他所有的servlet都要扩展的类
doGet():
dopost();
三者之间的关系

:

2.配置<servlet>
<servlet>
<servlet-name>定义servlet名字</servlet-name>
<servle-class>servlet类名</servle-class>
</servlet>
3.配置<servlet-mapping>
<servlet-mapping>
<servlet-name>定义servlet名字</servlet-name>
<url-pattern>访问servlet的url<url-pattern>
</servlet-mapping>
4.servlet的任务
1)读取客户端发送过来的显示或隐式的数据,如:表单数据、cookies、媒体类型等
2)处理数据并生成结果。该过程可能需访问数据库或直接计算出对应的相应
3)发送显示或隐式数据给客户端,如:html、image、cookies等
************************
Servlet中的细节问题:
************************
⑴一个已经注册的Servlet可以被多次映射即:
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <!-- servlet的注册名 -->
    <servlet-name>MyServlet1</servlet-name>
    <!-- servlet类的全路径(包名+类名) -->
    <servlet-class>com.hsp.servlet.MyServlet1</servlet-class>
  </servlet>
<!-- 对一个已经注册的servlet的映射 -->
  <servlet-mapping>
   <!-- servelt的注册名 -->
     <servlet-name>MyServlet1</servlet-name>
   <!-- servlet的访问路径 -->
     <url-pattern>/MyServlet1</url-pattern>
  </servlet-mapping>
-------------------------------------------  
  <servlet-mapping>
   <servlet-name>MyServlet1</servlet-name>
  <url-pattern>/hsp</url-pattern>
  </servlet-mapping>

⑵ 当映射一个servlet时候,可以多层 比如 
<url-pattern>/servlet/index.html</url-pattern> 
从这里还可以看出,后缀名是 html 不一定就是 html,可能是假象.

⑶使用通配符在servlet映射到URL中
有两种格式:
第一种格式  *.扩展名  比如 *.do  *.ss
第二种格式  以 / 开头 同时以 /* 结尾  比如  /*   /news/* 
通配符练习题:
l Servlet1 映射到 /abc/* 
l Servlet2 映射到 /* 
l Servlet3 映射到 /abc 
l Servlet4 映射到 *.do

问题(面试题):
l 当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
l 当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
l 当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
l 当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
l 当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
 
在匹配的时候,要参考的标准:
(1) 看谁的匹配度高,谁就被选择
(2) *.do 的优先级最低

⑷Servlet单例问题
 
当Servlet被第一次访问后,就被加载到内存,以后该实例对各个请求服务.即在使用中是单例.
因为 Servlet是单例,因此会出现线程安全问题: 比如:
售票系统. 如果不加同步机制,则会出现问题:
所以我们一般遵循这样的原则:
(1) 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制
synchronized (对象){
//同步代码
}
(2)如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题

⑸ HttpServletResponse的再说明:
getWriter()
getOutputStream();
 
区别
1. getWriter() 用于向客户机回送字符数据
2. getOutputStream() 返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)
OutputStream os=response.getOutputStream();
os.write("hello,world".getBytes());
 
如何选择:
如果我们是回送字符数据,则使用  PrintWriter对象 ,效率高
如果我们是回送字节数据(binary date) ,则只能使用 OutputStream
☞ 这两个流不能同时使用.
比如:
OutputStream os=response.getOutputStream();
os.write("hello,world".getBytes());
PrintWriter out=response.getWriter();
out.println("abc");
就会报错:

java.lang.IllegalStateException: getOutputStream() has already been called for this response
 
这也是不能同时使用printWriter和outputstream的原因。
Web服务器会自动检查并关闭流
从中,我们也可以看出. 为什么我们没有主动关闭流,程序也没有问题的原因.
当然:你主动关闭流,更好.

⑹HttpServletRequest对象的详解
该对象表示浏览器的请求(http请求), 当web 服务器得到该请求后,会把请求信息封装成一个HttpServletRequest 对象
• getRequestURL方法返回客户端发出请求时的完整URL。
• getRequestURI方法返回请求行中的资源名部分。
• getQueryString 方法返回请求行中的参数部分(参数名+值)。
该函数可以获取请求部分的数据 比如
http://localhost/web名?username=abc&pwd=123
String str=request.getQueryString(); 就会得到  username=abc&pwd=123
 
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
客户机的端口号是随机选择的,web服务器的端口号是一定的
getLocalPort方法返回web服务器所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
u url 和 uri 的区别
比如:
Url=http://localhost:8088/servletPort3/GetinfoServlet 完整的请求
Uri=/servletPort3/GetinfoServlet web应用的名称+资源的名称

servlet学习笔记一的更多相关文章

  1. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

  2. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  3. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  4. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. Servlet 学习笔记

    Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...

  7. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  8. Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain

    笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...

  9. Servlet学习笔记(八)—— 文件下载

    一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...

  10. JSP&Servlet学习笔记----第1/2章

    HTML(HyperText Markup Language):超文本标记语言 HTTP(HyperText Transfer Protocol):超文本传输协议 URL(Uniform Resour ...

随机推荐

  1. [转]ubuntu 10.04下的配置tftp服务器

    [转]ubuntu 10.04下的配置tftp服务器 http://www.cnblogs.com/geneil/archive/2011/11/24/2261653.html 第1步:安装tftp所 ...

  2. DataView usage combind with event and ViewModel From ERP-DEV

    reflesh the selected item in DataView when we use DataView to display a set of data. Generally, we b ...

  3. Android实现SQLite数据库联系人列表

    Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...

  4. urllib3 PoolManager

    A pool manager is an abstraction for a collection of ConnectionPools.If you need to make requests to ...

  5. sublime mac快捷键

    ^是control ⌥是option 打开/前往 ⌘T 前往文件 ⌘⌃P 前往项目 ⌘R 前往 method ⌘⇧P 命令提示 ⌃G 前往行 ⌘KB 开关侧栏 ⌃ ` python 控制台 ⌘⇧N 新 ...

  6. 局域网内Tomcat服务器没法访问

    多半是防火墙的问题,在server2008上打开防火墙设置,关闭即可访问,不关闭的访问方式暂时好没研究出来

  7. snmp数据包分析

    今天看了一下snmp数据包的报文格式,用wireshark抓了两个数据包来分析. 先说说snmp get-request的书报包格式吧,get-next-request,get-response,se ...

  8. 一些 Shell 脚本(持续更新)

    1. 启动日志分析 启动日志格式如下: 开机时间:2015/05/13 周三 16:45:17.79 关机时间:2015/05/13 周三 18:46:03.91 开机时间:2015/05/14 周四 ...

  9. 【Minimum Depth of Binary Tree】cpp

    题目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the ...

  10. Java 调用 Javascript 函数的范例

    在Java 7 以后,可以在Java代码中调用javascript中的函数,请看下面的例子: package com.lee; import java.io.FileNotFoundException ...