初级JavaWeb,学习笔记整理

一 . Tomcat

1.对Tomcat的理解

Tomcat是一个运行JAVA的网络服务器,提供能够让别人访问自己写的页面的一个程序,是JSP和Serlvet的一个容器。

2.Tomcat的配置

两种方式,解压压缩包(配环境变量)、直接安装(不用配环境变量);



二 . Http

    1.对http协议的理解

            超文本传输协议它是TCP/IP协议的一个应用层协议。HTTP协议就是客户端和服务器   交互的一种通迅的格式。

    2.http请求

        2.1请求行

                请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT

                常用的有:POST,GET一般来说,当我们点击超链接,通过地址栏访问都是get请求方式。通过表单提交的数据一般是post方式。可以简单理解GET方式用来查询数据,**POST方式用来提交数据,get的提交速度比post快GET方式:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。POST方式:可以在请求的实体内容中向服务器发送数据,传送的数据量无限制。

        2.2请求头

            Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】

            Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集

            Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式

            Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】

            Host: www.it315.org:80【浏览器告诉服务器,它的想访问哪台主机】

            If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】

            Referer: http://www.it315.org/index.jsp【浏览器告诉服务器,客户机是从那个页面来的---反盗链

            User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】

            Cookie【浏览器告诉服务器,带来的Cookie是什么

            Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】

            Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间】

3.http响应(状态行、响应头、空行、实体内容)

    3.1状态行

    3.2响应头

            Location: http://www.it315.org/index.jsp 【服务器告诉浏览器要跳转到哪个页面

            Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】

            Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式

            Content-Length: 80 【服务器告诉浏览器回送数据的长度】

            Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】

            Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型

            Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】

            Refresh: 1;url=http://www.it315.org【服务器告诉浏览器要定时刷新

            Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据

            Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】

            Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie

            Expires: -1【服务器告诉浏览器不要设置缓存

            Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存

            Pragma: no-cache 【服务器告诉浏览器不要设置缓存

            Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】

            Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】



三 . Servlet

    1.对Serlvet的理解

        是一个遵循Servlet开发的java类。Serlvet是由服务器调用,运行在服务器端,能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互

     2.Servlet生命周期

            加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例

            初始化(init)。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象

            处理服务(service)。当浏览器访问Servlet的时候,Servlet会调用service()方法处理请求

            销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁

            卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作

简单总结:只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用 ,destroy()只有在Tomcat关闭时调用 。

    3.Servlet细节

        3.1 一个已经注册的Servlet可以被多次映射(一个servlet 映射到多个URL)

        3.2 servlet 映射的URL可以使用通配符

            *.扩展名  (*.jsp  匹配jsp页面)//优先级低

            正斜杠(/)开头并以“/*”结尾。(/* 匹配所有界面)

        3.3 servlet 是单例模式  

            浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。

        3.4 servlet 之间通讯(ServletContext的setAttribute(String name,Object obj)方法

    4.Servlet之 response  

        (HttpServletResponse(封装http响应的信息))

        4.1 调用getOutputStream()向浏览器输出数据,输出二进制格式的数据。

            (1)print()不能输出中文(Tomcat以ISO 8859-1编码对中文编码)

            (2)输出中文:response.getOutputStream().write("你好".getBytes());

            (3)为了保证通用性,使用UTF-8编码

            //设置头信息,告诉浏览器我回送的数据编码是utf-8的

             response.setHeader("Content-Type", "text/html;charset=UTF-8");

             response.getOutputStream().write("你好".getBytes("UTF-8"));

        4.2 调用getWrite() 方法向浏览器输出数据 ,只能输出字符数据,不能输出二进制数据。

            (1)response.setContentType("text/html;charset=UTF-8");//解决输出中文乱码问题

        4.3 getWriter和getOutputStream细节

            (1)getWriter()和getOutputStream()两个方法不能同时调用。如果同时调用就会出现异常

            (2)Servlet的serice()方法结束后【也就是doPost()或者doGet()结束后】,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象.

        4.4 实现文件下载(以下是步骤)

            (1)保证站点有此图片

            (2)写一个Servlet,当别人访问我这个Servlet的时候,它们就可以下载我这个图片了

            (3)java的文件上传下载都是通过io流来完成的,既然要下载图片,首先要能够读取到它

            //获取到资源的路径

            String path =this.getServletContext().getRealPath("/download/1.png");

            //读取资源

            FileInputStream fileInputStream =newFileInputStream(path);

            //获取到文件名,路径在电脑上保存是\\形式的。

            String fileName = path.substring(path.lastIndexOf("\\") +1);

            告诉浏览器,我要下载这个文件

            //设置消息头,告诉浏览器,我要下载1.png这个图片

            response.setHeader("Content-Disposition","attachment; filename="+fileName);

            将读取到的内容回送给浏览器

            //把读取到的资源写给浏览器

            intlen =0;

            byte[] bytes =newbyte[1024];

            ServletOutputStream servletOutputStream = response.getOutputStream();

            while((len = fileInputStream.read(bytes)) >0) {

            servletOutputStream.write(bytes,0, len);

            }

            //关闭资源

            servletOutputStream.close();

            fileInputStream.close();

            (4)访问浏览器就提示下载了。

            (5)解决文件名是中文时的乱码问题:为了解决文件名乱码,我们要进行URL编码:

            response.setHeader("Content-Disposition", "attachment; filename=" +             URLEncoder.encode(fileName, "UTF-8"));

        4.5 实现自动刷新

            (1)response.setHeader("Refresh", "3");  // 3秒刷新一次

        4.6 设置缓存

            (1)浏览器本身就存在着缓存机制,禁止缓存功能:

            //浏览器有三消息头设置缓存,为了兼容性!将三个消息头都设置了

            response.setDateHeader("Expires", -1);

            response.setHeader("Cache-Control","no-cache");

            response.setHeader("Pragma","no-cache");

            //这里为了看效果

            PrintWriter printWriter = response.getWriter();

            printWriter.print("你好啊"+newDate().toString());

        4.7 重定向跳转

            (1) response.sendRedirect("/zhongxiang/index.jsp");

    5.Servlet之 request    

        (HttpServletRequest(客户端的请求))

        5.1 防盗链

            (获取Referer消息头,判断是不是从我的首页来的。不是则跳转回首页。)

            String referer = request.getHeader("Referer");//获取到网页是从哪里来的

            if ( referer == null || !referer.contains("localhost:8080/herewell/index.jsp") ) {

              response.sendRedirect("/herewell/index.jsp");}

        5.2 表单提交数据,获取要提交的值

            request.setCharacterEncoding("UTF-8");  //设置request字符编码的格式

            String username = request.getParameter("username");//输入框和文本框一个值,获取到一个值

            String[] hobbies = request.getParameterValues("hobbies"); //复选框下拉框有多个值,获取到多个值

        5.3 解决中文乱码问题(Tomcat以ISO 8859-1编码对中文编码)

            1. request.setCharacterEncoding("UTF-8");//post 解决乱码,因为post消息封装到了request中

            2. get方法它的数据是从消息行带过去的没有封装到request对象里,使用request设置编码无效。

            String name = request.getParameter("username");//此时是被ISO 8859-1编码的字符串,乱码

            byte[] bytes = name.getBytes("ISO8859-1");//乱码通过反向查ISO 8859-1得到原始的数据

            String value = new String(bytes, "UTF-8");//通过原始的数据,设置正确的码表,构建字符串

6.Cookie

    6.1 Cookie 定义:

给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie

    6.2  Cookie的流程:

浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器

    6.3 Cookie API 

 Cookie类用于创建一个Cookie对象

 response接口中定义了一个addCookie方法,用于在其响应头中增加一个相应的Set-Cookie头字段

 request接口中定义了一个getCookies方法,用于获取客户端提交的Cookie

常用的Cookie方法:

- public Cookie(String name,String value)

- setValue与getValue方法

- setMaxAge与getMaxAge方法//设置Cookie的时间

- setPath与getPath方法

- setDomain与getDomain方法

- getName方法

    6.4 Cookie细节

        1.Cookie不可跨域名性

Cookie具有不可跨域名性。浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。

        2.Cookie保存中文

2.1 Cookie使用Unicode字符时需要对Unicode字符进行编码

Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));

2.2 在取出Cookie的时候要对中文数据进行解码

Cookie[] cookies = request.getCookies();

  for (int i = 0; cookies != null && i < cookies.length; i++) {

  String name = cookies[i].getName();

  String value = URLDecoder.decode(cookies[i].getValue(), "UTF-8");

  printWriter.write(name + "------" + value);}

        3.Cookie的有效期(setMaxAge()来设置)

3.1 如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效

3.2 如果MaxAge为负数,**Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1

3.3 如果MaxAge为0,则表示删除该Cookie

        4.Cookie的修改和删除

                4.1 修改cookie  

Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie。

Cookie cookie = new Cookie("country", URLEncoder.encode(name, "UTF-8"));

                4.2 删除cookie   

把MaxAge设置为0,并添加到浏览器中即可

cookie.setMaxAge(0);

response.addCookie(cookie)

注意:

删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!

        5.Cookie的域名(domain属性决定运行访问Cookie的域名)

cookie.setDomain(".herewell.com");

        6.Cookie的路径(path属性决定允许访问Cookie的路径)

一般地,Cookie发布出来,整个网页的资源都可以使用。现在我只想Servlet1可以获取到Cookie,其他的资源不能获取。

cookie.setPath("/Servlet1");

        7.Cookie的安全属性

设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。

7.Session

    7.1 Session定义:

Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session

Session比Cookie使用方便,Session可以解决Cookie解决不了的事情【Session可以存储对象,Cookie只能存储字符串。】

    7.2 Session API

long getCreationTime();【获取Session被创建时间】

String getId();【获取Session的id】

long getLastAccessedTime();【返回Session最后活跃的时间】

ServletContext getServletContext();【获取ServletContext对象】

void setMaxInactiveInterval(int var1);【设置Session超时时间】

int getMaxInactiveInterval();【获取Session超时时间】

Object getAttribute(String var1);【获取Session属性】

Enumeration   getAttributeNames();【获取Session所有的属性名】

void setAttribute(String var1, Object var2);【设置Session属性】

void removeAttribute(String var1);【移除Session属性】

void invalidate();【销毁该Session】

boolean isNew();【该Session是否为新的】

    7.3 Session作为域对象(传值)

只要Session对象没有被销毁,Servlet之间就可以通过Session对象实现通讯

  HttpSession httpSession = request.getSession();  //得到Session对象

  httpSession.setAttribute("name", "蔬菜!!"); //设置Session属性

String value = (String) httpSession.getAttribute("name");//在其他servlet获取传递的数据

    7.4 Session的生命周期和有效期

1.Session在用户第一次访问服务器Servlet,jsp等动态资源就会被自动创建,Session对象保存在内存里

2.无论是否对Session进行读写,服务器都会认为Session活跃了一次。(最后一次)

3.为防止内存溢出,服务器会把长时间没活跃的Session从内存中删除,这个就是Session的超时时间

4.Session的超时时间默认是30分钟,有三种方式可以对Session的超时时间进行修改

(1)在tomcat/conf/web.xml文件中设置,时间值为20分钟,所有的WEB应用都有效

(2)在单个的web.xml文件中设置,对单个web应用有效,如果有冲突,以自己的web应用为准。

(3)通过setMaxInactiveInterval()方法设置

    7.5   Session的实现原理

HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户。

简单来说:Session之所以可以识别不同的用户,依靠的就是Cookie

该Cookie是服务器自动颁发给浏览器的,不用我们手工创建的。该Cookie的maxAge值默认是-1,也就是说仅当前浏览器使用,不将该Cookie存在硬盘中

我理解的:每次连接服务器都会生成一个JESSIONID,他就是服务器自动颁发的cookie,cookie的默认maxAge是-1,过了cookie的时效期,就要重新连接服务器请求新的JESSIONID

    7.6   Session禁用Cookie

1.禁用自己项目的Cookie(META-INF文件夹下context.xml)

2. 禁用全部web应用的Cookie( 在conf/context.xml中修改)

    7.7   利用Session防止表单重复提交

        1.常见的重复提交

- 在处理表单的Servlet中刷新。

- 后退再提交

- 网络延迟,多次点击提交按钮

        2.session 处理

-判断Session域对象的数据和jsp隐藏域提交的数据是否对应。

-判断隐藏域的数据是否为空【如果为空,就是直接访问表单处理页面的Servlet】

-判断Session的数据是否为空【servlet判断完是否重复提交,最好能立马移除Session的数据,如果Session域对象数据为空,证明已经提交过数据了!

向Session域对象存入的数据是一个随机数【Token--令牌】(生成的一个独一无二的随机数)。

实现原理:

在session域中存储一个token

然后前台页面的隐藏域获取得到这个token

在第一次访问的时候,我们就判断seesion有没有值,如果有就比对。对比正确后我们就处理请求,接着就把session存储的数据给删除了

等到再次访问的时候,我们session就没有值了,就不受理前台的请求了!

    7.8   Session和Cookie的区别

从存储方式上比较

Cookie只能存储字符串,如果要存储非ASCII字符串还要对其编码。

Session可以存储任何类型的数据,可以把Session看成是一个容器

从隐私安全上比较

Cookie存储在浏览器中,对客户端是可见的。信息容易泄露出去。如果使用Cookie,最好将Cookie加密

Session存储在服务器上,对客户端是透明的。不存在敏感信息泄露问题。

从有效期上比较

Cookie保存在硬盘中,只需要设置maxAge属性为比较大的正整数,即使关闭浏览器,Cookie还是存在的

Session的保存在服务器中,设置maxInactiveInterval属性值来确定Session的有效期。并且Session依赖于名为JSESSIONID的Cookie,该Cookie默认的maxAge属性为-1。如果关闭了浏览器,该Session虽然没有从服务器中消亡,但也就失效了。

从对服务器的负担比较

Session是保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存。

Cookie是保存在客户端的。不占用服务器的资源。像baidu、Sina这样的大型网站,一般都是使用Cookie来进行会话跟踪。

从浏览器的支持上比较

如果浏览器禁用了Cookie,那么Cookie是无用的了!

如果浏览器禁用了Cookie,Session可以通过URL地址重写来进行会话跟踪。

从跨域名上比较

Cookie可以设置domain属性来实现跨域名

Session只在当前的域名内有效,不可夸域名

    7.9 Cookie和Session共同使用

1.创建Cookie,Cookie的值是Session的id返回给浏览器

2.在server.xml文件中配置,将每个用户的Session在服务器关闭的时候序列化到硬盘或数据库上保存(不常用)





参考资料: Java3Y公众号

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容