Servlet学习
Servlet概念
1)狭义的Servlet是指Java死鱼眼实现的一个接口
2)广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者
3)Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器
Servlet特点:
1)运行在支持java的应用服务器上
2)Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的Servlet进行请求处理。
3)简单方便,可以移植性强
Servlet专业术语:
1)请求:客户端根据用户地址信息将数据发送给服务器的过程
2)响应:服务器将请求的处理结果发送给浏览器的过程
Servlet使用流程:
1)创建普通的java类并集成HttpServlet
2)覆写service方法
3)在service方法中书写逻辑代码即可
4)在webRoot下的WEB-INF文件夹下的web.xml文件中配置servlet(能找到servlet)
运行流程:
浏览器发送请求到服务器,服务器根据请求URL地址中的URL信息在webapps目录下对应的项目文件夹,然后在web.xml中检索对应的servlet,找到后调用并执行Servlet
Servlet生命周期:
1)第一次调用到服务器关闭
2)如果Servlet在web.xml中配置了load-on-startup,则生命周期为服务器开始到服务器结束
Service基本格式:(并不是每个service都需要这几步)
1)设置请求编码格式
2)设置响应编码格式
3)获取请求信息
4)处理请求信息
5)响应处理结果
Service方法和doGet方法和doPost方法的区别
1)Service方法:可以处理get/post方式的请求
2)doGet方法:处理get方式的请求
3)doPost方法:处理post方式的请求
4)如果有Service方法,会优先调用service方法
注意:如果在覆写的service方法中调用了父类的service方法(super.),则service方法处理完后,会再次根据请求方式响应的doGet和doPost方法执行,所以一般情况下不要在覆写的service中调用父类的service方法的,避免出现405错误(请求方式和servlet中的方法不匹配所造成的)。对不同的请求方法,可以在java里面进行逻辑判断
request对象:
1)作用:request对象中封存了当前请求的所有请求信息
2)注意:request对象由tomacat服务器创建,并作为实参传递给处理请求的servlet的service方法
request对象的使用
1)获取请求头数据
.getMethod(获取请求方式)
.getRequestURL(获取URL信息)
.getRequestURI(获取URI信息)
2)获取请求行数据
.getHeader(“键名”)(返回指定的请求头信息)
.getHeaderNames()(返回请求头的键名的枚举集合)
3)获取用户数据
.getParameter(“键名”)(返回指定的用户数据)
.getParameterValues(“键名”)(返回同键不同值的请求数据(多选))
.getParameterNames()(返回所有用户请求数据的枚举集合)
注意:如果要获取的请求数据不存在,不会报错,返回null
Response对象
作用:用来响应数据到浏览器的一个对象
使用
1)设置响应头
setHeader(String name,String value)//在响应头中添加响应信息,但是同键会覆盖
addHeader(String name,String value)//在响应头中添加响应信息,但是不会覆盖
2)设置响应编码格式
setHeader(“content-type”,“text/html;charset=utf-8”);
setContentType(“text/plain;charset=utf-8”)
setContentType(“text/xml;charset=utf-8”)
setContentType(“text/html;charset=utf-8”)
2)设置响应状态
sendError(int num,String msg)//自定义响应状态码
例如:sendError(404,“Not Found Resource”)
3)设置响应实体
getWrite().write(String str)/响应具体数据给浏览器
请求乱码问题解决:
1)使用String重新编码:uname = new String (uname.getBytes(“iso8859-1”),“utf-8”);
2)post方式:req.setCharacterEncoding(“utf-8”);
3)get方式:
步骤一:req.setCharacterEncoding(“utf-8”);
步骤二:在tomacat的目录下的conf目录中修改server.xml文件:在connector标签中增加属性useBodyEncodingForURI=“true”
请求转发:
作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
使用:req.getRequestDispatcher(“要转发的地址”).forward(req,resp);
地址:相对路径,直接诶书写servlet的别名即可
特点:一次请求,浏览器地址栏信息不变
注意:请求转发后直接return结束即可。
问题:在一个Servlet中修改数据后如何传入下一个Servlet
解决:使用request对象的作用域
使用:request.setAttribute(Object name,Object value);
request.getAttribute(Object obj);
作用:解决了一次请求内的不同Servlet的数据(请求数据+其他数据)共享问题
作用域:一次请求中的所有Servlet共享
注意:使用Request对象进行数据流转,数据只在一次请求内有效。
特点:1)服务器创建 2)每次请求都会创建 3)生命周期一次请求
重定向
问题:
1)如果当前的请求,Servlet无法进行处理怎么办?
2)如果使用请求转发,造成表单数据重复提交怎么办?
解决:重定向
使用:resp.sendRedirect(String uri);例子:resp.sendRedirect("/login/loigin")
特点:1)两次请求,两个request对象 2)浏览器地址栏信息改变
时机:
1)如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向
2)如果请求被Servlet接收后,无法进行处理,建议会用重定向定位到可以处理的Servlet
Cookie
作用:解决了发送的不用请求的数据共享问题
使用:
1)创建Cookie对象:Cookie c=new Cookie(String name,String value);
2)响应Cookie信息给客户端:resp.addCookie©
3)设置Cookie有效期:setMaxAge(int 秒);
4)设置有效路径:setPath(String uri)
5)获取Cookie信息
Cookie[] cks=req.getCookies();//获取Cookie信息数组
if(null!=cks!){
for(ookie ck:cks){
String name=c.getName();
String value=c.getValue();
System.out.println(name+value);
}
}
注意:一个Cookie对象存储一条数据。多条数据可以多创建几个Cookie对象进行存储
特点:
1)浏览器端的数据存储技术
2)存储的数据声明在服务器端
3)临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
4)定时存储:设置了Cookie的有效期,存储在了客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
Session:
问题:一个用户的不同请求处理的数据共享怎么办?
原理:用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSION ID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也就保证了不同请求能够获得到共享数据
特点:
1)存储在服务器端
2)服务器进行创建
3)依赖Cookie技术
4)session对象的有效期,一次会话
5)默认时效30分钟
作用:解决了一个用户不同请求处理的数据共享问题
使用:
1)创建session对象/获取session对象:
HttpSession hs=req.getSession();
如果请求中拥有session的标识符,也就是JSESSIONID,则返回其对应的session对象
如果请求中没有session的标识符,也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储到浏览器中
如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中
2)设置session对象存储时间:setMaxInactiveInterval(int seconds);
3)设置session对象强制失效:hs.invalidate();
4)存储和获取数据
存储:hs.setAttribute(String name,Object value)
获取:hs.getAttribute(String name)返回的类型为Object
使用时机:一般用户在登录web项目时会将用户的个人信息存储到Session中,供该用户的其他请求使用
作用域:一次会话,在JSESSIONID和session对象不失效的情况下为整个项目内。
session失效处理:将用户请求中的JSESSIONID和后台获取到的SESSION独享的JSESSIONID进行比对,如果一致则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。
注意:存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行
注意:在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时
注意:JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效
注意:session因为具有时效性,所以必须有的地方必须对他进行校验,不然会空指针
总结:session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的去情况下,用户的任意请求在处理时都能获得到同一session对象
ServletContext对象学习:(网站在线人数计数器)
问题:不同的用户使用相同的数据
特点:
1)服务器创建
2)用户共享
作用域:整个项目内
生命周期:服务器启动到服务器关闭
使用:
1)获取ServletContext对象三种方式
①ServletContext sc=this.getServletContext();
②ServletContext sc=this.getServletConfig().getServletContext();
③ServletContext sc=req.getSession().getServletContext();
2)使用ServletContext对象完成数据共享
①数据存储:sc.setAttribute(String name,Object value)
②数据获取:sc.getAttribute(“name”)返回的是Object类型
注意:
①不同的用户可以给ServletContext对象进行数据的存取。
②获取的数据不存在返回null
获取项目中web.xml文件中的全局配置数据
sc.getInitParameter(String name);根据键的名字不同返回web.xml中配置的全局数据的值,返回String类型。如果数据不存在返回null。
sc.getInitParameterNames();返回键名的枚举
配置方式:
name
张韦
注意:一组标签只能存储一组键值对,多组可以声明多个进行存储
作用:
①将静态数据和代码进行解耦(把关系淡化,后期只需更改xml内容)
②获取项目webroot下的资源的绝对路径
String path=sc.getRealPath("/doc/1.txt");参数为项目根目录
③获取项目根目录下资源的流对象
InputStream is = sc.getResourceAsStream("/doc/1.txt");
注意:此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取
35.ServletConfig对象(相当于独属Servlet的一个秘书)
问题:如何获取在web.xml中给每个servlet单独配置的数据呢?
使用:
①获取ServletConfig对象
②获取web.xml中的配置数据
总结servlet
service请求处理代码流程
设置响应编码格式
获取请求数据
处理请求数据
数据库的操作(MVC思想)(需要掌握)
响应处理结果
URL:http://localhost:8080/project/my
组成:
服务器地址:端口号/webapps下的文件夹的名称/要执行的url-pattern
服务器地址:端口号/虚拟项目名/servlet别名
URI:虚拟项目名/servlet的别名
HTTP学习
HTTP:规范浏览器和服务器的数据交互的格式,实现不同客户端(浏览器)和不同版本的 服务器之间的数据交互。
1)概念:超文本传输协议(Hyper Text Transfer Protocol)
2)作用:规范了浏览器和服务器的数据交互
3)特点:(键值对)
简单快速:客户端向服务器请求服务时,只需传送请求方法和路径。
方法通常有:GET、HEAD、POST,每种方法规定了客户与服务器的联系不同。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
无连接:一次连接处理一个请求(HTTP 1.1版本后支持可持续连接)
无状态:是指协议对于事务处理没有记忆能力。每次都是新的。
HTTP的交互流程:(一次完整的请求)
1)客户端和服务器建立连接
2)客户端发送请求数据到服务器端(HTTP协议)
3)服务器端收到请求后,进行处理,然后将处理结果响应客户端(HTTP协议)。
4)关闭客户端和服务器端的连接(HTTP1.1后不会立即关闭)
HTTP协议请求格式
1)请求头:请求方式、请求的地址和HTTP协议版本
2)请求行:消息报头,一般用来说明客户端要使用的一些附加信息
3)空行:位于请求行和请求数据之间,空行是必须的。
4)请求数据:非必须
HTTP请求方式:(没有规范传输多大的数据)
1)GET:请求数据拼接在URL后面,能够在请求头看到,不安全(如用户登录)(地址栏有大小,所以GET只能传少量数据)
2)POST:请求数据在请求实体中进行发送,在URL中看不到具体的请求数据,是安全的,适合数据量大的数据发送。
HTTP协议响应格式
1)响应行(状态行):HTTP版本、状态码、状态消息
2)响应头:消息报头,客户端使用的附加信息
3)空行:响应头和响应实体之间的,必须的
4)响应实体:正文,服务器返回给浏览器的信息
服务器
服务器:其实就是代码编写的一个可以根据用户请求实时的调用执行对应的逻辑代码的一个容器。
服务器在启动时加载Web.xml
关于web.xml和service.xml的配置(…)
JSP(Java Server Pages/java服务器页面)
问题:在Servlet进行页面的展现时,代码书写太过麻烦,用html又太死板,不能像java代码一样进行逻辑判断
概念:JSP根本是一个简化的Servlet设计,它是由SunMicrosystems公司倡导、许多公司参与一起建立的一种动态网页技术标准
特点:
1)本质上还是Servlet
2)跨平台,一次编写处处运行
3)组件跨平台
4)健壮性和安全性
5)tomcat永远接触不了第一手jsp,接触到的是转义成servlet的对象。
Jsp的三种注释
1)前端语言注释:会被转译,也会被发送,但是不会被浏览器执行
2)java语言注释:会被转译,但是不会被servlet执行
3)Jsp注释:不会被转译 <%-- --%>
Jsp的page指令学习:
<%@page 属性名=“属性值” 属性名=“属性值”…%>
language:声明jsp要被转译的语言。
import:声明转译的java文件要导入的包,不同的包使用逗号隔开
pageEncoding:设置jsp文件的数据编码格式。
contentTyp=“text/html;charset=utf-8” 设置jsp数据响应给浏览器时,浏览器的解析和编码格式。
session;设置转译的servlet中是否开启session支持,默认是开启,true表示开启,false表示关闭
errorPage=“xx.jsp”:设置jsp运行错误跳转的页面。
extends:设置jsp转译的java文件要继承的父类(包名+类名)。
作用:配置jsp文件的转译相关的参数。
Jsp的局部代码块:
特点:
1)局部代码块中声明的java代码会被原样转译到jsp对应的servlet文件的_JspService方法中
2)代码中声明的变量都是局部变量。
使用:<% java代码 %>
缺点:使用局部代码块在jsp中进行逻辑判断,书写麻烦,阅读困难。
开发:servlet进行请求逻辑处理,使用jsp进行页面展现
Jsp的全局代码块
特点:声明的java代码作为全局代码转译到对应的servlet类中
使用:<%! java代码 %>
注意:全局代码块声明的代码,需要使用局部代码块调用
Jsp的脚本段语句:
特点:帮助我们快速的获取变量或者方法的返回值作为数据响应给浏览器。
使用:<%=变量名或者方法名%>
注意:不要在变量名或者方法名后使用分号
Jsp的静态引入和动态引入:
1)静态引入:
①<%@include file=“要引入的jsp文件的相对路径”%>
②特点:会将引入的jsp文件和当前jsp文件转移成一个java文件使用,在网页中也就显示除了合并后的显示效果
③静态引入的jsp文件不会单独转译陈java(Servlet)文件。
2)动态引入:
①<jsp:include page=“要引入的jsp文件的相对路径”></jsp:include>
②特点:会将引入的jsp文件单独转译,在当前文件转译好的java文件中调用引入的jsp文件的转译文件。在网页中显示合并后的效果。
③注意:动态引入允许文件中声明重名变量。
④优点:降低jsp代码冗余,便于维护升级。
Jsp的转发标签forword:
①使用:<jsp:forword page=“要转发的jsp文件的相对路径”></jsp:forword>
②特点:一次请求,地址栏信息不变
③注意:在转发标签的两个标签中间除了写<jsp:param name=“str” value=“aaa” />子标签不会报错,其他任意字符都会报错。
<jsp:param name=“str” value=“aaa” />(name属性为附带的数据的键名,value为附带的数据内容)注意:数据会以?的形式拼接在转发路径后面。
Jsp的九大内置对象:
内置对象:
jsp文件在转译成其对应的Servlet文件的时候自动生成的并声明的对象。我们在jsp页面中直接使用即可。
注意:内置对象在jsp页面中使用,使用局部代码块或者脚本段语句来使用。不能够在全局代码块中使用。
内容:
①pageContext:页面上下文对象,封存了其它内置对象。(所有信息)
注意:每个jsp文件单独拥有一个pageContext对象。
作用域:当前页面
②request:封存当前请求数据的对象。由tomcat服务器创建。
③session:此对象用来存储用户不同请求的共享数据。一次会话
④application:也就是ServletContext对象,一个项目只有一个。存储用户共享数据的对象,一起完成其他操作。项目内。
⑤response:响应对象,用来响应请求处理结果给浏览器的对象。设置响应头,重定向
⑥out:响应对象,jsp内部使用。带有缓冲区的响应对象,效率高于response对象
⑦page:代表当前jsp的对象。相当于java中的this
⑧exception:异常对象。存储了当前运行的异常信息。
注意:使用此对象需要在page指定中使用属性isErrorPage=“true"开启
⑨config:也就是ServletConfig,主要是用来获取web.xml中的配置数据,完成一些初始化数据的读取。
四个作用域对象:
1)pageContext:当前页面。解决了在当前页面内的数据共享问题。获取其他内置对象。
2)request:一次请求。一次请求的servlet的数据共享。通过请求转发,将数据流转给下一个servlet。
3)session:一次会话。一个用户的不同请求的数据共享。将数据流转给其他请求。
4)application:项目内。不同用户的数据共享问题。将数据从一个用户流转给其他用户。
作用:数据流转。
Jsp的路径:
相对路径:
在jsp中资源路径可以使用相对路径完成跳转,但是
1)资源的位置不可以任意更改
2)需要使用…/进行文件夹的跳出。使用比较麻烦
使用绝对路径:(常用)
/虚拟项目名/项目资源路径
例如:jspPro.jsp
注意:在jsp中资源的第一个/表示的是服务器的根目录,相当于:localhost:8080
使用jsp中自带的全局路径声明:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+”😕/"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>