c/s是客户机/服务器,b/s是浏览器/服务器。
ipv4 192.168.....(内网ip) 通过路由器的NAT(维护了一张表,用来转换ip对应外网)。
当ipv6推广开,就不用使用路由器了。
通信原理:
写ip地址访问太麻烦,于是有了域名,它会先访问本地的hosts,没有则去网络访问DNS服务器,DNS服务器会帮我们去查找目标服务器,然后把对应的Ip地址返回。
虚拟主机(可以让多个主机名称,在一个单一服务器(或是一个服务器组)上运作,而且可以分开支持每个单一的主机名称),
web.xml放在WEB-INF其实就是为了可以访问虚拟主机。
Servlet
生命周期:
服务器启动时,Servlet生命周期中的任何方法都不会被调用。
当Servlet第一次被访问时,首先调用构造函数,之后是init()方法,该方法仅被调用一次,之后是service()方法。
如果Servlet再被访问,每次访问服务器都会开启新线程,调用service()方法。
当服务器重启或正常关闭(shutdown.bat)时,调用destroy()方法。
Servlet对象是tomcat创建的,每次请求都会调用service()方法,tomcat服务器会在每次调用service()方法时,为该方法创建Request对象和Response对象。
在HttpServlet代码实现中,根据请求方式的不同,调用相应的doXXX方法,例如get方式请求调用doGet()方法,post方式调用doPost()方法。
补充:
<!--Servlet随服务器启动而初始化-->
<load-on-startup>1</load-on-startup>
Cookie(key-value形式)原理:
Cookie的有效时间:
cookie.setMaxAge(数值): -1,默认值,表示只在浏览器内存中存活。 60*60,代表一小时。 0,代表作废。 cookie.setPath(“/”):设置路径。
Cookie的生命周期:
Cookie cookie =new Cookie("name", "value")//创建
销毁:
1.会话Cookie在浏览器关闭时销毁。
2.持久Cookie在Cookie过期时销毁。
Session原理:
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的是session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。
当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
Session的生命周期:
request.getSession();//创建
销毁:
1.服务器关闭时销毁。
2.Session过期时销毁。
3.调用HttpSession.invalidate()。
设置Session过期时间:
1.配置web.xml:
<session-config>
<!-- 单位是分钟-->
<session-timeout>30<session-timeout>
</session-config>
2.调用session.setMaxInactiveInterval(int interval),单位是秒。
3.手动调用session.invalidate()。
ServletContext
生命周期:服务器启动时创建,服务器关闭销毁,所有Servlet共享保存全局数据。
用途:数据库连接池、工程配置属性、配置文件内容。
a.转发和重定向:
转发(java特有):
1.如果服务器在处理客户请求的时候,需要多个服务器程序进行同时处理,这时候就需要使用转发.。
2.ServletContext.getRequestDispatcher(String path) : 指定转发路径。
3.RequestDispatcher.forward(ServletRequest request, ServletResponse response) : 转发参数,进行后续操作。
重定向 : 服务器收到请求后,通知客户端需要访问下一个目标程序进行后续处理。
区别:
1.转发产生一次请求一次响应,重定向产生两次请求两次响应。
2.转发只能跳转站内资源,重定向可以定向任何站点资源 。
3.转发URL地址不变,重定向URL地址改变 。
4.转发对客户端不可见,重定向对客户端可见。
5.转发共享同一个Request中数据,重定向产生两次请求,两个不同的Request对象,不能共享Request数据。
b.获取Web应用资源文件:
1.在Web应用中,必须通过绝对磁盘路径来获取文件。如果该文件位于/WEB-INF/classes目录下(src的文件保存在/WEB-INF/classes目录中),还可以通过类加载器获取
clazz.getResource("/文件").getFile();
2.ServletContext.getRealPath(String path) : 获取Web应用中的资源的绝对磁盘路径,String path参数代表相对路径。
c.获取参数:
1.getServletConfig()-->初始化参数。
2.getServletContext()-->全局参数。
d.数据共享
1.ServletContext.setAttribute(String name, Object object):保存一个全局参数。
2.ServletContext.getAttribute(String name):获取一个全局参数的值。
HttpSession
生命周期:访问JSP/Servlet等程序时创建。
用途:系统登陆信息、购物车数据
同一客户端机器多次请求同一个资源,session一样吗?
对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。
禁用Cookie后使用Session:
API:response.encodeURL
注意:
如果服务器进行URL重写,必须对所有路径进行重写,
实际开发中,不要让用户禁用Cookie。
例子:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("name", "zhangsan"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("写出成功"); String url = "/LoginDemo/GetSession"; // 重写URL String encodeURL = response.encodeURL(url); response.getWriter().write("<a href=‘" + encodeURL + "‘>查看数据</a>"); }
HttpServletRequest
生命周期:客户端发起请求时,服务器创建对象,在响应结束时,对象销毁保存Servlet向JSP传输数据信息,Servlet将操作结果传递JSP。
用途:登录错误信息
a.转发:
getRequestDispatcher(path).forward(request,response)
和ServletContext的区别:
1.ServletContext对象当服务器启动时创建,服务器关闭时销毁
2.HttpServletRequest对象当产生请求时创建,响应结束时销毁
b.乱发问题解决:
1.POST请求 :
request.setCharacterEncoding("客户端编码集");
2.GET请求 :使用new String(name.getBytes("iso-8859-1"), "utf-8")构造函数对数据进行重新编码
生命周期的长度:
ServletContext > HttpSession > HttpServletRequest
开发中选择的原则:优先使用生命周期短的。
HttpServletResponse
有关setHeader(头信息):
1.自动刷新
需求 : 完成一个类似论坛登录成功,三秒后打开主页的功能。
实现 :
方式一 :
"refresh:3;url=http://www.baidu.com" //设置头信息
方式二 : 使用meta标签
meta标签能够实现和头信息相同的效果
http-equiv = 头信息的name
content = 头信息的value
2.禁止缓存
实现:
设置信息头 :
"Cache-Control", "no-cache" "Pragma", "no-cache" "Expires", "Thu, 01 Dec 1994 16:00:00 GMT"
//下面这个设置时间的是上面的简单方法
setDateHeader("Expires", -1)
由于市面上的浏览器比较多,支持的属性不一致,所以通常情况下会把三个信息头同时设置。
3.下载文件
getServletContext().getMimeType(path): 获取文件的编码类型 ("Content-Disposition","attachment;filename=" + fileName) //attachment: 要以下载的形式下载这个文件 // filename: 指定要下载的文件的名字
输出中文字符:
setCharacterEncoding() : 设置对外输出的内容的编码,无法生成头信息
setContentType("text/html;charset=utf-8") : 设置对外输出的内容的编码,同时生成头信息,通知浏览器按照对应的格式解析内容
Servlet与线程安全:
因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,Servlet不是线程安全的。
所以我们不应该在Servlet中随意创建成员变量.
tomcat常见问题:
1. 内存溢出
系统弹出设置tomcat配置页面,在Argument中末尾添加参数中的VM arguments中追加:
-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m
参数的意思
-vmargs:说明后面是VM的参数 -Xms40m:虚拟机占用系统的最小内存 -Xmx256m:虚拟机占用系统的最大内存 -XX:PermSize:最小栈内存大小。一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置 -XX:MaxPermSize:最大栈内存大小。这个也适当大些 -Xmx512M的5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M
2. 命令启动不了
右键编辑启动指令 在第一行下面添加
SET JAVA_HOME=C:\\Program Files\\Java\\jdk1.7.0_80
SET TOMCAT_HOME=C:\\ruan_jian\\apache-tomcat-7.0.73
3. 启动速度变快
<Host appBase="webapps" autoDeploy="false" deployOnStartup="false" name="localhost" unpackWARs="true">
Servers下的 server.xml 116行 注释掉原来的
4. 解决GET请求
64行 tomcat get乱码过滤 URIEncoding="utf-8"
5. 本地tomcat启动不了 maven tomcat能启动(或相反)
换一个工作空间 并且重新配置tomcat
连接池:
不使用连接池的缺点:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
第3方连接池:
1.DBCP 2.C3P0