SkyHome DEMO//学习Struts等而做的系统,欢迎指正

03-04-26 anonymous

SkyHome is a web system base on MVC and developed with
a simple and similar Struts framework.It developed for learn
J2EE,Patterns and other things like XP and PSP etc.

去年刚毕业时想着学点什么,于是从JSP入手看J2EE,光看不练没什么用,
正好想着把原来的网站改改,于是就开始了skyinn的计划,由于自己懒惰等
中途一直搁浅,直到11月底才又重新开始。由于自己原来基本什么都不懂,
所以边学边用的进度一直很慢,写了近半年才有了现在的这个样子,虽然可以
用了,但还有N多地方需要改进,甚而还有很多纰漏,执行速度也不是很理想,
汗颜的很!

一开始模仿雷霆论坛,看懂一点写一点,花了很长时间,后来接触了
Struts,就花了点工夫研究了下,想多写很多了,全部放弃换Struts再做有
点不甘心,而且觉的用Struts做个简单的网站也没都大意思,能学到的技术
也并不是很多,于是想着干脆再将Struts里的好东西拿来为我所用什么的,即
可以对Struts有更深入的学习,又不用全部推翻原来的东西,何乐而不为呢?
于是在过年后不久开始一点点的应用起来,其实也不过是简化了Struts中的某
几个类来用而已,而到现在则越来越Struts了:)所以当看到和Struts很像或
一样的代码时别犯疑惑:怎么这么熟悉:P

半年多来,基本上把所有的业余时间都花在这上了,虽然学了不少,但正
如前人所说:学的越多不知道的也越多。换句话叫终于知道自己不知道了。也
终于能静下心来学习了,只是感到时间老是不够用。

独学而无友,则孤陋而寡闻。共享之,如班门弄斧,贻笑大方了。不足之
处尚请谅解,更希望能将错误、意见、建议等告诉我,欢迎一起讨论交流:)




网站:http://www.skyinn.org
源码及工程文档:http://www.skyinn.org/project/index.jsp
邮件:webmaster@skyinn.org

banq
2003-04-28 16:03

非常不错的网站,我已经在首页和你做了友情连接。

看来你的struts使用是有一定的经验,顺便问一个困扰我的问题:比如:当用户发言时,他因为没有登陆故后台推出一个login的页面,当用户输入用户名和口令进入后可继续到发言的页面。这个流程机制有很多实现方式,我想知道你的方式,可否相告?

anonymous
2003-04-29 01:28

板桥的话让偶极度汗颜~~~呵呵

我现在的做法使这样的:
1:在AuthorizationFilter中判断是否已经登陆,
若没有,则记下此时的requestURI和所有参数(很奇怪,用request的getParamSet()再转回来就不对了,不知道那里错了,现在改成用hashtable了),把这些存到session中(放到request中不成,放到ServletContext中也有问题,还是用session好处理点)

2:然后再登陆处理的LoginAction中,当用户登陆成功后
取出session中的这些参数组合成请求串
用此请求串向web服务器请求(我用request的setAttinbute()等方法都不成功,没办法只有把所有参数连在URI后面了,不知道还有什么办法的没,哪位高手知道给指点下:)
即已实现


但这样做有很多弊病,
如所有参数都连在URI后面了,所以当参数值超大的话肯定要出错,这是目前这种方法的最大隐患:(

下面是部分程序片段,因为是刚写的,所以我网站里的源码中没有这个

AuthorizationFilter部分:

if(passed(servletRequest))
filterChain.doFilter(servletRequest, servletResponse);
else{//否则则重定向到错误页
//get request & response
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(true);
//ServletContext sc = filterConfig.getServletContext();
//存请求路径
if(null == session.getAttribute(GlobalParams.REQUEST_PATH_KEY)){
final String requestPath = request.getRequestURI();
session.setAttribute(GlobalParams.REQUEST_PATH_KEY, requestPath);
}
//存请求参数
if(null == session.getAttribute(GlobalParams.PARAM_MAP_KEY)){
final Enumeration paramNames = request.getParameterNames();
final Hashtable hash = new Hashtable();
Object key = null;
//逐个添加
while(paramNames.hasMoreElements()){
key = paramNames.nextElement();
hash.put(key, request.getParameter(key.toString()));
}
session.setAttribute(GlobalParams.PARAM_MAP_KEY, hash);
}
final String loginPage = this.filterConfig.getInitParameter(
"LOGIN_PAGE");
//重定向
filterConfig.getServletContext().getRequestDispatcher(loginPage).forward(request, response);


/*//error infomation
final ErrorBean errorBean = new ErrorBean("ERROR.AUTHORIZATION.NOT_ALLOW_ACCESS");
//set to request
request.setAttribute(ErrorBean.ERRORBEAN_KEY,errorBean);
final String errorPage;
//get error page
errorPage = this.filterConfig.getInitParameter("ERROR_PAGE");
filterConfig.getServletContext().getRequestDispatcher(errorPage).forward(request, response);*/

}
//end if ... else...



LoginAction部分:

//检查通过,loginBean置入session
HttpSession session = request.getSession(true);
session.setAttribute(LoginBean.LOGINBEAN_KEY, loginBean);
//final ServletContext sc = session.getServletContext();
//登陆之前的URL
StringBuffer requestPath = new StringBuffer();
requestPath.append(session.getAttribute(GlobalParams.REQUEST_PATH_KEY));
/
/*************must
session.setAttribute(GlobalParams.REQUEST_PATH_KEY, null);
log.debug("requestPath:" + requestPath);
//参数
final Object obj = session.getAttribute(GlobalParams.PARAM_MAP_KEY);
//*************must
session.setAttribute(GlobalParams.PARAM_MAP_KEY, null);
final Hashtable hash = (Hashtable) obj;
//参数名集合
final Enumeration paramNames = hash.keys();
final StringBuffer strParams = new StringBuffer();
//逐个添加参数
Object key = null;
while(paramNames.hasMoreElements()){
key = paramNames.nextElement();
request.setAttribute(key.toString(), hash.get(key));
//log.debug(key + ":" + hash.get(key));
//such as ForumID=0&PageNo=1&
strParams.append(key).append("=").append(hash.get(key)).append("&");
//request.setAttribute(key.toString(),hash.get(key));
}
//去掉最后的"&"
if(0 < strParams.length()){
strParams.substring(0, strParams.length() - 2);
}
//连接such as:http://www.skyinn.org/Forum.do?ForumID=0&PageNo=1
requestPath.append("?").append(strParams);
if(0 < requestPath.length()){
result = new ActionResult(ActionResult.SUCCESS, requestPath.toString(), true);
} else{
result = mapping.getResult(ActionResult.SUCCESS);
}



再想想别的办法了,这个总不如意...
and 谢谢你的连接:)

anonymous
2003-04-29 01:30

倒~~~~
早知道预览下了:P

banq
2003-04-29 08:45

不错,你和我想到一块儿去了,我也曾经这样作过,但是总觉得不是很好,特别是参数很长时。

我看有些开放源码如liferay也采取类似这么做法,将下个页面和参数附在form action后传入,然后使用一个forward.jsp来处理跳转,这个办法与Struts原则不容,更不是好办法。

ofbiz也是直接将参数附在login.jsp的action后面。

好像是没有更好的方法了。

3Go 1 2 3 下一页