`

JAVA EE WebBasic

阅读更多

J2EE1.4_API.rar

http://www.iteye.com/topics/download/00ef37b9-3fd5-3ffa-8981-c259054a3e93

 

Lindows的博客文章 backup
查看目录

下载链接

http://lindows.iteye.com/blog/download_pdf/1163

 

 

 

reference:http://blog.163.com/ren_bozhou/blog/static/51689589200802474935458/

Information Technology
no commit...

http://www.seeitco.com


vo 值对象《====》to传输对象《====》pojo最根本的java对象
即:只包含get();set();方法的类

PO/POJO/BO/DTO/VO的区别
PO :persistent object持久对象
1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
2 .在hibernate持久化框架中与insert/delet操作密切相关。
3 .PO中不应该包含任何对数据库的操作。
---------------------------------------------------------
POJO :plain ordinary java object 无规则简单java对象
一个中间对象,可以转化为PO、DTO、VO。
1 .POJO持久化之后==〉PO
(在运行期,由Hibernate中的cglib动态把POJO转换为PO,PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支 持增量编译,增量调试。)
2 .POJO传输过程中==〉DTO
3 .POJO用作表示层==〉VO
PO 和VO都应该属于它。
----------------------------------------------------------
BO :business object 业务对象
封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。
关于BO主要有三种概念
1 、只包含业务对象的属性;
2 、只包含业务方法;
3 、两者都包含。
在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。
----------------------------------------------------------
VO :value object值对象 / view object表现层对象
1 .主要对应页面显示(web页面/swt、swing界面)的数据对象。
2 .可以和表对应,也可以不,这根据业务的需要。
注 :在struts中,用ActionForm做VO,需要做一个转换,因为PO是面向对象的,而ActionForm是和view对应的,要将几个PO要显示的属性合成一个ActionForm,可以使用BeanUtils的copy方法。
----------------------------------------------------------
D TO (TO) :Data Transfer Object数据传输对象
1 .用在需要跨进程或远程传输时,它不应该包含业务逻辑。
2 .比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO 内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。
----------------------------------------------------------
DAO :data access object数据访问对象
1 .主要用来封装对DB的访问(CRUD操作)。
2 .通过接收Business层的数据,把POJO持久化为PO。

 

 

 

J bpm了解表结构,然后就能使用hibernate进行操作。

 

 

Struts的工作流程:

S truts是一个遵循mvc模式的web框架,说白了他就是一个大大的serverlet这个servlet名字叫actionservlet,我们可以在web.xml文件里面把一组请求影射给这个sevlet,也就是影射给这个struts框架,当actionservlet接受到请求后,会把请求交给一个action去处理,每一个请求到底映射给那一个action,是通过找配置文件。 S truts-config.xml 其实这个文件的文件名和路径是可以配置的,      

   当他把请求交给action之前,会把请求参数封装成一个formbean,当效研有问题时就返回到原来的页面,当成功显示,用actionforward封装。

    支持国际化,也提供了相应的标签。剩下的是细节的应用。

千万不要把全局变量放在action中。整个对象被反复的调用,其值会被改变。

<html:form>显示自己action所指向的那个formbean对象的值。如果内存中不存在,则它new一个新的formbean.。

  和action所关联的域的对象在哪里呢,formbean默认是在session中。 J sp是从小的与到大的域去找。

 

 

S ession 里面不能存储用户的机密信息,因为session是不安全的是可以伪装的。

 

 

如何防止表单提交: 有两种方法:1 、当第一次处理给客户端送表单 ,首先用隐藏字段的形式安排一个唯一的号码 并自己保存一份;当提交时会把,表单提交给第二个action, 第二个action中的处理流程是:首先拿着请求中的 唯一号码,在内存中是否存在(session)。

 

2、saveToken(request).  S truts可以自动完成。

    I stokenvalidat() 

   resetToken

struts中有个 redirect属性,可以防止刷新。

 

 

面试题 有垃圾回收器 内存有没有 可能益处

 

我要在笔试题上进行扩展:传值 与 传引用,要说什么时候会用到传引用,如果想让方法返回多个对象,可以把这些对象作为引用传递进去,用作输出参数。另外,如果不是要返回结果,而是作为输入参数,要注意一些技巧:

F unc(map){  mapclone = map.clone(); mapclone  .. }

Func(map){  mapa = c  }

 

 

 

 

 

 


Session与Cookie的区别

http://chenyubo.iteye.com/blog/219775

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也 会失效。

服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。

可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。

Cookie是客户端的存储空间,由浏览器来维持。
在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中也有类似的情况,这时候我们通常会使用COOKIE来实现,例如如下的代码:
< % cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
doStuffForNewbie();
//没有访问过
}

else
{
doStuffForReturnVisitor(); //已经访问过了
}

% >


这是很浅显易懂的道理,检测COOKIE的存在,如果存在说明已经运行过写入COOKIE的代码了,然而运行以上的代码后,无论何时结果都是执行 doStuffForReturnVisitor(),通过控制面板-Internet选项-设置-察看文件却始终看不到生成的cookie文件,奇怪, 代码明明没有问题,不过既然有cookie,那就显示出来看看。
cookie[]cookies = request.getCookies();
if (cookies.lenght == 0 || cookies == null)
out.println("Has not visited this website");
}

else
{
for (int i = 0; i < cookie.length; i++)
{
out.println("cookie name:" + cookies[i].getName() + "cookie value:" +
cookie[i].getValue());
}
}


运行结果:
cookie name:JSESSIONID cookie value:KWJHUG6JJM65HS2K6

为什么会有cookie呢,大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客 户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器 端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为 JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但 是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到sessionid= KWJHUG6JJM65HS2K6之类的字符串。
明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如 session cookie安全了。
通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到 了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。
在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。


http://yueguc.iteye.com/blog/245449

在线用户列表 和 重复登陆

解决两个问题
1. 实现在线用户列表
2. 当用户在异地登录后,使前一次登录自动退出
实现方法
用户登录时,会创建一个session ,用于保存用户信息。将所有用户登录时的session 值与ID 存入ServletContext 中,显示在线列表的时候,就从ServletContext中取得用户登录的session值,从中取得用户信息。
1. 登录:
先从ServletContext 中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户之前已经登录过,移除前面一条记录。
再把此次登录的信息加入到ServletContext 中。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
3.过滤:
过滤所有页面,sesison失效后转向登录页面。但是要实现用户二次登录后强制先前的登录失效,需要在这里控制。
登录时存入的是session值和session ID,用户二次登录时移除了前线记录,存入的session值是相同的,但是ID却不同。
当第一次登录的页面请求的时候,在这里检查ServletContext中是否存在当前的session值与ID记录。如果没有就销毁这个session。

参考代码:
存放的时候有很多中方法,我选择的是将session 值与ID 先存入一个List ,在将这个List 存入另一个List ,再存到ServletContext 中。
代码仅供参考,有不合理的地方,希望大家给出意见。
============================1. 登录部分============================
//先从ServletContext中获得存放sessioninfo的List
List userlist = (List) this .servlet.getServletContext()
                         .getAttribute("userlist");
//如果是首个用户登录,sessionlist为空,new一个
if (userlist == null ) {
       userlist = new ArrayList();
    }
//遍历List
for (int i = 0; i < userlist.size(); i++) {
       List sessionInfoTemp = (List) userlist.get(i);
       //检查是否存在一个与当前session值相同,但是ID不同的记录
if (sessionInfoTemp.get(0).toString().equals(session.getAttribute("emp").toString())&& !(sessionInfoTemp.get(1).equals(session.getId()))) {
                         //如果存在,remove这一记录
                         userlist.remove(sessionInfoTemp);
              }
    }
// 把session值、ID 存入 sessioninfo
List sessioninfo = new ArrayList();
sessioninfo.add(session.getAttribute("emp"));
sessioninfo.add(session.getId());
//sessioninfo 存入 List
userlist.add(sessioninfo);
//List存入ServletContext
this .servlet.getServletContext().setAttribute("userlist", userlist);

============================2. 监听部分============================
public void sessionDestroyed(HttpSessionEvent arg0) {
       // TODO Auto-generated method stub
    HttpSession session = arg0.getSession();
    if (session.getAttribute("emp")!=null ){
    List list = (List)session.getServletContext().getAttribute("userlist");
    List userTemp = new ArrayList();
    userTemp.add(session.getAttribute("emp"));
    userTemp.add(session.getId());
    list.remove(userTemp);
    session.getServletContext().setAttribute("userlist", list);
    }
}

============================3. 过滤部分============================
public void doFilter(ServletRequest req, ServletResponse res,
           FilterChain chain) throws IOException, ServletException {

       HttpServletRequest request = (HttpServletRequest) req;
       HttpServletResponse response = (HttpServletResponse) res;
       HttpSession session = request.getSession();

       /**
* 同一用户二次登陆问题 用户请求的提交到这里,通过检查List总的记录销毁session
        */
       // 从ServletContext中取出List
List sessionlist = (List) session.getServletContext().getAttribute(
              "userlist");
       if (sessionlist == null ) {
           sessionlist = new ArrayList();
       }
       // 用于记录状态
       boolean temp = false ;
       Iterator it = sessionlist.iterator();
       while (it.hasNext()) {
           List sessioninfo = (List) it.next();

           /**
            * 判断: 如果sessioninfo中没有当前session的值与ID信息,则表明该用户已经第二次登陆了
            * 登陆的时候第一次登陆时候的信息被从List中移除了。
            */
           if (sessioninfo.get(0).toString().equals(
                  session.getAttribute("emp").toString())
                  && sessioninfo.get(1).equals(session.getId())) {
              // session值与当前ID匹配
              temp = true ;
           }
       }
       // 存在了第二次登陆,销毁session
        if (!temp) {
           session.invalidate();
       }

       String strSession = null ;
       try {
           strSession = session.getAttribute("emp").toString();
       } catch (Exception e) {
       }
       /**
        * 如果session为空,返回登陆页面
        */
       if (strSession == null ) {
           response.setCharacterEncoding("gb2312");
           response
                  .getOutputStream()    .print("<script>window.top.location.href='/index.jsp'; alert('超时或账号在其它地方登录,请重新登录!');</script>");
       } else {
           chain.doFilter(req, res);
       }
    }

 

----------------------end------------------------------------

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics