一,Http协议
1.web交互基本流程
b/s b请求,s响应,b通过url请求
不同浏览器的请求是不同的,规范不同浏览器和服务器交互格式:HTTP协议
2.HTTP协议
超文本传输协议
特点:
简单快速:客户端向服务器请求服务时,只需传送请求方法和路径
请求方法常用的get,head,post
灵活:允许传输任意类型的数据对象,http用contentType来识别类型
无连接: 限制每次连接只处理一个请求
无状态:对于事务处理没有记忆能力。
Http1.1版本后支持可持续连接
3.http的交互流程
a.bs建立建立.
b.b发送请求数据到s.
c.s收到请求处理
将处理结果响应b.
d.关闭bs连接(1.1后不会立即关闭)
4.Http协议请求格式:
请求格式结构:
请求头,请求行,空行,请求数据
5.http协议响应格式:
响应格式结构:
响应行(包括状态码,等),响应头,空行,响应实体
状态码:
200 0K //请求成功
400 Bad Request //请求有语法错误,不被服务器理解
404 Not Found //请求资源不存在
500 Internal Server Error //服务器发生错误
503 Server Unavailable //暂时不能处理客户端请求
二,服务器(tomcat)
服务器其实就是代码编写的一个可以根据用户请求的实时数据的调用执行对应
逻辑代码的一个容器。
真正运行代码时tomcat中部署好的代码,而不是开发工具中的代码
三,Servlet
解决:
服务器在接受到浏览器请求后,自动调用对应代码进行请求处理,
如果开发人员按照服务器能够识别的规则进行编写,浏览器按照指定规则
发送请求,那么服务器就可以调用并执行代码了
servlet是指
任何实现这个servlet接口的类,大多数情况下servlet只用来扩展基于
Http协议的web服务器
特点:
运行在支持java的应用的服务器上
servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求
调用对应的servlet进行请求处理
简单方便,可移植性强
运行流程:
b发送请求数据到s,s根据url地址中的信息在tomcat/webapps目录下找到对应项目文件夹,
然后在web.xml中检索对应servlet并执行。
使用:
1.创建普通的java类并继承HttpServlet类
2.覆写service方法
3.在webroot/web-inf/web.xml中配置servlet
service和doGet和dopost方法区别:
service可以处理post和get请求,优先执行
doget只能处理get请求
dopost只能处理post请求
servlet生命周期:
1.从第一次调用到服务器关闭
2.如果servlet在web.xml中配置了load-on-startup,生命周期为从服务器启动到服务器关闭
注意:
init方法会在servlet第一次加载进存储时执行
destory方法实在servlet销毁时执行,也就是服务器关闭时
service请求处理代码流程:
1.设置响应编码格式
2.获取请求数据---request
3.处理请求数据---java代码,数据库操作(mvc思想)
4.响应处理请求---response
servlet中常见错误:
404:资源未找到
原因一:在请求地址中的servlet资源未找到
原因二:虚拟项目名称拼写错误
500:
错误一:
java.lang.ClassNotFoundException
解决:
在web.xml中校验servlet类的全限定路径是否拼写错误
错误二:
因为servlet方法体中的代码块执行错误导致
解决:根据错误提示对service方法代码进行更改
405:请求方式不支持
请求方式和servlet中的方法不匹配造成
解决:尽量使用service方法进行请求处理,并且不要在该方法中调用父类的service方法
Request对象:
servlet请求处理:
使用对象存储,服务器每接受一个请求,就会创建一个Request对象专门存储此次请求的请求数据
服务器在调用servlet时会将创建的request对象作为实参传递给servlet的方法,如service方法,
由tomcat服务器创建
使用:
1.获取请求头数据
1.1获取请求方式:String method=request.getMethod();
1.2获取请求url:StringBuffer url=request.getRequestURL();//完整路径
获取uri:String uri=request.getRequestURI();//获取项目名/servlet类别名
1.3获取请求协议:Sting h=request.getScheme();
2.获取请求行数据
//获取指定的请求行数据
String value=request.getHeader("");
//获取所有的请求行的键的枚举
Enumeration e=request.getHeaderNames();
while(e.hasMoreElements()){
String name=(String)e.nextElement();
String value2=request.getHeader(name);
System.out.printlf(name+":"+value2);
}
3.获取用户数据
//getParameter:可以获取同键不同值的单一值
String name=request.getParameter("标签name");
//getParameterValues:可以获取同键不同值的所有值,返回数组
Sting[] favs=request.getParameterValues("标签name");
//获取所有的用户请求数据的键的枚举集合---request.getParameterNames();
注意:如果要获取的请求数据不存在,不会报错,返回null
Response对象
服务器在调用指定的Servlet进行请求处理的时候,会给servlet的方法传递两个实参request和response,
其中request封装了请求相关的数据,而response则是用来进行响应的一个对象
使用:
//设置响应头
resp.setHeader(String name,String value);//在响应头中添加响应信息,但是同键覆盖
resp.addHeader(String name,String value);//在响应头中添加响应信息,但是同键不覆盖
//添加响应编码
resp.addHeader("content-type","text/html;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");
//设置自定义响应状态码
resp.sendError(int num,String msg);
//设置响应实体
resp.getWriter().write("输入中文需要设置编码格式");//响应具体的数据给浏览器
serlvet流程总结:
b发送请求数据到s,s接受b请求,创建一个Request对象专门存储此次请求的请求数据
s根据url地址中的信息在tomcat/webapps目录下找到对应项目文件夹,然后在web.xml
中检索对应servlet进行请求处理,并将创建的request对象作为实参传递给servlet的方法(如service方法)
servlet方法执行的请求处理
//设置请求编码格式
//设置响应编码格式
//获取请求信息
//处理请求信息(controller调用service层,service调用dao,其中用到的参数是用实体层进行传递)
//调用业务层对象
//调用业务层对象的方法
//响应处理结果
使用请求转发:
请求转发后直接return结束。
作用:
实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet职责更加明确
req.getRequestDispatcher("要转发地址").forward(req,resp);
地址:相对路径,书写servlet别名即可
使用请求转发后,数据如何从一个servlet流转给另外一个servlet?
解决:使用request对象的作用域
使用:request.setAttribute(Object name,Object value);
request.getAttribute(Object obj);
作用:
解决了一次请求内不同servlet的数据(请求数据+其他数据)共享问题
作用域:
基于请求转发,一次请求中的所有servlet共享。
注意:
使用request对象进行数流转,数据只在一次请求内有效
特点:
服务器创建,每次请求都会创建,生命周期一次请求
Servlet中getAttribute()和getParameter()的区别
1.有setAttribute()方法,没有setParameter()方法。
2.getAttribute()返回的是Object类型,getParameter()返回的是String类型。
3.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据;setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。即request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。
重定向
避免表单重复提交,使用重定向
当前请求servlet无法处理,建议使用重定向定位到可以处理的资源
使用:
response.sendRedirect("路径");
本地路径为:uri
网络路径为:
定向资源url信息
特点:
两次请求,两个request对象
浏览器地址栏信息改变
cookie:
作用:
解决了发送不同请求的请求数据共享问题
使用:
cookie的创建和存储:
//创建cookie对象
Cookie c=new Cookie(String name,String value);
//设置Cookie(可选)
//设置有效期
c.setMaxAge(int s);//秒为单位
//设置有效路径
c.setPath(String uri);
//响应cookie信息给客户端
resp.addCookie(c);
cookie的获取:
//获取cookie信息数组
//遍历
注意:一个Cookie对象只存储一条数据,多条数据可以多创建几个对象存储
特点:
浏览器端的存储技术,存储的数据声明在服务器端
临时存储:存储在浏览器运行内存中,浏览器关闭失效
定时存储:设置cookie的有效期,存在客户端的硬盘中,在有效期内符合路径要求
的请求都会附带该信息
默认cookie信息存储好后,每次请求都会附带,除非设置有效路径
Session:
作用:
解决一个用户不同请求的处理需要使用相同的数据,
在JESSIONID不失效和session对象不生效的情况下,用户的任意请求在处理
时都能获取到同一个session对象
原理:
用户第一次访问服务器,服务器会创建一个session对象给此用户,并将session对象的
JSESSIONID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,
也保证不同请求能够获取到共享的数据。
特点:
存在服务器端,服务器进行创建,依赖cookie技术,一次会话,默认存储30min
使用:
创建/获取session对象
HttpSession hs=req.getSession();//有sesion返回已有的session,没有创建session
如果请求中有session的标识符也就是JSESSIONID,则返回其对应的session队形
如果请求中没有session的标识符也就是JSESSIONID,则创建新session对象,并将其JSESSIONID
作为从cookie数据存储到浏览器内存中
如果session对象失效了,也会重新创建一个session对象,并将其JESSIONID存储在内存浏览器中
设置session存储时间
hs.setMaxInactiveInterval(int seconds);
注意:在指定的时间内session对象没有被重新使用则销毁,如果使用则重新计时。
设置session强制失效
hs.invalidate();
存储和获取数据
存储:hs.setAttribute(String name,Object obj);
获取:hs.getAttribute(String name);
注意:存储动作和取出动作可以发生在不同的请求中,但是存储要先于取出执行
session失效处理:
将用户请求中JESSIONID与后台获取到的session对象的JESSIONID进行对比,如果一致则没有失效,
如果不一致就证明失效了。重定向到登录页面,让用户重新登录。
注意:JESSIONID存储在cookie临时存储空间中,浏览器关闭即失效。
ServletContext对象:
解决不同用户请求的数据共享问问题
特点: 服务器创建,用户共享
生命周期: 服务器启动到服务器关闭
使用:
获取ServletContext对象
方式一:ServletContext sc=this.getServletContext();
方式二:ServletContext sc2=this.getServletConfig().getServletContext();
方式三:ServletContext sc3=req.getSession().getServletContext();
三种方式获取相同的对象
使用Servetcontext对象完成数据共享
数据存储
sc.setAttribute(String name,Object value);
数据获取
sc.getAttribute(String name);//返回obj类型
注意:不同的用户可以给servletcontext对象进行数据的存取
获取的数据不存在返回null
获取项目中web.xml文件中的全局配置数据
sc.getInitParameter(String name):
根据键的名字返回web.xml中配置的全局数据的值,返回String类型。若数据不存在返回null
sc.getInitParameterNames(String name):
返回键名的枚举
在web.xml中配置方式:一组context-param中只能存储一组键值对数据
<context-param>
<context-name>name</context-name>
<context-value>zhangsan</context-value>
</context-param>
作用:
将静态数据和代码进行解耦
获取项目webroot下的资源的绝对路径
String path=sc.getRealPath(String path);
获取的路径为项目的根目录,path参数为项目根目录中路径
获取项目webroot下的资源流对象
InputStream is=sc.getResourceAsStream(String path);
注意:此中方式只能获取项目根目录下的资源流对象,class文件流对象
需要使用类加载器获取,path参数为项目根目录中路径。
ServletConfig对象:
使用ServletContext对象可以获取web.xml中全局配置文件,在web.xml
每个servlet也可以进行单独配置,使用servletconfig获取配置信息
作用:
servletconfig对象是servlet的专属配置对象,每个servlet都单独拥有一个
servletconfig对象,用来获取web.xml中的配置信息
使用: 获取ServletConfig对象
ServletConfig sc=this.getServletConfig();
获取web.xml中的servlet的配置信息
String Code=sc.getInitParameter("");
过滤器:
作用:对服务器资源进行管理,保护servlet
使用:创建一个实现Filter接口的普通java类
覆写接口的方法:
init方法
doFilter方法
destory方法
在web.xml中配置过滤器
过滤器的生命周期:
服务器启动到服务器关闭。
执行:浏览器发送请求到服务器,服务器接受请求后,根据uri信息在web.xml中找到对应的
过滤器执行doFilter方法,该方法对此次请求进行处理后如果符合要求则放行(放行后如果
还有符合要求的过滤则继续进行过滤),找到执行对应的servlet进行请求处理,servlet方法
对请求处理完毕后,也就servlet方法结束了,还需要继续返回响应的doFilter方法继续执行。
监听器:
作用:
监听作用域对象request,session,application创建,销毁和内容改变
使用:
创建一个实现指定接口的java类
监听request--->ServletRequestListener 监听request对象创建和销毁
requestInitalized(ServletRequestEvent sre) 创建
requestDestoryed(ServletRequestEvent sre) 销毁
注意:
形参可以获取被监听的request对象
sre.getServletRequest();
监听request--->ServletRequestAttributeListener 监听request作用域数据的变更
attributeAdded(ServletRequestAttributeEvent srae)
attributeRemoved(ServletRequestAttributeEvent srae)
attributeReplaced(ServletRequestAttributeEvent srae)
注意:
形参可以获取被监听的数据
srae.getName() 获取监听数据的键
srae.getValue() 获取监听数据的值
监听session--->HttpSessionListener 监听session对象创建销毁
sessionCreated(HttpSessionEvent se):
sessionDestroyed(HttpSessionEvent se):
注意:
形参可以获取被监听的session对象
se.getSession();
监听session--->HttpSessionAttributeListener 监听session数据的变更
attributeAdded(HttpSessionBindingEvent event)
attributeRemoved(HttpSessionBindingEvent event)
attributeReplaced(HttpSessionBindingEvent event)
注意:
形参可以获取被监听的数据
event.getName() 获取监听数据的键
event.getValue() 获取监听数据的值
监听application--->ServletContextListener 监听application对象创建销毁
contextInitialized(ServletContextEvent sce)
contextDestroyed(ServletContextEvent sce)
注意:
形参可以获取被监听的application对象
se.getServletContext();
监听application--->ServletContextAttributeListener 监听数据变更
attributeAdded(ServletContextAttributeEvent event)
attributereplaced(ServletContextAttributeEvent event)
attributeremoved(ServletContextAttributeEvent event)
注意:
形参可以获取被监听的数据
event.getName() 获取监听数据的键
event.getValue() 获取监听数据的值
在web.xml中配置监听器类
Web.xml文件总结:
作用:
存储项目相关的配置信息,保护servlet,解耦一些数据对程序的依赖。
使用位置:每个Web项目中
Tomcat服务器中(在服务器目录的conf目录中)
区别:web项目下的web.xml文件为局部配置文件,针对本项目的位置。
Tomcat下的web.xml文件为全局配置文件,配置公共信息。
内容(核心组件):
全局上下文配置(全局配置参数)
servlet配置
过滤器配置
监听器配置
加载顺序:web容器会按servletContext>context-param>listener>filter>servlet这个顺序加载组件,
这些元素可以配置在web.xml文件中的任意位置。
jsp访问原理:
浏览器发起请求,请求jsp,请求被tomcat服务器接收,执行jspServlet将请求的jsp文件转义成为对应
的java文件(也是servlet),然后执行转义好的java文件。
jsp三种注释:
前端语言注释:会被转义,也会被发送,但是不会被浏览器执行
java语言注释:会被转义,但是不会被servlet执行
jsp注释:不会被转义
jsp的局部代码块:
特点:局部代码块中声明java代码会被原样转译到jsp对应的servlet文件的_jspService方法中
代码块中声明的变量都是局部变量。
使用:<% java代码 %>
jsp全局代码块:
特点:声明Java代码作为全局代码转译到对应的servlet类中。
使用:<%! 全局代码 %>
注意:全局代码块声明的代码,需要使用局部代码块调用
jsp的脚本段语句:
特点:帮助我们快速的获取变量或者方法的返回值作为数据响应给浏览器
使用:<%=变量或者方法%>
注意:不要在变量名或者方法后使用分号。
jsp的静态引入和动态引入:
优点:降低jsp代码冗余,便于维护升级
静态引入:
<%@include file="要引入jsp文件相对路径" %>
特点:会将引入的jsp文件和当前的jsp文件转译成一个Java(Servlet)文件使用。
在网页中也就显示了合并后的显示效果。
注意:静态引入的文件不会单独转译成java文件
当前文件和静态引入的jsp文件中不能够使用java代码块声明同名变量。
动态引入:
<jsp:include page="要引入的jsp文件的相对路径"></jsp:include>
特点:
会将引入的jsp文件单独转译,在当前文件转译好的java文件中调用引入的jsp文件转译的文件
在网页中显示合并后的显示效果
注意:
动态引入允许文件中声明同名变量