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. 单行bash、shell、perl命令

    主题:单行经典bash.shell.perl命令 作者:luomg 摘要: 会陆陆续的写自己工作中的常用有意思的命令,争取你能看完后就能搞定常见操作, 且尽量自少提供基本shell.perl的实现方式 ...

  2. mif_maker2010.exe下载和使用说明

    mif_malker2010.exe下载地址:http://pan.baidu.com/s/1bCqAp4 使用说明:http://www.cnblogs.com/BitArt/archive/201 ...

  3. Ubuntu14.04安装配置ndnSIM

    Ubuntu14.04安装配置ndnSIM 预环境 Ubuntu14.04官方系统 请先使用sudo apt-get update更新一下源列表 安装步骤 安装boost-lib sudo apt-g ...

  4. SetTmer函数调用 、取时间函数调用 、计时函数

    SetTmer函数调用 #include <iostream> 取时间函数调用 计时函数

  5. l2tp vpn客户端

    1. 添加PPA   sudo apt-add-repository ppa:seriy-pr/network-manager-l2tp   2. 刷新软件包缓存   sudo apt-get upd ...

  6. 搭建SpringMVC+MyBatis开发框架四

    在src/main下面新建一个resouces文件夹,我们继续配置一些资源 1.新增applicationContext.xml:  <?xml version="1.0" ...

  7. c语言编程之二叉排序树

    二叉排序树,又称为二叉查找树.它是一颗空树,或者是具有下面的性质的二叉树: 1.若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值: 2.若它的右子树不空,则右子树上所有节点的值均大于它的根 ...

  8. 【吐血推荐】简要分析unity3d中剪不断理还乱的yield

    在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...

  9. C#制作高仿360安全卫士窗体(四)- 水晶按钮

    项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...

  10. WPF中的Style(风格,样式)(转)

    在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而 ...