PS:我上课记录的一些笔记,巨长。分享给大家,欢迎指出错误和补充,谢谢大家。
1.Tomcat的目录结构
bin:启动和关闭需要的bat文件所在的目录
conf:配置目录
lib:Tomcat运行时所需要的jar包所在的目录
logs:日志文件所在的目录
temp:运行时产生的临时文件存放的目录,不需要管理
webapps:开发中最常用的目录,web应用放置在此目录下,浏览器可以直接访问
work:工作目录
2.虚拟主机:一个Tomcat可以认为是一台真实主机,在一台真实主机中 可以配置多个站点,一个网站可以认为是一台虚拟主机。
web应用目录:
news-
html等静态资源文件,jsp文件都可以直接放置在web应用目录下,浏览器可以直接访问;
WEB-INF---
classes-动态web资源运行时的class文件存放在这个目录下;
lib-动态web资源运行时所依赖的jar包的位置;
web.xml 整个web应用的配置文件,配置主页等。
3.为虚拟主机配置web应用
直接将web应用放置到虚拟主机管理目录webapp下,虚拟主机可以直接找到这个web应用,只要将web应用文件夹的名称改为ROOT,这个web应用就是缺省的web应用
4.war包的传输:打war包,减少war包应用的体积,便于传输,并且在虚拟主机的目录下,war包默认可以自动解压
OSI网络七层协议:应用层(HTTP、PTP、SMTP、POP3、TELNET)-》表示层-》会话层-》传输层-》网络层-》数据链路层-》物理层
http协议:
规定客户端和服务器如何进行交互,它是基于TCP/IP协议的应用层协议,HTTP协议基于请求响应模型,一次请求对应一次响应,请求只能由客户端发起。
1、请求方式:POST、GET等7种;
区别:在于请求参数在传递的过程中方式不同;如果GET提交的,请求参数会附加在请求的URL后面,作为请求地址的一部分带到服务器端,可以传输的数据大小有限制,不能超过1k,如果是POST方式提交,请求参数会在http请求的实体内容中进行传输,传输数据大小无限制;
2、HTTP响应状态行
状态码 200 --- 成功;
302 --- 请求重定向;
304/307 --- 使用缓存;
404 --- 找不到;
500 --- 服务器端的错误;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三、Servlet
1、Servlet
sun公司提供的一种动态web资源开发技术,本质上就是一段java小程序,可以将Servlet加入到Servlet容器中运行;
Servlet容器 - 能够运行Servlet的环境 ,就叫Servlet容器 ---- tomecat;
Web容器 ---- 能够运行Web应用的环境,就叫Web容器 ---- tomcat
2、Servlet的实现
写一个类实现Servlet接口,将写好的类配置到tomcat中的web应用的web.xml文件中(配置对外访问路径)
3、Servlet的调用过程
1、分析当前请求的是哪台虚拟主机
查看Host请求头分析出访问的是哪台虚拟主机,
如果没有,就访问缺省的虚拟主机;
2、分析当前请求访问的是当前虚拟主机中的哪个web资源
从请求中行中请求的资源部分中分析出当前访问的哪个web应用
3、分析当前请求要访问的这个web应用中的哪个资源
从请求行中的资源部分中分析出访问的是哪个资源
4、查找web.xml文件,找到虚拟路径对应的web资源做响应。
5、服务器从response对象中获取之前写入的数据,组织成http响应传输
4、Servlet的生命周期
Servlet在第一次被访问到的时候,服务器创建出Servlet对象,立即调用init方法做初始化操作。创建出的对象会一直驻留在内存中,为后续对这个Servlet的访问提供服务。每次对这个Servlet的访问都会导致Servlet中的service()方法执行,当web应用被移除出容器或者server关闭时,随着web应用的销毁Servlet会被销毁,在销毁之前,服务器会调用Servlet的destory()方法做一些善后工作
Servlet的继承结构
Servlet接口------定义于Servlet应该具有的基本方法
GenericServlet---通用基本servlet实现,对于不常用的方法在这个实现类中惊醒了基本的实现,对于Service()设计的抽象方法,需要子类实现
HttpServlet----在通用Servlet的基础上基于HTTP协议进行了第一步的强化,实现了GenericServlet中的Service()方法,判断当前的请求方式,调用对应的doXXX()方法,这样一来我们开发Servlet的过程中,只需要继承HttpServlet,覆盖具体的要处理的doXXX()方法,就可以根据不同的请求方式,实现不同的处理,一般不要覆盖父类中的Service()方法,只覆盖doXXX()方法就可以了
Servlet的细节和知识点
1、一个<servlet>可以对应多个<servlet-mapping>,那一个Servlet就可以通过多个路径来进行访问
2、<url-pattern>中路径可以使用通配符*进行配置,但是只能是/开头,/*或者*.结尾,*.后缀匹配级别最低
3、<load-on-startup>可以指定启动顺序
4、缺省的Servlet,对于静态资源的访问,就是由缺省Servlet来执行,通常我们不自己去配置缺省Servlet;设置404页面或者500页面等提示画面,由缺省的Servlet来执行
5.线程安全问题
在Servlet中尽量少用类变量,如果一定要用类变量,就用锁来防止线程安全问题,注意锁住的内容应该是造成线程安全问题的核心代码,尽量少锁住内容。
6.ServletConfig对象
ServletConfig---代表当前Servlet在web.xml中的配置信息
String getServletName()---获取当前Servlet在web.xml文件中配置的名字;
String getInitParameter(String name)--获取当前Servlet指定名称的初始化参数的值;
Enumeration getInitParameterNames() ---获取当前Servlet所有初始化参数的名字组成的枚举;
ServletContext getServletContext()--获取当前web应用的ServletContext对象;
7、ServletContext----代表当前的web应用,作为域对象可以在整个的web应用范围内共享数据;
一、域对象
(1)域对象:在一个可以被看见的范围内共享数据用到的对象;
(2)作用范围:整个的web应用范围内共享数据;
(3)生命周期:当服务器启动web应用加载后,创建ServletContext对象后,域产生,当web应用被移除容器或服务关闭,随着web应用的销毁域销毁
二、用来获取web应用的初始化参数
请求参数parameter---浏览器发过来的请求中的参数;
初始化参数initparameter----在web.xml中为Servlet或者ServletContext配置的初始化时带有的基本参数;
域属性attribute---域中存取的键值对
三、实现Servlet的转发
重定向:302 Location
请求转发:服务器内部进行的资源流转
请求转发是一次请求一次响应,实现资源流转;
请求重定向是二次请求二次响应,实现资源流转;
四、加载资源文件
Response
ServletResponse---通用的response提供一个响应该具有的最基本的属性和方法
---HttpServletResponse----在ServletResponse的基础上,针对HTTP协议增加的强化的属性和方法。
1、输出数据
response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write("".getBytes("UTF-8"));
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
response.getWriter().write("");
2、实现下载
Content-Dispos
3、实时刷新页面
4、控制是否缓存资源
Expires:
Cache
5、请求重定向
response.getOutputStream()和 response.getWriter()是互斥的
调用其中一个方法后,就不能再调用另外一个方法
response中获取的输出流,在service方法结束后服务器会帮我们关闭,一般不需要自己在Servlet中关闭这个流 ****************************************************************************************************
五、Request
ServletRequest--通用request,提供一个request应该具有的最基本的方法;
HttpSevletRequest---ServletRequest的孩子,针对HTTP协议进行了增强
1、获取客户端信息
getRequestURL()//获取客户端发出请求完整URL
getRequestURI()//获取客户端请求行的资源部分的内容
getQueryString()//获取请求行中的参数部分
getRemoteAddr()//获取客户端的IP地址
getMethod()//获取客户机请求方式
getContextPath()//获取当前的web应用名称
2.获取请求头的信息
获取客户端请求头
getHeader(name)---String
getHeaders(String name)---Enumeration<String>
getHeaderNames---Enumeration<String>
getIntHeader(name)---int
getDateHeader(name)--=long(日期对应的是毫秒)
防盗链
3.获取请求参数
服务如果不指定,就使用ISO859-1编码方式;
浏览器以什么编码打开表单页面,就用什么编码发送这个页面提交的数据;
对于POST 提交,可以设置request.setCharacterEncoding("utf-8"),明确的通知服务器已浏览器发送过来的编码来打开数据,就可以解决乱码,但上面的方法只对请求的实体内容部分起作用,对GET提交的乱码不能解决;
对于GET方式提交的乱码,只能手动进行编解码解决
String username=request.getParameter("username");
username=new String(username.getBytes("ISO8859-1"),"utf-8");
4.利用请求域传递对象
作用范围:整个请求链上;
生命周期:当server收到一个请求,创建出代表请求的request对象,request开始,当请求结束,服务器就销毁request对象;
作用:在整个请求链范围内共享数据,通常我们在Servlet中处理好的数据,会存入request域后,请求转发到jsp页面进行展示;
setAttribute
getAttribute
removeAttribute
5.请求转发
请求转发时,如果已经有数据被写入response的缓冲区,但是这些数据还没有被发送到客户端,则请求转发时,这些数据将会被清空,但是清空的只是响应中的实体内容部分,头信息并不会被清空;
请求转发时已经有数据打给了浏览器,再进行请求转发,不能成功,会抛出异常,原因是响应已经结束了,再转发已经没有意义;
一个Servlet里两次请求转发,也是不可以的,一次请求交给两人处理,也不行;
请求包含
将两个资源的输出合并后输出
this.getServletContext().getRequestDispatcher("").include(request,response);
request.getRequestDispatcher("").include(request,response);
被包含的Servlet程序不能改变响应消息的状态码和响应头,如果有这样的语句,这些语句的执行结果被忽略;
常被用来进行页面布局;
三种资源的处理方式
请求重定向 response.sendRedirect()
请求转发 request.getRequestDispatcher().foword(request,response)
请求包含request.getRequestDispatcher("").include(request,response);
请求转发和请求重定向的区别****
请求转发:地址栏不发生变化, 请求重定向:地址栏发生变化;
一次请求一次响应 二次请求二次响应
如果需要在资源跳转时利用request域传递属性,则必须用请求转发;
如果希望资源跳转后修改用户的地址栏,则使用请求重定向;
如果使用请求转发可以,请求重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数,减轻服务器的压力;
***********************************************************************************************************
常用地址的写法
绝对路径:以/开头的路径叫做绝对路径,是在相对路径上直接拼接得到的最终路径;
相对路径:不以/开头的路径,基于当前所在路径计算得到的最终的路径;
硬盘路径:以盘符开头的路径,是哪个路径就是哪个路径,没有相对的问题;
虚拟路径:写虚拟路径是都使用绝对路径;
如果路径是给浏览器使用的,那这个路径相对于虚拟主机, 所以需要写上web应 用的名称,如果路径是给服务器用的,这个路径相对于web应用,所以可省略写web应用的名称;
<a href="/Test01/.........."/>
<form action="/Test01/.........."><form/>
<img src="/Test01/.........."/>
response.setHeader("Location","/Test01/..........");
response.setHeader("refresh","3,url=/Test01/..........");
response.sendRedirect("/Test01/..........");
以上都是给浏览器使用的。
request.getRequestDispatcher("/index.jsp").forward(request,response);
request.getRequestDispatcher("/index.jsp").include(request,response);
真实路径:写真实路径是都使用相对路径;
具体问题具体分析;
servletContext().getRealPath("config.properties");//给一个相对于web应用目录的路径;
classLoader.getResource("../../config.properties");//给一个相对于类加载目录的路径;
File file=new File("config.properties");//相对于程序的启动目录;
new InputStream("config.properties");//相对于程序的启动目录;
*************************************************************************************
JSP(Java Servce Pages)
(一)JSP技术
JSP是Sun提供的动态资源开发技术,为了解决在Servlet中拼写HTML和CSS
JavaScript内容十分不方便的问题,JSP便于组织页面
JSP页面在第一次被访问时,会被JSP翻译引擎翻译成一个Servlet,从此对于这个JSP页面的访问都是由这个Servlet执行后输出
(二)JSP语法
JSP模板元素
JSP页面中书写的HTML内容
在翻译过来的Servlet中直接被out.witer()输出到浏览器页面上。
JSP表达式<%=java表达式%>
在翻译过来的Servlet中,计算Java表达式的值后,被out输出到浏览器上。
JSP脚本片段<%若干Java语句%>
在翻译过来的Servlet中,直接被复制粘贴到对应的位置执行;
在一个JSP页面中可以有多个JSP脚本片断,在两个或者多个脚本片断直接可以嵌入文本,HTML标记和其他的JSP元素;
多个脚本片断的代码可以互相访问,单个脚本片断可以是不完整的,但多个脚本片断组合后的结果必须是完整的JAVA语句
JSP注释
<%---注释内容--%>
在翻译Servlet过程中被丢弃,在翻译过来的Servlet中没有这些信息;
<%//java注释内容%>
被当做JSP脚本片断被翻译Servlet中,在Java文件被翻译成class文件的时候信息被丢弃;
<!--html注释-->
当做模板元素输出到浏览器上,浏览器认识HTML注释,不予显示;
JSP声明
<%若干Java语句%>
在翻译过来的Servlet中会被放置到S而vice()方法同级别的位置,变成了类的一个变量。
***********************************************************************************************
会话技术
1、浏览器开始访问网站到访问网站结束期间产生多次的请求和响应组合在一起,就叫做一次会话,会话的过程中产生的数据,我们需要保存起来。
Cookie:客户端技术
Session:服务端器技术
Cookie:基于Set Cookie响应头和Cookie请求头工作的,服务器可以发送Set-Cookie请求头,命令浏览器保存一个cookie信息,浏览器会在访问服务器时以Cookie请求头的方式带回之前报存的信息;
request.getCookies();
response.addCookie(Cookie c);
new Cookie(String name,String value)
//Cookie在构造的时候,就需要设定好cookie的名字和值;
getName()
getValue()
setValue()
setMaxAge与setMaxAge方法
如果不设置,那每次打开浏览器,都是新的
如果设置之后,Cookie信息就以文件保存在浏览器的临时文件夹中。保存到指定的时间。
如果想要删除cookie,发送一个同名同路径的cookie,MaxAge的值设置为0;
setPath与getPath方法
用来通知浏览器在访问服务器中的哪个路径及其在子路径时带着cookie信息过来;
如果不明确设置,则默认的路径是发送Cookie的Servlet所在路径;
setDomain与getDomain方法
3.Session
是一个域对象,作用范围;当前的会话范围;
生命周期;当程序第一次调用request.getSession()方法时,说明客户端明确的要求用到session,此时创建出对应的客户端的Session对象;
当session超过30分钟(web.xml)配置没人使用时,就认为这个session超时,销毁session。
当程序明确调用session.invalidate()方法可以立即杀死session。
当服务器非正常关闭时,随着虚拟机的死亡而死亡。
Session原理:
request.getSession()方法检查请求中有没有JESSIONID,
如果有,就找到对应的session来为它服务;
如果没有,就检查URL有没有以参数的形式待着JESSIONID过来,
如果有,就找到对应的session为浏览器服务,如果找不到,就认为这个浏览器没有session,创建一个session,然后在响应中添加JESSIONIDcookie,值就是这个Session的ID。
4.Cookie和Session:
cookie是客户端技术,数据保存在客户端,信息可以保存很长时间,数据可能随 时被清空;具有安全隐患
session是服务器技术,数据保存在服务器,相对来说比较稳定和安全,占用服务器内存,一般存活时间不会太长,超过超时时间就会被销毁,所以要根据该服务器的压力和session的使用情况合理设置session的超时时间;既能保证session的存活时间足够用,同时不用的session可以及时销毁,减少对于服务器内存的占用;
5.ServletContext,request,session域的比较;
ServletContext的作用域是整个web应用,随着服务器启动而创建如果应用被移
除除主机或服务器关闭则销毁;
request的作用域是整个的请求链,每次请求都会穿件一个request,当请求结束
时,request销毁;
session作用域是整个绘画,第一次调用request.getSession()创建,当一段时间
没有使用或者服务器关闭或者调用session.invalidate()方法时销毁;
如果一个数据只是用来显示,就用 request
如果一个数据除了用来显示外,一会我还要用,就用 session
如果一个数据处理用来显示外,一会别人还要用,就用 ServletContext
***************************************************************************************************
转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同请求
转发不会执行转发后的代码;重定向会执行重定向之后的代码
转发地址栏没有变化;重定向地址栏有变化
转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
前后两个页面 有数据传递 用请求转发,没有则用重定向。