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. 自学asp.net mvc(一)

    之前一直做asp.net的webform,现在想学习一下mvc,把自学中遇到的问题记录到博客. 一.codeplex上托管代码 1. 2. 3. 4. 5. 6. 7. 8. 9.

  2. MVC返回图片

    这几天忙着一些小事,也没有写什么了,今天,我们来玩一个比较简单的东东.就是在MVC下如何返回图片,相信,在传统WebForm下,大家都晓得怎么弄,方也不限于一种,但是,在架构较为严格的MVC里面,刚开 ...

  3. 【收藏】win7打开word每次提示配置解决办法

    打开“我的电脑”——“ C:\Program Files\Common Files\Microsoft Shared\OFFICE12\Office Setup Controller ”——找到一个“ ...

  4. 结对开发:7-magic用户调研报告

    用户调研报告 班级   信1201-2班  学号   20122929     姓名  崔乐乐 项目名称:7-magic 调研时间: 2015/4/14 调研主题:7-magic游戏的用户需求度调研 ...

  5. java7新特新(一) Try-with-resources (TWR)

    Try-with-resources (TWR) 在处理IO的代码中,我们会使用大量的try...catch()...finally...语法,其中会在finally进行IO的close操作,写过py ...

  6. mono for andorid 引用外部的dll问题

    这几天玩mono for android 心想,咱c#终于可以开发移动应用了,心里那个美啊------------ 先开发个什么呢,想起来前几天看到微博里一个用姓名笔画来算两个人关系的小测试,开发个这 ...

  7. 学习Linux第六天

    1.Shell编程 bash变量: 都是以字符串格式存储 x=5 等号左右不能有空格,会当作命令处理 如何调用: echo $x 此法无法进行数值运算,不存在的变量输出空 set -u 设置变量报错 ...

  8. 单点登录的原理与CAS技术的研究

    1.什么是单点登录? 关于单点登录技术的说明参考文章:http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html 一般来说,整个原理大家 ...

  9. [noip2005提高]过河 dp

    由于L的范围到了109,用普通dp做肯定是不成了: 可以观察到M的数量很小,dp在转移的过程中有大量的无用转移: 可以想到压缩范围,问题是如何压缩,观察若S=9,T=10时,能到达的点,9,10,18 ...

  10. 讨论下IDS的绕过

    自从知道dedecms自带了80sec的内置Mysqlids后,一直以来也没有想到绕过的办法.或者是自己mysql的根底太差了吧.于是分析dedecms源码时,只找模板执行,本地包含,上传等,完全没有 ...