Web阶段--Servlet基础知识点

Web阶段–Servlet基础知识点

一、静态页面与动态页面

1.静态页面

概念:在Web模型中,页面中的信息是在html文件中定义好的,数据不会改变,称为“静态页面”,无法根据用户需求实时定制数据

2.动态页面

概念:网页中展示的数据来自于java程序的运行结果,随着业务的发展,网页中的数据会发生改变
工作原理:
	输入URL,通过互联网与WEB服务器建立网络连接(Request请求)---->
	WEB服务器接受到请求后调用一段Java程序--->
	WEB服务器将Java程序的输出结果传输给客户端(Response响应,通常以“网页”)---->
	浏览器将程序的输出结果显示在网页上

二、Servlet概念

1.什么是Servlet?

Servlet是一种生成动态网页的技术,是JavaEE规范的一部分,一种运行在tomcat服务器上的,用java编写小程序,可以接收浏览器(客户端—client)发出的http请求,并且服务器为client做出响应( 一般以网页的形式体现 --- 动态网页)

2.运行方式

开发好的java程序,需要发布到tomcat服务器上,由服务器在用户请求达到时调用

三、动态B/S结构的开发

1.开发流程

环境搭建--->程序开发--->部署应用--->配置文件--->程序访问

2.环境搭建

1 在Tomcat服务器的webapps目录下新建myweb应用
2 在myeclipse里新建一个javaproject项目
3 将servlet开发所需的servlet-api.jar引入到建好的webproject中
       备注:servlet-api.jar 存放于 tomcat安装路径/lib目录中

3.程序开发----第一个Servlet程序

1. 实现servlet程序的三种方式
	implements Servlet是javax.servlet包里的接口,覆盖5个方法(重点是service方法),与协议无关程序
	extends GenericServlet是javax.servlet包里的抽象类覆盖其中的抽象方法service(),定义与协议无关的程序
	extends HttpServlet是javax.servlet.http包里的类覆盖其中与http协议相关的service(),必须使用http协议通信
2.具体代码实现
	案例:
	public class FirstServlet extends HttpServlet{
		//向client浏览器打印当前服务器系统时间
		@Override
		public void service(HttpServletRequest request, 
						   HttpServletResponse response)
						   throws ServletException, IOException {
		//1. 设置响应内容的类型
		response.setContentType("text/html;charset=GBK");
		//2. 获取输出响应的IO流对象
		PrintWriter out = response.getWriter();
		//3. 输出数据
		Date time = new Date();
		out.println("

"+time+"

"
); out.flush(); } }

4.部署(deploy)应用(手动部署)

找到存放Tomcat的文件夹
   |-- lib	存放tomcat里所有应用都可以使用的jar包
   |-- conf tomcat的配置文件
   |-- bin  存放tomcat里所有应用都可以使用的程序
   |-- work 
   |-- webapps 存放应用程序
      |-- myweb 项目名或者应用程序名
         |-- html文件,image图片,css文件
         |-- WEB-INF
             |-- classes    存放java程序的字节码文件(注意:带着包结构)
             |-- lib        如果有,存放当前应用需要使用的私有的jar包
             |-- web.xml文件  当前应用所需的配置文件

5.配置文件—web.xml

 <servlet>
      <servlet-name> servlet程序的简称(必须保证当前文件中唯一)</servlet-name>
      <servlet-class> servlet程序的全类名(包名.类名)</servlet-class>
 </servlet>
 <servlet-mapping>
      <servlet-name> servlet程序简称,与上面的简称一致(注意区分大小写)</servlet-name>
      <url-pattern> /程序网名 (必须以/开头) </url-pattern>
 </servlet-mapping>

5.程序访问

1 启动tomcat服务器:执行tomcat/bin/startup.bat文件
2 打开浏览器,在浏览器地址输入程序的url访问
         http://127.0.0.1:端口号/应用名或者项目名/程序网名
注意:任何java源码的修改都需要重新部署.class文件,重新启动服务器访问

四、基于MyEclipse自动部署Web应用

1.配置tomcat服务器

1) window --- show view --- others --- 搜索servers -- 选中
2 ) 在console窗口找到server窗口右键 --- configurer server connector ---Tomcat--tomcat版本选择 --- 选中enable--- 在第一个选择框指定tomcat安装路径

2.新建web projectWeb阶段--Servlet基础知识点_第1张图片

1.classes目录依然存在,只是不会在MyEclipse中显示,存放MyEclipse工作空间的项目WEB-INF目录下
2.采用自动部署功能,项目名就作为将来的web应用名使用
3.如果要修改项目名字,需要同时修改web应用的部署路径(不同myeclipse版本有所差别)
	 项目右键 --- propertis --- 搜索web --- 改路径

五、请求发送的三种方式

1.地址栏手工输入

这种只适用于用户访问应用首页

2.点击超链接发送请求

<a href="目标资源的地址(如果在同一个服务器上写uri即可)">提示文字</a>

3.点击表单的提交按钮发送请求

 <form action="目标资源的uri" method="post">所提交的内容信息 </form>

六. 关于servlet程序的生命周期

1. 请求响应过程

1.地址栏输入请求地址 --- 通过ip 和端口找到tomcat服务器
2.根据地址的应用名,确定所访问的web应用,同时获取应用的配置文件web.xml
3.读取配置文件,在配置文件中查找 网名对应的servlet程序 “全类名”
4.根据全类名获取程序的对象(第一次被请求则创建对象,不是第一次则直接获取之前创建的对象)
       Class  a  = Class.forName(" 全类名 ");
       Object obj  =  a.newInstance();    --- 根据类对象创建 “类的对象 -- 实例 ”
5.使用对象调用service方法
6.service方法运行,将结果(响应)发还给客户端

2. 关于servlet程序的对象创建

1.tomcat默认只会为每个servlet程序创建一个对象(在第一次请求到达时创建) --- 应用层面的单例
2.servlet程序的四个生命阶段
           ①   构造阶段          构造方法     1次      第一次请求到达时执行
           ②   初始化阶段        init方法      1次      构建对象成功后
           ③   服务阶段          service方法   n次    每次请求到达后
           ④   销毁阶段          destroy方法   1次    服务器关闭时 
3.人为干预servelt程序对象的创建和初始化时机

Web阶段--Servlet基础知识点_第2张图片

3. 关于程序对象的线程安全问题

1) tomcat会为每一个servlet程序创建一个对象,由这个对象为所有请求它的客户端(线程)提供服务,这个对象(临界资源)有可能被多个客户端并发访问 , 需要在代码上保证程序的线程安全。
2)保证安全的策略
              ① 尽量不要为servlet程序定义 “成员变量” 
              ② 如果使用了成员变量,需要为“敏感代码”(所有操作临界资源数据的代码)加锁

七. Servlet 与 Jdbc 整合

项目开发步骤

1.搭建环境 --- 引入项目所需要的各种jar包 + 引入工具所需要的配置文件
2.复用代码 --- JdbcUtil工具类的复用(修改配置文件路径)
3.建表  ,  实体  , dao , service
4.view层程序的开发   :  servlet程序  + html网页

八. 多个servlet配合完成用户需求

1. 配合方式(两种)【重点】

1.请求转发:forward
	a.代码  --- 在第一个程序里添加如下代码
    	RequestDispatcher  rd = request.getRequestDispatcher("下一个程序的url-pattern网名");
       rd.forward( request,response );
	b.forward工作方式的特点
        ① forward连接的多个servlet程序有明显的先后顺序,形成工作流,在这个流程中,只有最后一个servlet有权向client输出结果内容,前面servlet的输出一律清空
        ② forward连接的多个servlet程序处于一个请求的生命周期
        ③ forward动作发生在服务器内部,浏览器不知晓,最终导致地址栏和网页内容不匹配
        ④ 可以使用request作用域传递数据
        ⑤ forward方式不能在两个应用的程序之间跳转(不能跨应用, 不能跨域)
	c.关于forward过程中数据的传递问题
          在forward连接的两个程序间可以使用request对象来传递数据,request本身又是一个存储空间(作用域),可以存放起了名字的值(命名属性)
        ① 存数据:request.setAttribute( "name" --- String , value --- Object );
        ② 取数据:Object  value = request.getAttribute( "name" );
2.请求重定向 redirect
	a.特点
        ① 重定向redirect连接的两个servlet程序处于两个请求的生命周期
        ② 第二次请求是浏览器根据第一次请求的响应自动发出的, 会导致浏览器地址栏发生改变
        ③ 不能使用request作用域传递数据( 整个过程是两个请求)
        ④ 可以跨域(在两个不同应用的程序之间跳转)
	b.代码
    	 response.sendRedirect( " 下一个程序的uri ");
	c.数据传递
     	① 一般情况下,不需要数据传递
     	② 可以人为模拟表单的get提交方式,将数据直接拼接到地址后面传递
         	 response.sendRedirect( "uri?name=value&name=value");
         	 接收: request.getParameter("name")
          		注意: 这种数据传递方式同时适用于超链接数据传递

2.forward和redirect异同点

1.相同: 代码运行后都可以使得程序的流程由AServlet跳转到Bservlet程序运行
2.不同:  forward(一个请求,地址栏不变)  , redirect(两个请求,地址栏变化)
3.使用选择:
      ① 如果当前程序执行结束,功能没有彻底完成 or 有大量数据需要传递,则选择 forward 跳转
      ② 如果当前程序执行结束, 功能已经完成(下一个程序涉及其他功能),选择 redirect 跳转
      ③ 无法确定,优选 redirect

九、用户信息追踪

1. 概念:

在通信过程中,保存记录用户一些重要的业务步骤操作 涉及的数据

2. 方式

1.cookie : 在客户端浏览器中保存用户状态数据
	a.概念
		1.服务器写到浏览器上的一小段String,由name和value两部分组成(不支持中文)
		2.当浏览器访问服务器时,服务器可以读取浏览器上曾经自己写过的cookie
		3.cookie有存活时间(可以设置)
	b.操作cookie的API
		1.创建cookie对象  ---  Cookie  c = new Cookie( name , value );
		2.写cookie --- response.addCookie(c)3.读cookie ---request.getCookies() --> Cookie[]  如果没有读到,返回值为null
		4.设置存活时间 ---  cookie.setMaxAge( xxx );
            ① 数字为正数: 表示存活多少秒
            ② 数字为负数: 表示cookie会在浏览器关闭时被销毁
		5.设置cookie的访问路经  --- cookie.setPath(".....");
          注意: http协议规定,只有处于同一路径下的程序才能访问该路径下程序写过的cookie(默认不能跨应用)
2.HttpSession:在服务器端保存用户状态数据
	a.定义:会话:client与服务器端的一次完整的通信过程(涵盖多次请求)
	b.使用【重点】
		1.获取 ---   HttpSession session = request.getSession( boolean -- true );
		2.HttpSession是一个作用域,可以存放“命名属性”
          	① 存数据 --- session.setAttribute("name",value);
          	② 取数据 --- Object  value = session.getAttribute("name");
          	③ 移除数据 --- session.removeAttribute("name");
	c.session对象的特点
		1.生命周期比较长
      		begin:当client访问的程序里第一次出现request.getSession(true)代码时(懒汉式创建)
       		end:timeout关闭session(服务器会为session设置一个有效存活时间 --- 默认30分钟 )
	b.控制session的有效存活时间
			① 可以在tomcat的配置文件中修改tomcat产生的所有session的存活时间(统一修改)
               		tomcat --- conf --- web.xml:
			   			<session-config>
        					<session-timeout>30</session-timeout>
    		   			</session-config>
			② 可以针对某一个应用中使用的session进行修改 ---  程序中通过函数调用修改
                session.setMaxInactiveInterval( time );       time单位秒
			③ 主动销毁session对象  --- 完成安全退出
                 session.invalidate();  

Web阶段--Servlet基础知识点_第3张图片

3.与用户相关(一个用户对应一个session对象) — 浏览器软件

1.问题:在A程序里 sesssion.setAttribute("name","hehe");   client1 访问了A程序
          问:之后哪些程序可以通过session.getAttribute("name") 获取hehe数据
          答:只要被client1请求的程序(不论功能),就可以得到hehe数据
2.原理:当client向server申请session对象时,tomcat会首先读取浏览器上的cookie,查找JSESSIONID的cookie
           a.没找到: tomcat会为client创建新的session,同时将session的id以cookie的形式写入浏览器
           b.找到:获取cookie里的session id,在内存中查找对应的session对象,返回给client使用
3.安全退出---关闭浏览器退出的区别
           a.安全退出:直接销毁client对应的session对象,并清除浏览器上的cookie
           b.关闭浏览器退出: 存储了sessionid的cookie被销毁,再次访问时,无法提供之前session的id,tomcat为client创建了新的session(原有session仍然存活30分钟)
            注意: 保存sessionid的cookie    JSESSIONID -- 3216进制数

Web阶段--Servlet基础知识点_第4张图片

4.url重写

1.如果浏览器拒绝接收cookie,则程序无法完成功能(一般不要求程序做出处理)
2.如果使用response.encodeURL() 来处理跳转路径,则可以在浏览器不支持cookie的情况下,让前后两个网页使用同一个session对象
3.方法功能: 检测浏览器是否支持cookie,支持(不做任何处理原样返回),不支持(将当前网页里的
      sessionid拼接到地址后面 url;jsessionid=3216进制数 )

Web阶段--Servlet基础知识点_第5张图片

十、ServletContext

1. 从文件的角度理解ServletContext对象

1.tomcat启动时,会去读取每一个web应用的配置文件web.xml,并将读到的内容封装成ServletContext对象保存在内存中, ServletContext对象就是web.xml文件在内存中的体现
2.一个web应用只有一个web.xml文件,只对应一个ServletContext
3) ServletConfig对象: tomcat在读取配置文件过程中,封装一段关于servlet的描述信息(servlet标签)
4) 使用场景

Web阶段--Servlet基础知识点_第6张图片

2. 从作用域的角度理解ServletContext对象

1.ServletContext对象是一个作用域,可以存放命名属性
	a.获取对象:ServletContext  context = session.getServletContext(); 

Web阶段--Servlet基础知识点_第7张图片

	b.存数据:context.setAttribute("name",value);
      取数据:context.getAttribute("name") --> Object value
      移除数据:context.removeAttribute("name"); 
2.servlet里的三大作用域

Web阶段--Servlet基础知识点_第8张图片

十一、过滤器 Filter

1. servlet冗余代码种类( 多次出现,通用基础功能与主要业务无关 )

① 设置request和response的编码方式

Web阶段--Servlet基础知识点_第9张图片

② 检查登陆标志的代码

Web阶段--Servlet基础知识点_第10张图片

 ③ 异常处理的代码
 	try{
      // 业务处理
	}catch(Exception e){
    	String str = e.getMessage();
   	 	String mess = java.net.URLEncoder.encode(str,"GBK");
    	response.sendRedirect("/Telbook/ErroView?mess="+mess);
}

2.冗余代码的解决方案

通过定义“过滤器”程序来解决servlet程序中出现的冗余代码

3. 特点:双向过滤

1.是一个web应用程序,主要对request和response进行预处理
2.过滤器会在请求到达servlet程序前执行代码,也会在response回到client之前运行代码
3.servlet里的冗余代码通常都定义在filter程序中

4.自定义过滤器程序

1.写程序 --- 实现指定的接口 Filter

Web阶段--Servlet基础知识点_第11张图片

2.写配置文件web.xml
	<filter>
        <filter-name>filter程序的简称filter-name>
        <filter-class>filter程序的全类名filter-class>
   filter>
   <filter-mapping>
        <filter-name>filter程序的简称,与上面的定义保持一致filter-name>
        <url-pattern> 需要被当前程序预处理的servlet的网名 /*所有请求url-pattern>
   filter-mapping>
3.部署到tomcat上

5. 过滤器执行先后顺序

当请求需要通过多个过滤器时,会按照配置文件中声明的先后顺序通过

6. 过滤请求的方向

1.filter默认只过滤来自于client端的请求,不考虑tomcat内部forward过来的
2.通过配置可以使得过滤器全方向过滤
	   <filter-mapping>
       		<filter-name>定义过滤源文件的名字filter-name>
			<url-pattern>被过滤的源文件名字url-pattern>
         	<dispatcher> REQUEST(默认值),FORWARD,INCLUDE dispatcher>
   		filter-mapping>
  注意:标签里的值必须大写,默认值只在不提供<dispatcher>标签时生效,如果提供了标签,按照定义方向进行过滤,全方向过滤需要通过三个<dispatcher>定义

7. 关于过滤器url-pattern的实战技巧

1.如果需要过滤少量的servlet请求 --- 通过定义多个url-pattern进行网名的罗列
2.如果需要过滤所有的client端请求 --- /* ( servlet  html  jsp  image  css )
3.如果需要过滤多数请求(不是全部)--- 通过为程序的网名添加前缀的方式解决

Web阶段--Servlet基础知识点_第12张图片

4.如果需要过滤全部servlet请求(强调 区别请求类型,不包括html和其他请求)--- 为网名添加后缀

Web阶段--Servlet基础知识点_第13张图片

十二、监听器Listener

1. 监听事件模型【重点】

1.组成:事件源(source)  事件对象(event)  监听器(listener)
2.关系:当事件源产生特定的事件对象时,会触发监听器代码的运行
3.监听器代码是由事件触发运行,不需要client请求

2. servlet里的监听器

1.生命周期监听器【重点】 ---- 监听三大作用域的创建和销毁
          ServletContextListener  --- 监听servletContext对象的创建和销毁
          HttpSessionListener --- 监听session对象创建和销毁
          ServletRequestListener --- 监听request对象的创建和销毁
2)命名属性监听器  ---- 监听命名属性的添加,移除和修改动作
          ServletContextAttributeListener  HttpSessionAttributeListener 
          ServletRequestAttributeListener

3. 自定义监听器

1.写程序 --- 实现指定接口
             所有event都有一个通用方法   getSource()(一般不建议用)
             ServletContext context = arg0.getServletContext();(建议用)
2.写配置文件
	<listener>
        	<listener-class> 全类名 </listener-class>
    </listener>

你可能感兴趣的:(前端)