Servlet简介:
是一种web服务器端编程技术,是实现特殊的接口,由支持Servlet负责对应的web服务器调用
和启动运行,一个servlet负责对应的一个或一组url的访问请求,并返回相应的内容。
IDEA对tomcat的webapps目录做了优化,路径名有一个虚拟项目名称
* url:http://localhost:8080/firstweb/first
解析:服务器地址:端口/虚拟项目名/servlet的别名
uri:虚拟项目名/servlet别名
过程:浏览器发送请求到服务器,服务器根据请求url地址中的uri信息在webapps目录下找到对应的
项目文件名,然后在web.xml中检索对应的servlet,找到后调用并执行servlet
*
* Servlet生命周期:
在收到请求时根据uri找到对应的项目,再根据web.xml的映射关系servlet利用反射创建对象
然后调用init(),响应请求,关闭tomcat时对象销毁
*
*
* MVC:model view controller
发展历程:
1.单一应用架构
2.垂直应用架构
3.分布式服务架构
4.流式...架构
5.云计算架构
*
* Controller层和Service层的区别是:Controller层负责具体的业务模块流程的控制;Service层
负责业务模块的逻辑应用设计;
总结:在具体的项目中,其流程为:Controller层调用Service层的方法,Service层调用Dao层中的方法,
其中调用的参数是使用Entity层进行传递的。总的来说这样每层做什么的分类只是为了使业务逻辑更加清
晰,写代码更加方便,所以有时候也需要根据具体情况来,但是大体的都是这样处理的,因为它其实就是
提供一种规则,让你把相同类型的代码放在一起,这样就形成了层次,从而达到分层解耦、复用、便于测
试和维护的目的。
* 连接数据库Access denying可能因为服务被其他使用
*
Servlet的流程处理:
1.设置请求编码格式
2.设置响应编码格式
3.接收请求段的参数
4.进行逻辑代码处理
5.返回响应结果
*
* 处理乱码问题
1.get请求
1.获取字符后使用new String(name.getBytes("iso-8859-1"),"utf-8");
2.设置request的编码格式1.request.setCharacterEncoding("utf-8");
同时在配置文件中添加useBodyEncodingForURI=true的属性
3.在server.xml中添加URIEncoding="utf-8"
2.post请求
1.request.setCharacterEncoding("utf-8");
3.response响应
1.response.setCharacterEncoding("gbk");依据客户端
*
* 请求分发和重定向的区别:
Servlet重定向,浏览器发送两次请求,浏览器地址发生变化,请求过程中需要两队请求响应对象
两个servlet不能共享请求
请求转发请求1次,地址栏不变数据共享,跳转限制在本站资源,发生在服务端
重定向发请求2次,地址栏变化数据不共享,跳转任意url资源,发生在客户端
*
* 对于重定向后数据就不再共享了,那么数据的共享如何实现呢?引入cookie和session,因为HTTP协议
是一个无状态的协议,当服务端响应之后连接就会关闭,在服务器端就不再保留连接信息。
那么客户端多次请求且需要相同参数时,应该怎么处理?
cookie:保存在客户端,临时cookie保存在内存中,浏览器关闭cookie消失。持久化cookie保存在
浏览器的某个目录
* session:表示会话,在一段时间里,用户与服务器之间的交互操作,session对象是用户在发送
不同请求参数,在服务器端保存不同请求共享数据的存储对象
session特点:依赖cookie技术的服务端数据存储计数,由服务端创建,每个用户都有独立的session
对象,默认存储时间30min,每次关闭浏览器都会重新请求开启一个新的sessionId,因为返回的JsessionId
保存在浏览器的内存中,是临时的cookie所以关闭自动消失
session可保证用户多个请求的数据共享
cookie解决请求时含有相同值
那么不同用户的数据共享?
使用ServletContext:解释:运行在JVM上的每一个web应用程序都有一个与之对应的Servlet上下文
即servlet运行环境,ServletContext对象被web应用程序中的所有servlet访问。ServletContext对象
是web服务器中一个一直路径的根
ServletContext:解决不同用户数据共享问题
特点:
1.由服务器创建
2.所有用户共享一个ServletContext对象
3.所有servlet可以访问同一个ServletContext中的属性
4.每一个web项目对应一个ServletContext
web.xml中可配置ServletContext共有属性使用context-param标签
*
* ServletConfig对象是Servlet的专属对象,每个Servlet都有一个,是用来获取web.xml
中的Servlet独有的配置信息
*
* 直接请求1.jsp页面是tomcat收到请求,jsp引擎根据1.jsp生成的java类执行对应的class文件
将执行的结果输送给tomcat,tomcat发送给客户端
* 【JSP】
* page标签
import导包
pageEncoding设置页面编码格式,但是已经设置了contentType就不需要设置pageEncoding了
但必须保持一致
errorPage页面发生逻辑错误要跳转的页面
extends设置转译后的servlet继承的父类,格式-包名+类名
局部代码块定义的代码在service方法中
全局代码块用来定义公用的方法,方法的调用要使用局部代码块
堆属性和方法调用使用<%=%>这种格式,注意:不能在方法或者变量后添加;
include标签
静态导入<%@ include file = "相对路径"%>不会讲静态导入的文件生成新的字节码文件,
不利于维护(如重复变量名)
动态导入<jsp:include page="相对路径路径"></jsp:include>生成新的字节码文件
解耦,显示时合并显示
请求转发<jsp:forward page="forward.jsp"></jsp:forward>
jsp九大内置对象:
request封装当前的请求数据,由tomcat创建,一次请求对以一个request对象
response响应对象,可用于重定向
session封装一个用户的不同请求的共享数据,一次会话对应一个session
application等同ServletContext一个web项目只有一个,存储所有用户共享数据
page代表jsp对象,跟java中的this指针类似
pageContext页面上下文(每个页面对应一个),封装其他的内置对象以及当前页面的
运行信息,伴随页面结束而结束
config相当于ServletConfig对象,获取web.xml中的数据完成servlet初始化工作
exception使用时必须在page指令添加属性isErrorPage=true
out响应对象jsp内部使用的带有缓冲区的响应对象
jsp四大作用域:
pageContext解决当前页面的数据共享
request一次请求的servlet数据共享,通过请求转发将数据流转到下一个servlet
session一次会话,用户发送不同请求之间数据共享,数据可流转到其他请求
application表示在项目内不同用户的数据共享,用户之间的数据流转
路径问题
* 相对路径
绝对路径>使用jsp的全局路径声明
<%
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort()
+ request.getContextPath() + "/";
%>
<base href="<%=basePath%>">
* -----------------------------EL------------------------------------------
* 为了解决servlet和jsp作用域数据的交换引入EL表达式,在jsp中获取对象或者集合中
元素的属性特别麻烦,所以使用EL表达式(获取作用域中的属性),使用的时候使用作用域中的key
用.引用属性,[]指定索引
示例如下
* 姓名:${param.name} 这是request里的参数获取方式
密码:${param.pwd}
姓名:${name}
住址:${home}
姓名:${azir.name}
住址:${azir.address}
姓名:${list[1].name}
住址:${list[1].address}
姓名:${hero.zed}
住址:${hero.asso}
*
* pageContext-->request-->session-->application
如果四个作用域中都有同样键的时候取值按照从小到大顺序
那么非要指定一个取值的域呢?
* pageContext:${pageScope.name}<br>
request:${requestScope.name}<br>
session:${sessionScope.name}<br>
application:${applicationScope.name}<hr>
*
* EL表达式运算:算术运算符、关系运算符、逻辑运算
+-*/%运算
boolean运算
注意:对于+运算不会做字符串拼接,只会对数字类型+操作,与字符串+运算会报错
*
* EL表达式获取cookie和请求头信息:
${cookie.JSESSIONID.name}<br>
${cookie.JSESSIONID.value}<br>
【EL表达式获取共享作用域的数据】对于EL表达式进行逻辑判断?当然可以使用jsp标签
书写,但是导致书写不便,难于维护,引入JSTL,是apache对EL的扩展
* 我想说几句:jstl的导包让我火冒三丈,一直出现不能解析路径
http://java.sun.com/jsp/jstl/core报500错误,有人说是tomcat的servlet和jsp
版本与jstl不吻合导致,然后我换tomcat版本试不同版本的jstl和依赖包standard包还是不行
最后我换回tomcat8之后使用jstl1.2和taglibs-standard-jstlel-1.2.5.jar才好,折腾
了5个小时,真让人头大,尝试了很多次,最后想放弃了报着试最后一次的想法,结果他妈的
居然好了,你说气人不!还有IDEA不需要在Schemas and DTDs中配置uri路径。
*
* URL统一资源定位符由协议ip+port+路径组成,它是URI的子集,可以理解为用某个协议,访问某个
服务器上的资源。只要能唯一标识一个资源就可以认为是URI
*
* 过滤器:能够对web请求和web响应的头属性和内容体进行操作的一种特殊web组件,过滤器的特殊之处
在于本身并不直接生成web响应而是拦截web请求和响应,一边查看、提交或以某种方式操作客户机和
服务器之间的数据交换
*