servlet知识点

servlet基础
1、servlet:sun公司自己制定了一种用于扩展web服务器功能的组件规范。

1》扩展web服务器功能
web服务器(tomcat、Weblogic、iis、apache)没有处理动态资源请求的能力
(即该请求需要计算),只能处理静态资源的请求(如果浏览器请求某个html页面,
web服务器查看请求的html页面是否存在,存在则返回。)如果要让web服务器
处理动态资源的请求,则需要使用cgi程序、组件加容器的方式。

2》组件:可以单独部署的软件模块,组件必须要符合相应的规范。
优点是可以加快软件开发的速度,提高软件的可维护性。
容器:为组件提供运行环境,并且管理组件的生命周期。
组件并不完全依赖特定的容器,只要符合相应的规范就可以。


2、书写servlet
1》写一个java类(servlet、servlet只认识java文件)实现servlet
接口或者继承HttpServlet类。
2》编译(需要使用servlet-api.jar)
3》打包:打包成文件夹或war包
一个规范的文件目录具体结构:
appName ->
web-info->
class(字节码文件 )
lib(可选,jar文件,比如jdbc)
web.xml(部署描述文件)

4》部署
我们将打包好的war包文件放到web服务器上特定的目录下面。
5》启动web服务器,访问servlet
http://ip:port/appNames/servlet
https://ip:port/appNames/servlet

http://192.168.42.187:8080/testServlet/index.jsp 本地其他主机访问
http://localhost:8080/testServlet/index.jsp 自己访问
https://www.baidu.com/

3、tomcat简介
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,
在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序
的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,
可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat
部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上
作为一个与Apache 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和
Servlet。Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个
Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。Tomcat处理静态HTML的
能力不如Apache服务器。

4、servlet运行过程
在浏览器的地址栏输入:http://ip:port/appNames/servlet
1> 通过浏览器和ip:port和这个服务器建立连接。
2> 浏览器会生成一个请求数据包(路径appNames/servlet)向服务器发送请求。
3> 服务器收到请求数据包,分析请求资源路径做精准定位,通过请求的appName查找
webapps文件下面的appName做匹配,匹配上了需要获取web.xml中的servlet(mapping)。

4> 服务器创建两个对象:
第一个对象:请求对象,该对象实现了HttpServletRequest接口,服务器会将请求数
据包中的数据解析出来,存储在该对象里。这样做的好处是没有必要理解
http协议,只需要读取request。

第二个对象:响应对象,实现了HttpServletResponse接口,作用是servlet处理完成后
的结果可以存放到该对象上,然后服务器依据该对象的数据生成响应数据包。

5> servlet在执行servlet()方法时,可以通过request获取请求数据,也可以将处理结果
存放到response上。然后服务器与响应对象直接形成一个默契,生成一个响应数据包
给浏览器。

6> 浏览器解析服务器返回的响应数据包,生成响应的结果。


1、http协议
1》http协议:定义了浏览器与服务器之间通讯的过程以及数据格式。
2》通讯过程
1、浏览器请求web服务器建立一个连接。
2、浏览器向web服务器发送请求(会依据协议将请求数据打包)
3、服务器处理请求,并且将处理结果发送给浏览器(依据协议将处理结果打包)
4、服务器发送结果完毕后立即关闭连接。

3》数据格式

请求数据包->
第一部分:
请求行:请求方式(get/post)请求资源路径协议版本信息。
第二部分:
若干的消息头,是w3c定义的一些简单通讯规则,比如服务器可
以向浏览器发送一个“content-type”消息头告诉浏览器返回的数据类型以及编码。
第三部分:
实体内容:只有当请求方式是post时,请求参数及参数值才会
存放在这。如果请求方式为get时请求参数和参数值就会添加到请求资源的路径后面。

响应数据包->
第一部分:
状态行:协议版本、状态码、描述
常见的状态码:404 找不到,500 系统出错,200 正常
第二部分:
若个消息头
第三部分:
实体内容:存放处理结果


2、get请求和post请求
1>get请求:
1、在浏览器地址栏直接输入一个地址
2、点击链接地址
3、表单默认的提交
2>post请求:给表单的method属性设置为“post”
3>get方式和post方式的区别
1、get方式会将参数和参数值放到请求资源路径的后面,而post方式会
将这些数据放到实体内容里。
2、get方式提交的数据会显示在浏览器地址栏,这样不安全。post方式
相对安全,参数和参数值不会显示在地址栏,显示在实体内容里。
3、get方式提交的数据量是有限的(1K),而post方式理论上是没有限制的。

3、表单的处理
1>设置表单的提交方式为post
2>获取参数值
String request.getParameter(String paraName);
eg:
http://localhost:8080/test/login.do?username=haha&pwd=123
String username=request.getParameter("username");
如果参数名相同:
String[] request.getParameterValues(String para);
3>处理中文问题
1.在html代码里添加:
<meta http-equiv="content_type" content="text/html;charset=utf-8">
2.在服务器端设置编码时采用统一的编码格式,浏览器请求的时候编码格式
要与服务器一致。request.setCharacterEncoding("utf-8");

4、访问数据库
1》将数据库jdbc的驱动(.jar文件)放置到lib文件夹下
2》在servlet类中使用jdbc代码访问数据库需要注意:
1、注意关闭数据库连接
2、写一个错误处理页面
3、可以直接在web.xml文件中配置错误处理页面
<error-page>
<error-code>500</error-code>
<location>/err500.html</location>
</error-page>


1、重定向
1》定义:服务器向浏览器发送一个状态码302及一个消息头location,
浏览器在接收到以后立刻向location所指的地址发送请求。
2》代码:response.sendRedirect(String url);
3》重定向的特点
a>重定向之后浏览器地址栏的地址会发生改变,变成location所指向的地址。
b>重定义的地址是任意的。
4》注意:在重定义之前不要有任何输出。
主要指:
out.println();
out.flush();
out.close();
如果response中缓存有数据,该数据会被清空,然后做重定向。

2、在数据库中保存中文
1》设置数据库的编码(支持中文的)
2》给jdbc驱动添加一些参数,让jdbc驱动程序知道数据库的编码从而正确的解码。
eg:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8

3、servlet容器如何处理请求资源路径
eg:
地址栏输入:http://ip:port/appName/index.jsp,浏览器会将/appName/index.jsp
作为请求资源路径放到请求数据包里,发送给servlet容器。

servlet容器按照如下步骤处理请求资源路径:
1》比较web.xml中的<url-pattern>的配置与/index.jsp是否匹配。
a.精确匹配
b.模糊匹配(通配符“*”来匹配)
*表示任意字符串 url-pattern:/index/*
地址:/index/test/ ok
/index/test/test/ ok
/index/test/test ok
/index/ ok
/index ok
c.后缀匹配(不能够以"/"开头)
eg: *.do *.action '.'后是一个任意字符串
表示以这些字符串结尾的地址都匹配

2》如果找不到则认为这是一个jsp,然后再跳转到jsp页面查找,
找到就返回,找不到则提示404错误。

4、如何让一个servlet能够处理多个请求
1》在web.xml文件中,使用后缀匹配。
2》在service()方法里分析请求资源路径。


5、servlet核心与接口以及生命周期
1》servlet生命周期的含义:
指的是servlet容器如何从创建servlet实例、初始化(分配资源)。
调用service()方法、到最后销毁servlet实例的过程。

2》servlet生命周期的四个阶段
第一阶段:实例化
第一种情况:当请求到达容器时,容器会先检查该请求,
检查对应的servlet实例是否存在,如果存在不会重新创建,
如果不存在则重新创建(单例模式)。

第二种情况:当容器启动或者部署某个新的应用时,容器会
检查web.xml文件中的servlet有没有配置<load-on-startup>
如果配置了就会立刻创建实例。参数值越小优先级越高,创建
的机会越靠前。

第二阶段:初始化
给servlet实例分配资源,容器会调用servlet的初始化方法
init(ServletConfig config),创建一个符合ServletConfig
接口的对象给servlet实例。config对象就可以去访问servlet
的初始化参数。init()只执行一次。

第三阶段:就绪
容器收到请求,调用servlet实例的service()方法

第四阶段:销毁
容器依据自己的算法将不再需要的servlet实例进行销毁,在销毁
之前会调用servlet实例的destory()方法。destory()方法也只
执行一次。


1、dao:封装了数据访问逻辑。
1》dao接口
2》daoImp实现类
3》实体对象entity
4》工厂类Factory(创建实现类对象)
servlet通过dao获取结果的过程:
通过dao接口的回调获取对象(该对象是通过工厂相应的方法得到实现dao接口类的对象)
再调用该对象相应的方法获取到想要的结果。


1、servlet核心接口和类
1》servlet接口
init(ServletConfig config) //初始化servlet
destory() //销毁servlet
//http响应的方法是doGet/doPost
service(ServletRequest,ServletResponse)
doGet()
doPost()

2》GenericServlet抽象类
实现了servlet接口中的init(ServletConfig)和destroy()方法
子类可以选择override init()或者init(ServletConfig config)
优先选择override(覆盖的)

3》HttpServlet抽象类:
继承了GenericServlet实现了service()方法。
该service执行的流程:依据请求类型分别调用doGet和doPost方法,
doGet和doPost在默认情况下都是抛出异常的。所以写一个servlet
可以选择的方式有两种:
第一种:override doGet/soPost方法
第二种:override service方法

4》servletConfig接口
获取servlet初始化参数 String getInitParameter(String paraName)

5》ServletRequest/ServletResponse
这两个接口是HttpServletRequest/HttpServletResponse的父接口

6》HttpServletRequest/HttpServletResponse接口

其中只有void service(ServletRequest req,ServletResponse response)
方法是由tomcat自动调用,它将接收的客户端请求转交给HttpServlet中的另一个
protected void service(HttpServletRequest req,HttpServletResponse res)
方法,此保护类型的service方法再把将请求分发给doPost()、doGet()方法
进行下一步处理。
所以我们完全可以重写受保护的service()方法来代替doPost()和doGet()方法

2、jsp
1》定义:sun公司制定的一种服务器端动态页面生成的技术规范。因为直接使用
servlet生成动态页面过于繁琐( out.println("html代码") ),并且难以
维护(页面修改,java代码修改),因此产生了jsp。

2》jsp组成:主要有两块。
1.html内容(包括html、css、js等)
2.少量的java代码

3》书写jsp:直接编写一个以.jsp为后缀的文件,不需要编译。
1.如果是html内容,直接编写。
注释:<!--html浏览器任然执行代码--> <%--浏览器不执行代码--%>

2.如果是java代码,有两种方式书写:
第一种:java代码片段<% java代码 %>
第二种:jsp表达式<% =java表达式 %>

3.指令:所谓指令会在jsp引擎将jsp文件转换成java文件时做一些额外的处理。
eg、导包指令的语法:
<%指令 属性=属性值%>
page指令:
import属性:用于导包
eg:
<%@page import="java.util.*" %>

pageEncoding属性:告诉jsp引擎,jsp文件的编码格式。
eg:
<%@page pageEncoding="utf-8" %>

contentType属性;生成response.setContentType(...);
eg:
<%@page contentType="text/html;charset=utf-8" %>

4.隐含对象
在jsp文件中,不用声明就可以使用的对象
(因为jsp引擎会自动生成声明和创建这些对象的代码)
1.pageContext JSP的页面容器
2.request 得到用户的请求信息
3.response 服务器向客户端的响应信息
4.session 用来保存每一个用户的信息
5.application 表示所有用户的共享信息
6.config 服务器配置可以获取初始化参数
7.out 页面输出
8.page 从页面中表示出来的一个Servlet实例
9.exception JSP页面所发生的异常,在错误页中才起作用。

4》jsp的执行
当浏览器向服务器请求访问jsp文件时,服务器会先将jsp文件转换成java文件
(该转换的java文件实际上是一个servlet),接下来需要编译该servlet(自动编译),然后实例化
(web.xml)、初始化(init方法)、调用service方法(doGet或者doPost)。
可以看出:将jsp文件转换成java文件的模块叫做jsp引擎。

5》jsp文件如何转换成servlet
1.html-->service()方法里,使用out.write()输出(流的方式)。
2.java代码片段-->service方法里,直接照搬。
3.jsp表达式-->service方法里使用out.print()输出。


1、转发
1》定义:在同一应用内部,一个web组件将未完成的处理转发给另外一个web组件
继续处理,这样的过程叫做转发。
转发最常用的应用场景:servlet获取处理数据之后转发给jsp,由jsp生成响应页面。

2》代码
首先绑定数据:
//在request对象上以name为绑定名,绑定一个object
request.setAttribute(String name,Object object);

//依据绑定名获取绑定值,如果name对应的值不存在,返回null。
Object request.getAttribute(String name);

//解除绑定
request.removeAttribute(String name);

接下来转发:
//获取转发器,url指的是转发的目的地,一般是jsp。
RequestDispatcher rd=
request.getRequestDispatcher(String url);

//转发
rd.forward(request,response);

3》转发需要注意的问题
在转发之前不能有任何的输出,转发之前会先将response中缓存的数据先清空。

4》转发的特点
1.转发的目的地只能是同一个应用内部的各个组件之间
2.转发的各个组件之间可以共享request、response


2、include指令
<% @include file="header.jsp/foot.jsp" %>作用是告诉引擎在jsp文件转换为
java文件时,在当前指令所在的位置插入header.jsp/foot.jsp文件的内容。

3、路径问题
在使用链接、表单提交、重定向,转发时如何正确的使用相对路径和绝对路径。
1》相对路径:不以"/"开头的路径,相对当前项目。
eg:<a href="del.do"></a>
2》绝对路径:以"/"开头的路径
eg:<a href="/appName/del.do" ></a>
3》书写绝对路径
链接、表单提交、重定向的绝对路径是从应用名开始的,而转发的绝对路径是从
应用名之后开始。
写绝对路径的时候要尽量避免直接写应用名,而是通过request.getContentPath();

1、转发和重定向的区别
1》相同点:
本质上转发和重定向都是为了实现一个组件去调用另一个组件,也就是组件之间的跳转。
也可以这样认为:转发是通过容器作为媒介实现调用另一个组件,
重定向是通过浏览器作为媒介来实现这样的操作。

2》不同点:
1.浏览器地址栏的地址变化:
重定向:变化
转发:不变

2.目的地地址
重定向:任意
转发:同一个应用的内部

3.能否共享request对象
重定向:不能(因为重定向有两次请求,第一次请求产生的 request对象已经被销毁了)
转发:可以

4.事件是否已经做完
重定向:做完了
转发:未做完


2、状态管理
1》状态管理定义:因为浏览器与web服务器之间是通过http协议来发送请求和响应的,
而http协议是一个无状态协议(浏览器向服务器发送请求时,不会向服务器标示是哪个
浏览器在访问它,服务器发送完响应之后立刻关闭)。
在某些特定情况下需要将浏览器与服务器的多次交互操作看做是一个整体,
在管理这个整体的过程就是状态管理。
多次交互操作所涉及的数据叫做状态,而对这些数据进行管理就叫状态管理。

2》如何进行状态管理
1.cookie 在客户端记录用户状态
2.session 在服务器端记录用户状态

3》cookie
1.定义:
当浏览器访问服务器时服务器会将一些数据以set-cookie消息头
的方式发送给浏览器,浏览器会将这些数据存储到本地或者以
文件的形式保存在磁盘上,也可以保存在内存。当浏览器再次访
问服务器的时候会将这些数据以cookie消息头的方式再次发送给
服务器,通过这种方式就能对状态进行管理。

2.创建cookie
Cookie cookie =
new Cookie(String name,String value);
response.addCookie(cookie);

3.查询cookie
Cookie[] cookies= request.getCookies();
String cookieName= cookies[0].getName();
String cookieValue= cookies[1].getValue();

4.cookie保存中文问题
cookie的值只能够是ASSII字符,需要将中文转化为
assii字符的表现形式。

5.cookie的生存时间
cookie.setMaxAge(int seconds);
seconds>0:浏览器会将该数据保存在磁盘上,当超过
seconds指定的值时,浏览器会删除该数据。

seconds<0:浏览器会将该数据保存在本地内存中,浏览器
关闭,会删除此类型的值为默认缺省值。

seconds=0:立即删除cookie
Cookie cookie=
new Cookie("username","baobao");
cookie.setAge(0);
response.addCookie(cookie);

6.cookie的路径
cookie可以设置其访问路径,如果不设置会默认一个
访问路径(默认的访问路径是保存该cookie的路径)
浏览器在访问服务器的某个地址值时,需要比较该地址
与cookie的路径是否匹配,只有匹配的cookie才会被发送。
匹配规则:
要访问的地址必须是cookie的路径或者是其子路径。
cookie.setPath("/appName");
该cookie在访问/appName下的所有组件时都会发出。

cookie.setPath("/");
该cookie在访问同一个服务器上的所有部署应用时都会发送。

7.cookie的限制
1.cookie可以被禁止
2.cookie的大小有限制(4k)
3.cookie的数量也是有限制(指一个浏览器在本地最多存储大约300个左右)
4.cookie只能够保存字符串,并且需要对中文进行编码
5.cookie将数据保存在客户端,不安全。

4》session
1.浏览器访问服务器时服务器会创建一个对象(该对象HttpSession接口
一般称为session对象,每一个session对象都有一个唯一的标识sessionId)
服务器在默认情况下会使用cookie机制将sessionId发送给浏览器。
浏览器再次访问服务器时会将sessionId发送给服务器,服务器依据
sessionId找到之前的session对象。
2.获取session对象
方式一:
HttpSession session =
request.getSession(boolean flag);
当flag= true:
服务器检查浏览器发送的请求当中有没有sessionId
没有就创建session对象,如果有服务器会依据sessionId
去查找session对象。查找到了就不创建session对象,
如果找不到就创建session对象。
当flag=false:
服务器检查浏览器发送过来的请求当中有没有SessionId
如果没有不创建session对象并且返回null。
如果有服务器会依据当前的sessionId去查找session对象
是否存在,如果不存在不创建session对象并且返回null。

方式二:
HttpSession session=request.getSession();
request.getSession()是request.getSession(true)的简写

3.常用的方法。
//获取sessionId
String session.getId();
//
session.setAttribute(String name,Object obj);

session.removeAttribute(String name);

//如果name对应的对象不存在返回null
session.getAttribute(String name);

4.session的失效
//可以设置最大不活动时间间隔,超过这个时间间隔服务器
删除该session。
session.setMaxInactiveInterval(int seconds);
服务器有一个缺省的失效时间(tomcat是30分钟)超过这个时间
间隔也会删除session。
eg: tomcat
tomcat的web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>

WEB-INFO/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>

5.立即删除session
session.invalidate();

5》session案例
1.session验证
在用户登录成功之后在session对象里绑定一些数据(userId,放入少量数据)
session.setAttribute("userId","1");
当用户访问需要登录才能看到的资源时进行一下session校验
执行:
Object obj= session.getAttribute("userId");
对当前的用户判断是否登录,obj为null没有登录,
重定向到一个登录页面
obj不为null用户已经登录,放行。

 

过滤器
1》定义:servlet规范当中定义的一种特殊的类,其做用是拦截servlet容器的调用过程。

2》书写过滤器
1.写一个java类,实现Filter接口。
2.在doFilter方法里,实现拦截的逻辑。
3.配置(在web.xml中配置哪些请求地址做过滤条件)

3》过滤器的优先级
<filter-mapping>配置的先后决定了过滤执行的先后。

4》过滤器的优点
1.将一些组件相同或者相近的代码(权限管理、编码处理、安全、session验证
等)集中写到一个过滤器中方便代码维护。
2.实现代码的“可插拔性”

 

转载于:https://www.cnblogs.com/Hello-java/p/7522325.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值