整理笔记--Web基础

c/s是客户机/服务器,b/s是浏览器/服务器。

ipv4 192.168.....(内网ip) 通过路由器的NAT(维护了一张表,用来转换ip对应外网)。

当ipv6推广开,就不用使用路由器了。

通信原理:

写ip地址访问太麻烦,于是有了域名,它会先访问本地的hosts,没有则去网络访问DNS服务器,DNS服务器会帮我们去查找目标服务器,然后把对应的Ip地址返回。

虚拟主机(可以让多个主机名称,在一个单一服务器(或是一个服务器组)上运作,而且可以分开支持每个单一的主机名称),

web.xml放在WEB-INF其实就是为了可以访问虚拟主机。

Servlet

生命周期:

整理笔记--Web基础

服务器启动时,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></load-on-startup>

Cookie(key-value形式)原理:

整理笔记--Web基础

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><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();

.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
整理笔记--Web基础


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