散分, 顺便问几个ssh中struts的问题。

java__ajax 2008-02-20 09:33:02
请问在struts框架下怎么对一个JSP页面进行一些特殊的初始化
比如有这么一个场景:有一个登陆页面,页面上有一个下拉选项是登陆的级别,而这个级别是从数据库中取出的,但是这个JSP页面是系统的index页面,还来不及调到后面的ActionBean,那怎么查数据库呢?难道还是象一般的JSP页面那样写一大堆JSP代码在页面上吗?那不是违背了struts的精神了吗?struts不就是为了不在页面上出现JAVA代码吗?
请问struts有没有提供什么方法解决这个问题? 我在网上找到这么几种方案,但还是不太明白。请大家帮我解答一下,谢谢

方法1:
在第一个页中,只做一个转发的功能,不显示任何内容,
在index.jsp中只有一句:
<logic:redirect href="home.do">
这种方法好像不行的,因为我的index页面会嵌入其他的页面,其他的页面也会有初始值的,初始数据是从数据提取的,用这种方法不是乱了吗 ?

方法2:
也可以在index.jsp中用数据库,通过自定义标签读取数据到Bean中。
这种方法没有用过,不知道怎么用,我的项目是架构是struts+spring+hibernate,如果可以用请大家说详细点,最好是有事例,

方法3:
在web.xml中定义一个<servlet>,设置其加载的优先级比action(即ActionServlet)高,在自定义的<servlet>中读入数据库内容到Bean中。
这种方法不知到怎么用,没有用过,请大家指教,

方法4:
听说可以用ajax,可ajax我也只简单的用,解决这个问题我不知道怎么做,请大家指教。

方法5:
用jsp脚本,就是我不想用jsp脚本去做,而且有违背struts的精神,当然我以前没有用struts时以前都是用这种方法做的。现在有用struts了就不想用jsp脚本去做。

大家有什么好的方法解决吗?知道那中方法就说那种,请大家详细介绍一下,谢谢,小弟不甚感激。
如果分不够我可以再加,我一次最多只能发100分贴。
...全文
146 16 打赏 收藏 举报
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yqh2009 2008-02-29
最简单是jsp写java代码

其次是在jsp页面中写个包含页面,就是<jsp:include page="xx.do"/>由包含页面去访问数据库

麻烦点是用ajax,其实ajax说穿了只是js 的异步.
下面是js代码


var req;
function GetInfo(url){
//url就是你要访问的servlet的路径了,action也行了,但是exectue方法中的返回函数必须是null,
//servlet要在jsp的out流中写出你要的数据,传给jsp页面

if(window.XMLHttpRequest){
req=new XMLHttpRequest();//创建XMLHTTPRequest对象
}
else if(window.ActiveXObject){ //浏览器版本判断
req=new ActiveXObject("Microsoft.XMLHTTP");
}
alert(url);
if(req){
req.open("GET",url,true); //建立请求
req.onreadystatechange=callback;//请求回调函数
req.send(null);
}
}


function callback(){

if(req.readyState==4){ //判断就绪状态
if(req.status==200){
parseMessage();//接收返回的数据
//更新网页的内容

}else {
alert("Not able to retrieve description "+req.statusText);
}
}
else {}

}

function obj(s){
try{ stringToXML_soap=new ActiveXObject("Microsoft.XMLDOM");
stringToXML_soap.async = false;
stringToXML_soap.loadXML(arguments[0]);
return stringToXML_soap.documentElement;
} catch(e) {
var soap=new DOMParser();
var stringToXML_soap=soap.parseFromString(arguments[0],"text/xml");
return stringToXML_soap;
}

}

function parseMessage(){

var xmldoc=obj(req.responseText); //获得返回的数据
//这里就由你自已来写了,用js读取数据后显示在下拉框中好了
}

然后在页面的
<body onBlur="GetInfo('servlet/xx')">
  • 打赏
  • 举报
回复
yuanyemars 2008-02-29
<tiles:insert page="/init.do?method=getUserType"/>
/init
ActionForward getUserType(){
//读取数据库(用户类别这种东西不可能改变平凡,服务器启动的时候,先初始化了放内存里面不好吗?),写入request
return 登陆页
}

登陆页
<html:select>
<html:options/>
</html:select>

大概就这样,没有脚本,而且这个登陆的东西随便放那里就行,只需要 <tiles:insert page="/init.do?method=getUserType"/>,还方便和其他的页面组装。。。
  • 打赏
  • 举报
回复
凤影 2008-02-27
偷偷摸摸再来接次分
  • 打赏
  • 举报
回复
java__ajax 2008-02-25
非常感谢各位的提议和帮助,我不太想用脚本去实现的,有好的技术为什么不用呢,我是想用ajax实现,可是我不太会,那位能帮帮我。
  • 打赏
  • 举报
回复
LutzMark 2008-02-25
jf

用脚本是最合适的解决方案
  • 打赏
  • 举报
回复
songhaichao1983 2008-02-25
有一个登陆页面,页面上有一个下拉选项是登陆的级别,而这个级别是从数据库中取出的,但是这个JSP页面是系统的index页面,还来不及调到后面的 ActionBean,那怎么查数据库呢?难道还是象一般的JSP页面那样写一大堆JSP代码在页面上吗?那不是违背了struts的精神了吗? struts不就是为了不在页面上出现JAVA代码吗?

我处理这种页面有三种方法:
1.先访问action,然后跳转到页面,就是这个页面之前先访问action。
2.可以在页面加一个onload事件,每次加载都会解析一个xml文件,但是这种方法,必须主要各种浏览器的兼容性。
3.用ajax技术,原理1没有太多区别,同样是onload事件,只不过是在打开页面的过程中执行了action,然后神不知鬼不觉的把数据拿出来。

1和3都有效率的问题,因为访问action会有时间延迟,2最好,你可以到网上搜搜应该很多类似的代码,不过2要考虑浏览器的兼容性也很麻烦
  • 打赏
  • 举报
回复
yzj520hyy 2008-02-22
方法1.如果你的index.jsp经常被引用,那当然不能改,但你可以改web.xml中,让欢迎页面指向另外一个jsp页面(在这个jsp重定向到你想访问的action).第一次访问的时候就是这个页面,然而以后你的其他链接还是指向index.jsp.没有影响到它.

方法2.3.5 不提倡,太笨了.

方法4.一般现用技术就是ajax.
你先做一个servlet,让它去查数据库并以一定的格式返回你想要的结果。然后在页面中用XHR去访问这个servlet并处理结果后用dom处理节点的方式添加到下拉列表框中.
  • 打赏
  • 举报
回复
guoqiangone 2008-02-21
up,我想lz发这贴的目的是想用更好的办法解决吧,学习好的办法吧,如果他想用jsp解决就不会到这里发贴了。
  • 打赏
  • 举报
回复
java__ajax 2008-02-20
up
  • 打赏
  • 举报
回复
java__ajax 2008-02-20
up
  • 打赏
  • 举报
回复
genii2008 2008-02-20
这个问题还是用用jsp脚本完成比较方便,技术是死的,人是活的.人不能被一泡尿给憋死
  • 打赏
  • 举报
回复
yuanjianbin 2008-02-20
4楼说得很对!
我觉得少量用JSP脚本就可以解决的简单问题就用JSP脚本就OK了。什么功能都用Struts也不合理。

从你的情况看,我觉得你的设计本身就有问题。index.jsp为什么要嵌入其他的页面呢?我们嵌入其它页面的jsp应该具有通用功能,但index.jsp只是一个登录的页面吧。如果index.jsp中有很多通用功能,为什么不把这些功能再分出来,写到另一个jsp中呢?

当然,确实要用Struts解决问题,还是有办法的

写一个html文件
内容是:
<HTML>
<HEAD>
<script language="javascript">
<!--
window.location = "login.do";
// -->
</script>
</HEAD>s
</HTML>

然后改下你的web.xml
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>

最后根据login.do去配置吧!
  • 打赏
  • 举报
回复
rakuu 2008-02-20
第一种方法是你这种情况下最常用的方法
  • 打赏
  • 举报
回复
凤影 2008-02-20
主要为了接分
  • 打赏
  • 举报
回复
tianyidan 2008-02-20
我觉得不要纯粹的因为Struts而struts;在不同的情况下,选择最合适、你最了解、最方便的方式实现你需要的效果。
如果某个效果用struts实现很困难,要绕很大一圈,而用其他的方法很简单;难道你就因为Struts提倡的某些精神而踏踏实实的吃亏?技术是“死”的,人是活的。
  • 打赏
  • 举报
回复
白云冰河 2008-02-20
只为散分二字而来,顺便帮楼主up,看楼主自己在那up、up的挺辛苦的
  • 打赏
  • 举报
回复
相关推荐
发帖
Java EE

6.7w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
帖子事件
创建了帖子
2008-02-20 09:33
社区公告
暂无公告