Servlet学习总结

html/css静态网页
servlet 动态网页
web开发(企业级开发) 访问网络上的html网页

c/s:客户端/服务器端开发
优点:客户端分担服务器端的功能(QQ客户端的聊天记录) 安全性高
缺点:必须安装客户端,开发开销大,维护困难,不能无缝升级
B/s:浏览器/服务器端(主流的企业级开发模式,只需浏览器,网上银行)
优点:不需要安装客户端,浏览器就是客户端,开发开销小 可以无缝升级
缺点:安全性不高,服务器端硬件要求高,服务器端的操作将会是软件核心。—压力(并发,效率,网络传输)

二:web应用
互联网
基于TCP/IP协议:四层协议
应用层:http、ftp、pop、file、、、
传输层:UDP、TCP
网络层:ip
数据链路层

万维网
web应用就是一种万维网

三、Servlet
1、CGI公共网关接口
a、早期开发动态网页,也是web开发的一门技术
b、CGI每次都会启动一个进程来处理客户端发送的request,然后给客户端返回处理之后的response,即生成动态的html网页,但是效率很低
c、基于http协议
d、可以多语言开发
2、servlet
a、代替CGI 用来开发动态网页
b、Servlet每次都会启动一个线程来处理客户端发送的request 然后给客户端返回处理之后的response,即生成动态的html网页,效率比较高。
c、基于http协议
d、使用java语言编写
e、简单定义:
servlet是运行在服务器端的java类
servlet是j2ee的一套技术标准,一套api包
javax.servlet.*;
javax.servlet.http.*;
f、专业的定义
servlet是一个web组件
组件:用少量代码完整一个功能
web组件:用少量代码完成一个与用户请求相关的功能(比如注册 登陆)
g、servlet的缩写 server applet

四web server(web服务器 应用服务器)
服务器 一台主机 安装相关软件
web服务器:必须安装可以接受基于http协议的请求,并且可以处理该请求,最后返回相应给客户端软件。
软件(web容器):常见的web容器
Tomcat:由Apache提供的开源免费软件
微软公司提供的IIS:ASp.NET
商业的ejb容器:
weblogic:BEA
WebSphere:IBM
客户端—-》web服务器—》web应用

五 Tomcat
bin存放tomcat可执行文件(启动或关闭tomcat)
conf:存放tomcat的配置文件
lib:存放tomcat运行所需要的jar包和其他web应用需要的jar包
logs:存放日志文件
temp:存放临时文件
webapps:存放部署到tomcat上的web应用
work:存放jsp相关的servlet文件

配置环境变量
CATALINA_HOME:
JAVA_HOME:
path加 %CATALINA%/bin

六、手动的编写servlet
a、web应用部署到web服务器上的结构
可以不需要src的源文件目录
–web应用的工程名Myservlet
–WEB-INF
–classes 存放字节码文件
–lib 存放jar包
–web.xml

        ----*.html
        ----*.js
        ----*.css
        ----*.image
        ----*.jsp

b、编写一个servlet类
继承HttpServlet、GenericServlet 实现SErvlet
    重写service方法
c、在web.xml描述servlet


    
    


    
    


d、http://localhost:8088/Servlet/First
http://指定访问数据的http协议
localhost 指定服务器端口地址 127.0.0.1
8088 指定端口号
http://localhost:8088访问web服务器tomcat
/Servlet指定部署到tomcat上的web应用路径
/first 代表servlet的路径  
http的状态码404 代表不可用
e、web应用的执行流程
    发送请求--找servlet---返回请求
1、打开浏览器-输入地址回车--发送基于http请求的request
2、该请求被对应的web服务器中的web容器接受到,web容器在webapps下对应的web应用,如果找到了对应的web应用,会自动加载该web应用中的web.xml文件,找对应的url-pattern标签---servlet-name标签--servlet-class标签。找到对应的servlet,然后启动线程调用该servlet的service方法来处理请求。service方法将输出流通过web容器包装成response返回客户端。
3、如果资源(web应用或者servlet资源)不存在,直接返回404错误给客户端,代表该资源不存在。
http协议的状态码
404 资源找不到 
200 ok正常
505 java程序内部异常

servlet是单例模式
如果是第一次加载该servlet 容器会将该servlet加载到虚拟机并初始化,如果第二次调用该servlet,容器不会加载并且初始化一个新的servlet 调用原有的servlet的service方法来处理请求

七、将tomcat集成到java EE版本的eclipse中
点击Window–show View—Other—输出Servers进行过滤
选中Services,点击Ok.
在该Services窗口中新建一个新的Server.
双击新建的Server进行配置,修改web应用保存的位置
鼠标右击启动Server,打开浏览器访问Tomcat.

新建Dynamic Web Project工程。
新建package,新建class,编写Servlet,配置Servlet

1、继承HttpServlet 常用的
调用父类继承下来的service方法
分发给自己的service方法
根据请求的方式调用其doGet、doPost方法
重写doget dopost方法
2、继承 genericService方法
获得传入数据参数 写出图片(xml 或者取图片文件)
3、实现servlet 了解servlet生命周期

表单提交方式

action:表单提交后的走向(地址)
method:修改表单提交的方式
1、get
将数据放在协议头部 可以在浏览器地址栏看到,安全性不高,提交少量数据 小于等于256个字符
2、post
将数据放在协议的体部
不可以再浏览器看到
安全性比较高
提交大量数据
明确指明method为post 才是post提交
否则其他方式都是get提交
b、乱码问题
原则:字符从编写到显示采用同一种编码方式
UTF-8 GBK GB2312
1、控制字符编写的编码
工程–properties–resource–Text File Encoding– GBK,UTf-8
2、数据传输的乱码
a、request出现乱码
i、当使用post提交数据
request.setCharacterEncoding(“GBK”);
ii、当使用get提交数据还需要修改配置文件:
修改tomcat的配置文件server.xml中之前
修改端口号的标签中添加
URIEncoding=”GBK”
b、response出现乱码
response.sercharacterEncoding(“GBK”);
3、浏览器显示的乱码
浏览器设置显示编码
4、数据库中的乱码
存的时候什么编码
取得时候就什么编码
c、路径问题
1、相对路径
相对于当前访问路径(浏览器地址)
2、绝对地址
相当点:以/开头的路径
如:html
/在web应用的后台是web应用的路径。
如servlet
d 跳转问题
1、服务器内部跳转:请求分发跳转
a、是同一个请求
b、能够获取的请求的数据
c、浏览器的地址不会发生该bain
d、不能够访问其他应用程序的资源
需要两步
第一步:获取转发器RequestDispatcher
a、从request中获取转发器
request.getRequestDispatcher(path);
参数可以相对路径也可以绝对路径
b、从servletContext上下文获得转发器
getServletContext()
getRequestDispatcher(path)
参数必须是绝对路径
第二步 进行跳转
a、forward会清空前一个response输出流中的信息
b、include 不会清空前一个rsponse中的信息 并且保存跳转到页面中输出。
2、重定向跳转 服务器外部跳转
response.sendRedirect(path)
path可以相对路径也可以绝对路径
特点a、不是同一个请求 发送了两次请求
b、不能够获取请求的数据
c、浏览器的地址会发生改变
d、能够访问其他应用程序的资源

数据库访问
1、JDBC的方式获取connection
每次都需要打开关闭连接效率很低
连接能一直打开 需要的时候取出来
不需要的时候由服务器保存
获取src下的配置文件的方式 获取类加载器获取文件
Properties p= new Properties();
InputStream in = ConnectionFactory.class
.getClassLoader();
getResourceAsstream(“jdbc.properties”);
p.load(in);

2\连接池
可以依照tomcat下的docs文件中
jndi-resource-howto.html
jndi-datasource-examples-howto.html
配置连接池

web项目的三层架构
web项目的后台代码 整体上分了三层
web层
    主要是servlet
    1、接收客户端传过来的数据
    2、把数据封装成pojo/bean对象
    3、把对象交给service进行业务处理
    4、根据service业务处理的结果来决定返回什么样的界面给用户

service层
    service层的接口
    service层接口的实现类
    1、根据web层传过来的对象/数据进行业务逻辑处理
    2、在处理业务逻辑的时候,经常需要和数据库进行交互,这个时候需要借助dao层的方法来完成。
    3、根据dao层的方法在数据库中的交互结果,service层就可以判断出这个功能是否能正常进行。
    4、把最后的处理结果,通过一些方法返回给web层,以便web层决定接下来吧什么页面显示给用户

Dao层
    dao层接口
    dao层接口的实现类
    1、根据service层的需要和数据库进行交互 最后把交互结果返回给service层即可。

装态的持久化/会话追踪技术/ 状态跟踪
1、http协议的访问是无状态的访问
当前访问时不会知道之前访问的状态的
(http协议的访问是不会帮我们保存访问记录的)
2、有些时候需要记录之前的访问状态
状态的持久化/状态跟踪:用来保存web应用中所产生的数据
会话追踪技术:Cookie,session

3session和cookie的位置 session是保存在服务器端的一个对象,客户端是没有session 的。
cookie在客户端和服务器端都会有但是存在形式不一样,在客户端是以java对象的形式存在。
平时的cookie是指客户端文件形式存在的cookie
4、session和cookie的作用
session是在服务器端保存用户的相关信息
cookie在是在客户端保存session的信息
例如session的id值 全名为JSESSionID
5、Cookie
a、原理 Cookie产生于服务器端 以文件的形式保存在客户端,response对象会把cookie带回到浏览器 然后浏览器吧cookie对象中的内容
保存到一个cookie的文件中
并且每次发送请求都会将cookie的数据放在request发送给服务器端
b、创建Cookie:cookie就是对象
只能放String类型
Cookie cookie = new Cookie(“name”,”tom”);
Cookie cookie2 = new Cookie(“passwd”,”tom”);
c、保存cookie到客户端
response.addCookie(cookie);
d、servlet中拿出从浏览器发送过来的cookie文件中的数据
e、cookie的存活期 默认是-1 单位是秒
setMAxAGE(秒数)
会话cookie 如果是负数 将cookie保存在浏览器上默认
持久cookie 如果是正数 将cookie保存在文件中

注意如果没有设置coookie的生效时间 那么这个cookie就是一个会话cookie,当关闭cookie就是失效了。
禁用cookie 针对浏览器来禁用cookie
不允许在本地保存cookie文件。
f禁用cookie
针对浏览器来禁用cookie
不允许在本地保存cookie

6 session会话
a、原理:产生于服务器端,保存于服务器端,维护与服务器端。服务器端每产生一个新的session,都会分配一个唯一的id值,并且把这个session以coookie的形式保存在客户端。并且这个cookie的键是jessionid

b、创建session 对应的类HttpSession
1、HttpSession session = new HttpSession();
if(JSESSionID==null){
    创建一个新的session
}else{
    return 获取存在session
}
2、HttpSession session = new HttpSession(true);
    return session;
3、HttpSession session = new HttpSession(false);
    if(JESSIONID==null){
        return null;
    }else{
        return 获取存在的session
    }
c、保存数据
session.setAttribute(String,Object);
d、取出数据
session.getAttribute(String);
e、服务器端在维护session的存储结构:
    Map>
f、Session的生命周期

当web应用第一次调用getsession()时,会创建一个新的session。接下来锁打开的都属于同一个session。遇到以下的情况。session会失效。
1、关闭浏览器(session存在服务器端,取不到。
2、服务器端手动调用invalidate方法
3、当session的不活动时间超过了session的最大存活期。不活动时间即发呆时间,不是累计的。默认最大存活时间是30分钟。在tomcat 的web.xml中可以看到默认时间。修改最大存活期:两种方式
a、在servlet源代码中做修改:单位是秒
session.setMaxInactiveInterval(60)
b、在web应用的web.xml文件修改

20

g、web应用的四大范围:保护数据以及传递数据
pageContext指的是一个页面的范围
只在jsp中使用
request 指的是一个请求的范围 可以包含多个页面
session指的是一个会话范围可以包含多个request
servletContext指的是一个web应用的范围,可以包含多个session
h、重写url 会话追踪技术的一种
1、url重写的作用
当前浏览器把cookie禁用之后,浏览器在发送请求时,就不会把cookie带回到服务器端了(包括jessionid)禁用cookie之后 浏览器拒绝一切站点向浏览器写入cookie(注意禁用之前是否已经有存在的cookie) 这样的话浏览器发送请求的时候就不能在服务器端根据jsesssionid来拿到之前创建的session对象了(因为发送请求时没有把jessionid值传给服务器)可以使用url重写来解决这个问题
2、jsessionid从客户端传给服务器的方式
第一种方式
jsession保存在cookie文件中,浏览器发送请求的时候把这个cookie文件中的数据带给服务器
第二种方式
通过传参的方式,把jsessionid的值通过要访问的url传给服务器(url重写)
3、url重写的实现
String url = response.encodeURL(“URL”);
这个方法参数是要访问的url
这个方法会把重写后的url以字符串形式返回

        例如在一个超链接中本来要访问的url是
        
        重写后
        

        注意:response.encodeURL("URL")方法
        如果当前没有使用到session 则直接返回参数url。同时还要注意禁用cookie后是不是已经把之前的cookie给删除了

7、session和cookie之间的关系
a、客户端访问服务器端的时候,假设服务器端创建了一个session对象,服务器端的内存里同时可能有好几个session对象,分别对应的不同的客户端访问,每一个session对象都有一个为一个id值叫做jsessionid
b、服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个值以一个cookie形式保存起来
c、在此之后 这个浏览器再发送请求到服务器时候,就会把之前保存的cookie文件中jsessionid的值传给服务器,服务器通过这个jsessionid的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应。
d、这样来就能达到 客户端每一次访问 在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享。
四 web项目中的路径
1、客户端中的/代表端口号后的/
2、服务器端中/代表端口号后的/

httpreservlet中和路径相关的方法
request.getContextPath();
返回请求使用的实际上下文路径
request.getServletPath();
request.getRequestURL();
request.getRequestURI();
ServletContext中和路径相关的方法
servletContext servletContext = getServletContext();

servletContext.getContextPath();
servletContext.getRealPath("/");
servletContext.getREsourcePaths("/");

Servlet的生命周期
一、servlet的生命周期由web容器来管理
第一个阶段:加载和实例化对象 只调用一次
默认情况下第一次访问该servlet的时候,由web容器将.class加载虚拟机。然后调用构造方法来实例化新的对象。第二次访问该servlet时不会创建新的对象。
加载方式:
a、延迟加载 默认
当第一次访问时加载该对象
b、预先加载
当tomcat启动时候加载该对象
修改加载方式:在web.xml中指定servlet的加载模式 在servlet的标签中添加
num
num>=0预先加载
num越小越先加载
num<0延迟加载
num默认为-1
第二个阶段 初始化对象 只调用一次
加载和实例化对象之后就调用init()
初始化参数 init()
传参数 web.xml
局部参数:针对一个servlet
全局参数:针对所有servlet
第三个阶段 处理请求 服务方法 调用多次
调用service
每一个请求来了 启动线程调用该方法处理请求
servlet对象只有一个属于单例模式
servlet线程不安全
如何控制:
1、加synchronized(this){}
2、把一些受影响的变量定义为局部便来给你 局部变量是不共享的变量
第四个阶段 销毁对象 只调用一次
调用destory()
当tomcat关闭或者当web应用重新部署的时候会销毁对象
二:servlet接口中的方法
初始化servlet对象的时候被调用
void init(ServletConfig config)
销毁servlet对象时调用
void destory{}
访问servlet对象时被调用
void service(SErvletHttpREquest req,HttpServletResponse resp){}
返回servlet相关信息 比如作者 版本 版权等
父类中默认返回一个空字符串””
如果需要的话程序员可以自己重写这个方法
STring getSErvletInfo()
返回servletConfig对象

SErvletConfig接口中的方法
ServletConfig 接口的实现类对象,表示一个servlet在web.xml文件中的配置信息。
返回servlet在web.xml文件中所配置的名字
String getServletName();
获得web.xml中所配置的指定名字的参数值
在web.xml中可以通过标签给servler传参
String getInitPArameter(String name)
获得当前servlet上传的所有参数的名字
Enumeration getInitParameterNames()

获得SErvletContext类型对象
//servletContext是web项目中非常重要的一个类型对象
ServletContext getSErvletContext()

Filter 过滤器
过滤器作用
在一个请求访问某个资源的时候 fiter可以在这个请求访问这个资源之前,吧请求拦下,做出一系列的处理和判断最后fiter再决定是否要让这个请求去访问那个资源

    filter在客户端和访问资源的中间位置
    filter可以在请求访问资源之前拦截请求
    filter可以在响应返回客户端之前 拦截响应

    作用a、可以修改response和request中的数据
    b、可以做日志输出
    c、可以做事务管理
    d、可以控制字符乱码
    e、可以控制用户的访问权限

编写filter过滤器
    继承Filter接口
     init destory dofilter
    init 这个过滤器类被服务器创建对象的时候会调用到这个方法
    destory 过滤器对象被销毁的时候会调用这个方法
    doFilter当过滤器拦截到请求的时候,会调用这个doFilter

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    FilterChain是一个接口代表过滤器链这个接口中只有一个方法
    public interface FilterChain {
        public void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException;
    }

同一个请求有可能要依次通过两个或多个过滤器链条对象,就是用这个FilterChain类型的对象来表示
chain.doFilter(req,resp)表示把当前的req和resp给过滤链条的下一个过滤器进行过滤,如果已经没有下一个过滤器 那么就把这次访问放行,让他访问真正要访问的资源

在web.xml中配置filter过滤器
在标签中也能使用给过滤器传值

        encodingFilter
        com.briup.filter.EncodingFilter
    

    
        encodingFilter
        /*
    

其中有四种配置方式
第一种精确匹配
    /test_servlet
第二种扩展名匹配
    *.html
第三种 路径匹配
    /test/*
    路径匹配和扩展名匹配无法同时设置
第四种 匹配任意的url
    *
注意:filter过滤器只是会拦截地址栏中出现的路径,如果服务器内部跳转的路径 filter是不会拦截的

多个filter过滤器的执行顺序
如果有多个过滤器 并且多个过滤器拦截的有相同的部分,就有一些路径会被这多个过滤器拦截,过滤器的顺序是按照web。xml的配置顺序由上到下

监听器 分三大类
1、监听request相关的接口
ServletRequestListener
requestDestory 销毁
requestInitialized 初始化
ServletRequestAttributeListener接口
attributeAdded 属性添加
attributeRemoved 删除
attributeReplaced 修改
2、监听session相关的监听器
HttpSessionListener接口
sessionCreateAdded
sessionDestoryed
HttpSessionAttributeListener接口
attributeAdded
attributeRemoved
attributeReplace
3、监听application相关的监听器
ServletContextListener接口
contextInitialized
contextDestory
ServletContextAttributeListener接口
attributeAdded
attributeRemoved
attributeReplaced
在web.xml中配置Listener监听器

<listener>
        <listener-class>com.briup.listener.TestListenerlistener-class>
    listener>

你可能感兴趣的:(JAVA学习)