磊哥WEB开发笔记(3)

********************
*********************
把上面的一句话抽取出来:(一个WEB应用不等于一个Servlet对象,WEB应用相当于一个工程,

而Servlet只是工程中的一个类(其实是一个java)放在classes里的)
不要被eclipse里的工程迷惑,在新建的WEB工程中的src是没有这个目录的,当发布到服务器

中其实是classes文件夹(前面说了这个文件夹里写的是什么!)
******************88888
*********************
response:
输出数据:String data="中国";
 PrintWriter out=response.getWriter();
 out.write(data);
会出现??乱码的问题,因为ISO8859里面没有中国这个对于码
//设置response使用的码表,以控制response以什么码表向浏览器写入数据,默认为  

ISO8859

response.setCharacterEncoding("UTF-8");//这句话只对post提交有效
//指定浏览器以什么码表打开服务器发送的数据
response.setHeader("context-type","text/html;charset=UTF-8");//很熟悉的   

    context-type头
可以把上面两句话变为一句话:response.setContentType("text/html;charset=UTF-8");


request乱码解决:
username=new String(username.getBytes("iso8859-1"),"UTF-8");//反向:得到文字iso码

再指定服务器用utf解码,这个码是客户
  //端的码表决定的,假设是UTF-8,此码在服务器默认被iso解肯定是乱码
  
------------------------
-----*******--------
先记得一点request是从客户端到服务端来,response是从服务器到客户端去,都是服务端的

东东!!
response的细节问题:
1:getOutputStream 和getWriter方法分别用于得到输出二进制数据和输出文本数据的

ServletOutputStream和printWriter对象:
2:getOutputStream 和getWriter方法互相排斥,调用其中一个任何方法后就不能调用另一

个了(同一个是指的在一个response中,所以转发中(一个servlet转发到另一个servlet代码

中也只能用一个,经常会这两个方法出现两个代码中,字符和字节都可以用字节流输出!)
3:servlet程序向ServletOutputStream和printWriter对象中写入数据后将被servlet引擎从

response中获取,并将这些数据作为消息的正文,然后再与响应状态行和个响应头组合后输

出到客户端!
4:servlet的service方法结束后,servlet引擎将检查getOutputStream 和getWriter方法返

回的输出流对象是否已经调用过close方法,如果没有,servlet引擎将调用close方法关闭该

输出流对象(所以不用自己关闭流了!!)

————————————————————————
mvc=(mode(如javabean) view(jsp) controller(servlet))软件开发中最重要的设计模

式。

------------------------
getattribute("String")取域里面本来的属性值
getparameter("String") 取客户机带来的指定参数
request得细节问题:
1:request对象调用getRequestDispacher方法,该方法返回一个RequestDispacher对象调用

这个对象的forward方法可以实现请求转发(请求转发指一个WEB资源受到客户端请求后通知服

务器调用另一个WEB资源进行处理)
2:request对象同时也是一个域对象,开发人员通过request对象在实现转发的同时,吧数据

通过request对象带给其他web资源处理(有set/get/remove/Attribute和getAttributeNames

方法)

3:
String data="jmr$hl";
  // this.getServletContext().setAttribute("data",data);这样是不对

的因为servletContext是共享的
  //当一个哥们传a在转发钱另一个哥们传b则覆盖了。而每个访问会创建自

己的request,因而一般用request域带数据
  request.setAttribute("data",data);
  //request 实现转发
  request.getRequestDispatcher("/message.jsp").forward(request,

response);
  
——————————————————————————
************************************************
***********************************************
cookie和session保存会话数据技术:

cookie:我老是把cookie想成一个唯一的东西,其实它就相当于一个类,可以Cookie

cookie=new Cookie("",);


一直不明白浏览器访问这么多网站,应该不会在访问其中一个网站的时候带上所有的数据(这

个网站的数据和与此网站无关的数据),它是怎样区分是这个网站所需的数据的呢?
cookie客户端有一个setpath()和getpath()方法,setpath()设置为哪个路径,浏览器在访问

这个路径的servlet才会带cookie过来,如果没有用setpath设置路径的话,则这个cookie是

哪个servlet返回的,只有访问这个servlet才回带cookie!!!
带多少数据还没说啊?怎样区分是这个网站所需数据的???
IE浏览器会阻止第三方的cookie!!


cookie的setMaxAge()方法:设置cookie保存有效期,若不设置浏览器关闭后cookie就清除了
***********************************
带cookie:客户端第一次访问肯定是没有cookie的,访问后response会new一个cookie给客户

端,其中带有哪些信息也是服务器自己设的(如带有一个字段bookHistory) ,这cookie返回

给客户端后,客户端第二次访问这个服务器时候带来了cookie(什么时候带,见上面的

setpath),服务器request处理cookie,取出想要得到的信息(如取出bookHistory),然后再

进行服务器端处理,response返回给客户端处理的界面(和新的cookie)!!

********************
网址:.sina.com 叫域
有检索数据的需求用双例  map集合(有key value)
没有的话通通用单例   list集合
********************
****************************
session:服务器会为每个浏览器会话创建一个独自的session对象。
什么叫浏览器会话:如打开一个浏览器访问网站点击购买(相当于访问购买servlet代码,

servlet代码中有下面创建session语句,并不是访问网站就创建session哦!),会生成

session后,再打开一个浏览器访问此网站点击结账是不会有前面购买商品的信息的。两个浏

览器相当于两个会话。
**
这里出现一个问题:当在电脑上打开多个浏览器的时候,同时点击购买同时生成了多个

session,服务器是怎么区分每个session的??
其实session是基于cookie的,用户点击网站购买(servlet)生成session的时候,同时会为这

个cookie生成一个id名为JSessionID ,并以cookie的形式返回给客户,当用户点击结账的时

候是带着cookie中的JSessionID 来的,以此区分多个会话的session的。注意了,这个

cookie是没有设置有效期的,也就是说关闭当前会话浏览器cookie就没了,这个时候再次点

击结账的时候是没有购买商品的信息的(session存在默认30分钟,但是却没了JSessionID

,会重新创建一个session)。所以要设置cookie的有效期为30分钟!
--
问题2:当我关闭浏览器的时候会话结束session存在,然后再打开浏览器,服务器为什么会

觉得我不是一个新的会话为我创建一个新的session,而是觉得我是原来的会话给我原

session呢????
我想了一下,会不会就是当前session的个数是记住的,当关闭浏览器后再次打开,还是这个

session的个数不会新创建!
---------
问题3:session是通过cookie返回(以cookie带给服务器的),如果电脑设置禁止接受cookie

呢?
其实gesesion()中的代码是:判断是否以cookie带session(优先)和是否以url带session(后)
url带session是指的点击url后以url?JSessionID发送 ,在url后会加上JSessionID ,这样


 String url1=response.encodeURL("/ServletDemo/servlet/SessionDemo1");//用 

     这个代码测试我的问题2
------------------、
创建(和得到)session代码:
 session=request.getSession();//这里是get其实是得到session,如果没有

session就创建,所以也是创建
 session.setAttribute("name","洗衣机");
//request.getSession(false);只获取session不创建,如用户购物车
session的生就是上面的创建,session什么时候死?
session生,开浏览器访问网站一个有创建session的servlet代码!
session死,当session30分钟(可设置)没有使用,不与会话关闭相关!
--------------------------
*************************
上面讲了request容器,servletContext容器和session容器都可以带数据,怎么选择?
1:如果数据带过去后就不要了,就用request。
例如:用request带数据给servlet后,进行转发到jsp输出。
2:如果数据除了带给jsp显示用,还等下要用,就用session
例如:图片校验码,session带图片数据显示,等下还要与request也带的这个图片数据进行

校验
还有用户表单校验。用户提交的表单带上随机数,然后通过session发给servlet,之后还要

与request的数据进行校验,判断是否相同表单。
3:如果你要带的数据不仅自己要用,还有等会用,还要给别人用(如聊天室,说话还要给别

人看),就用servletContext
servletContext是共享的,在自己的WEB应用中(相当于一个WEB工程)谁都可以用!
——————————————————
****************
md5码:数据指纹(不同数据有不同指纹),数据摘要技术(很多人说它是加密,其实它只是得

到数据指纹,数据摘要)
应用:
校验数据完整性:如网银的插件,用将数据MD5码一下,看与提供的资源的MD5码是否相同!
保存密码:(服务端存的是用户密码md5码,反向破解需40亿年)
*****************
------------------------------

你可能感兴趣的:(WEB开发)