注册 登录
编程论坛 J2EE论坛

Struts中调用ActionForm的getxxx()方法的疑问

Grace_TT 发布于 2006-07-20 22:42, 2789 次点击
就是在Struts中,我想让一个jsp页面获得表单的一个参数,我就在这个jsp页面里用了useBean动作:<jsp:useBean id="sendform" class="com.aa.struts.form.SendForm" scope="session"></jsp:useBean>(SendForm是一个ActionForm);接下来我打算通过如下语句来获得表单提交的用户名和密码来进行验证:
if(user.equals(sendform.getName())&&userpass.equals(sendform.getPassword()))
out.println("<TR bgcolor=bgcolor><td colspan=2><a href=delete.jsp?id="+rs.getInt("id")+">删除本篇</a></td></TR>");

可是,删除本篇 这个链接并没有显示出来,

我现在不知道是我的想法本身就不正确,还是我写的代码错误 ,如果这种方法行不通,那我要如何才能让这个jsp页面获得表单提交的参数呢?

谢谢!!
42 回复
#2
神vLinux飘飘2006-07-21 05:53
思想是错的。
因为ActionForm的方向是从Web页面到Action,而你现在的想法是正好反过来。
如果你想让只有特定权限的人才能浏览到 删除本帖 这个信息,那么你大可把用户信息放到Session中,然后每次对session中的user进行验证,如果session中的user不空且为root或者是这个帖子的发帖者 那么就可以显示出来
#3
Grace_TT2006-07-21 06:29

成功了!,谢谢你!!!

[此贴子已经被作者于2006-7-21 6:53:02编辑过]

#4
Grace_TT2006-07-21 07:48
可是,现在又有了另外一个问题,就是如何让这个帖子的发帖者删除自己的留言呢?

因为在显示留言的页面successv.jsp中,删除本篇 这个链接是循环的,我如果在这里加上一个if判断,让登录用户删除留言的话,那他也具有管理员的权限了,

while(i<intPageSize && !rs.isAfterLast())
{
%>
<TR bgcolor="black">

<td width="30%"><NOBR><strong><font color=orange>留言时间:</font></strong></NOBR></td>
<td width="70%" ><font color=orange><%=rs.getString("m_date")%></font></td>
</TR>
<TR bgcolor="">
<td width="30%" ><NOBR><strong>姓名:</strong></NOBR></td>
<td width="70%"><%=rs.getString("name")%></td>
</tr>
<TR bgcolor="black">
<TD width="30%" ><NOBR><strong><font color=orange>标题</font></strong></NOBR></TD>
<td width="70%" ><font color=orange><%=rs.getString("title")%></font></td>
</TR>
<TR >
<TD width="30%" ><NOBR><strong>内容</strong></NOBR></TD>
<TD width="70%" ></TD>
</TR>
<TR bgcolor=white><TD width="70%" colspan=2 ><%=rs.getString("content")%></TD>
</TR>
<TR bgcolor=bgcolor><td colspan=2 width="91" height=30></td></TR>
<%
if(user.equals(request.getSession().getAttribute("user"))&& userpass.equals(request.getSession().getAttribute("pass")))
out.println("<TR bgcolor=bgcolor><td colspan=2><a href=delete.jsp?id="+rs.getInt("id")+">删除本篇</a></td></TR>");

rs.next();
i++;
}
}
%>

要怎么实现呢?
#5
神vLinux飘飘2006-07-21 07:53
你是鬼啊!!!!!!肯定是鬼!!!!!
#6
神vLinux飘飘2006-07-21 08:30
你是鬼,我很早就发现了,你不是鬼怎么那么晚睡觉那么早就起来了!!!!!

要解决你的问题,首先要从你的设计结构出发。
我不知道你的数据库中关于留言记录是怎么设定的。假设你的设计是这样:


用户表:USER
ID(用户编号) USERNAME(帐号-UNIQUE) PASSWORD(密码) TYPE(用户类型-有ROOT、USER和GUEST)


帖子表:MESSAGE
ID(帖子编号) TITLE(帖子标题) USER_ID(发帖者编号) CONTEXT(内容) DATE(日期)


评论表:COMMENT
ID(评论编号) MESSAGE_ID(帖子编号-表明这个评论是那个帖子的) USER_ID(发表评论的用户编号) CONTEXT(内容) DATE(日期)


好,现在我们开始编写程序
首先要定义USER类

public class User {
Integer id;
String username;
String password;
String type;
}

public class Root extends User{
}

public class Guest extends User{
}

public class Message {
Integer id;
String title;
Integer userId;
String context;
java.sql.Date date;
}

public class Comment {
Integer id;
Integer messageId;
Integer userId;
String context;
java.sql.Date date;
}

登录程序就不用再多说了,相信你也会写 ,但是关键的是如何把已经成功登录的用户信息保存到session中去。
比如说,我们有个用户成功登录了

在LoginAction类中:

//这里,UserDao就是操作数据库的相关类。这个叫DAO模式,对WEB+数据库编程非常有用,建议你去看看
User user = UserDao.get(loginForm().getUsername(),loginForm().getPassword());

//把成功登录的用户信息保存到session中的user属性去
if(user!=null) request.getSession().setAttribute("user",user);




下面再给出个ROOT成功登录的操作看看
User root = UserDao.get(loginForm().getUsername(),loginForm().getPassword(),loginForm().getUserType());
if(root!=null) request.getSession().setAttribute("user",root);

比较下,上面两个对登录用户进行验证的过程有什么区别。不求马上理解得了的。特别是DAO模式,DAO就是这类设计的核心思想和精华所在。这样,你在JSP中写那些难看的JAVA的时代结束了。
说真的,我还从来没有用过JAVABEAN....更加别说<%=%> 消除<%%>代码块最好用JSTL标签。




用户删除帖子操作。你不是在学STRUTS么。那么我们就应该把删除帖子、发表帖子这类的操作放入Action中去执行

在DeleteAction类中:
//在这里验证用户有无删除本帖子的权限

//通过帖子编号获取要删除的帖子
Message message = MessageDao.get(deleteMessageForm().getId());

//从session中获取用户权限信息
//首先是获取ROOT权限的信息,这里假设一个留言板只有一个管理员
User user = (User)request.getSession().getAttribute("user");
if( user.getType().equale("ROOT") || user.getId()==message.getUserId())//验证是否有权限删除帖子,管理员和发起这个帖子的人可以删除
//执行删除操作
MessageDao.delete(message.getId());




还有很多安全和实现的细节我还没说,等你先入门了再提。
不求你马上理解,慢慢品味吧。

[此贴子已经被作者于2006-7-21 8:33:15编辑过]

#7
千里冰封2006-07-21 13:09
楼上说话真的很可爱
#8
Grace_TT2006-07-21 21:29
呵呵,我又成功了!!

谢谢各位啦!!!
#9
Grace_TT2006-07-21 21:49
以下是引用神vLinux飘飘在2006-7-21 8:30:20的发言:
你是鬼,我很早就发现了,你不是鬼怎么那么晚睡觉那么早就起来了!!!!!

要解决你的问题,首先要从你的设计结构出发。
我不知道你的数据库中关于留言记录是怎么设定的。假设你的设计是这样:


用户表:USER
ID(用户编号) USERNAME(帐号-UNIQUE) PASSWORD(密码) TYPE(用户类型-有ROOT、USER和GUEST)


帖子表:MESSAGE
ID(帖子编号) TITLE(帖子标题) USER_ID(发帖者编号) CONTEXT(内容) DATE(日期)


评论表:COMMENT
ID(评论编号) MESSAGE_ID(帖子编号-表明这个评论是那个帖子的) USER_ID(发表评论的用户编号) CONTEXT(内容) DATE(日期)


好,现在我们开始编写程序
首先要定义USER类

public class User {
Integer id;
String username;
String password;
String type;
}

public class Root extends User{
}

public class Guest extends User{
}

public class Message {
Integer id;
String title;
Integer userId;
String context;
java.sql.Date date;
}

public class Comment {
Integer id;
Integer messageId;
Integer userId;
String context;
java.sql.Date date;
}

登录程序就不用再多说了,相信你也会写 ,但是关键的是如何把已经成功登录的用户信息保存到session中去。
比如说,我们有个用户成功登录了

在LoginAction类中:

//这里,UserDao就是操作数据库的相关类。这个叫DAO模式,对WEB+数据库编程非常有用,建议你去看看
User user = UserDao.get(loginForm().getUsername(),loginForm().getPassword());

//把成功登录的用户信息保存到session中的user属性去
if(user!=null) request.getSession().setAttribute("user",user);




下面再给出个ROOT成功登录的操作看看
User root = UserDao.get(loginForm().getUsername(),loginForm().getPassword(),loginForm().getUserType());
if(root!=null) request.getSession().setAttribute("user",root);

比较下,上面两个对登录用户进行验证的过程有什么区别。不求马上理解得了的。特别是DAO模式,DAO就是这类设计的核心思想和精华所在。这样,你在JSP中写那些难看的JAVA的时代结束了。
说真的,我还从来没有用过JAVABEAN....更加别说<%=%> 消除<%%>代码块最好用JSTL标签。




用户删除帖子操作。你不是在学STRUTS么。那么我们就应该把删除帖子、发表帖子这类的操作放入Action中去执行

在DeleteAction类中:
//在这里验证用户有无删除本帖子的权限

//通过帖子编号获取要删除的帖子
Message message = MessageDao.get(deleteMessageForm().getId());

//从session中获取用户权限信息
//首先是获取ROOT权限的信息,这里假设一个留言板只有一个管理员
User user = (User)request.getSession().getAttribute("user");
if( user.getType().equale("ROOT") || user.getId()==message.getUserId())//验证是否有权限删除帖子,管理员和发起这个帖子的人可以删除
//执行删除操作
MessageDao.delete(message.getId());




还有很多安全和实现的细节我还没说,等你先入门了再提。
不求你马上理解,慢慢品味吧。

我发现你挺伟大的!看了你写的这些话,我觉得我这个留言板根本就拿不出手去,根本都算不上是Struts了,基本就是JSP了,真是难过。。。

#10
Grace_TT2006-07-21 21:54

问一个问题,不要取笑我,就是 表单 跟 Action 是否是 一对一 的关系?是不是一个表单对应一个Action,一个Action 对应一个表单?

#11
神vLinux飘飘2006-07-21 22:39
不是,一个Action只能有一个表单,但是一个表单可以对应到多个Action

但是你调用是调用Action,Action确定了Action所对应的表单也就确定了,所以在一个WEB提交(submit)中,Action和Form是一对一的关系。
#12
Grace_TT2006-07-21 22:52
一个表单可以对应到多个Action
-----------------
既然 在一个WEB提交(submit)中,Action和Form是一对一的关系。
那么,一个表单怎么对应到多个Action呢?

在写语句的时候,不是 <html:form action="/send.do" method="post">

这里 action="/send.do" 它就只能对应一个Action呀,你说的 一个表单可以对应到多个Action 是什么意思呢?
#13
神vLinux飘飘2006-07-21 23:30
打个比方:
比如你要写个学生注册的系统,那么我们有学生类
public class Student {
    Integer id;
    String number;
    String name;
    String sex;
}

假设我们系统的功能有两个功能:
1.添加
2.修改

你会发现,这两个功能所提交的字段只有一个不一样,修改的要比添加的多提交一个id字段,而添加功能只要提交number,name,sex就好了。那么你打算怎么写ActionForm和Action呢?

如果你把两个功能各都写各自对应的Form --
public class UpdateStudentForm extends ActionForm{
    Integer id;
    String number;
    String name;
    String sex;
}

public class AddStudentForm extends ActionForm{
    String number;
    String name;
    String sex;
}

你会很无辜的发现,其实这两个根本就查不多一样。
这个时候,你就可以利用一个ActionForm可以对应到多个Action中去。

public class StudentForm extends ActionForm{
    Integer id;
    String number;
    String name;
    String sex;
}

&lt;action name="StudentForm" path="/UpdateStudentAction"/&gt;
&lt;action name="StudentForm" path="/AddStudentAction"/&gt;

看见了吧,我们就把StudentForm对应到多个Action中去了
#14
Grace_TT2006-07-22 06:31
<action name="StudentForm" path="/UpdateStudentAction"/>
<action name="StudentForm" path="/AddStudentAction"/>
---------------------------
这是在配置文件中要这么写,可是在jsp页面中要怎么写才能定义一个表单分别对应UpdateStudentAction和AddStudentAction 这两个Action呢?

就像这种:<html:form action="/send.do" method="post">

#15
神vLinux飘飘2006-07-22 08:07
不可能
#16
Grace_TT2006-07-22 08:57

那ActionServlet它不就是根据 action="/xxx.do" 到配置文件中去找Action的parth的吗,既然 不可能,那ActionServlet是如何确定此时应该调用哪个Action呢?


#17
神vLinux飘飘2006-07-22 09:21
通过配置文件呀

&lt;action name="StudentForm" path="/AddStudentAction"/&gt;
这样你就必须要调用 action = "AddStudentAction.do"

如果你的配置是
&lt;action name="StudentForm" path="/InsertStudent"/&gt;
那么你就要调用 action = "InsertStudent.do"

后面那.do是在你项目的web.xml中配置的,我就经常不用.do,用.asp来迷惑人家
#18
Grace_TT2006-07-22 13:52
那 action = "AddStudentAction.do"跟 action = "InsertStudent.do" 是写在哪里的,不是在jsp页面里吗?
#19
Grace_TT2006-07-22 13:55
我现在就琢磨不出来,这一个表单在jsp页面里要如何写代码才能实现到配置文件里去找相应的Action呢?
#20
神vLinux飘飘2006-07-22 14:08
action = "AddStudentAction.do" 是写在HTML里面的

一个表单是不能自己找到想去的Action的,而是由Action自己寻找自己需要的表单。
#21
Grace_TT2006-07-22 15:16
以下是引用神vLinux飘飘在2006-7-22 14:08:29的发言:
action = "AddStudentAction.do" 是写在HTML里面的

一个表单是不能自己找到想去的Action的,而是由Action自己寻找自己需要的表单。

action = "AddStudentAction.do"跟 action = "InsertStudent.do"可以写在同一个html里面?

#22
神vLinux飘飘2006-07-22 15:21
当然不可以
#23
神vLinux飘飘2006-07-22 15:22
准确来说,写在同一个HTML中是可以的,但是写在同一个FORM中就不可以了
#24
Grace_TT2006-07-22 18:31
写在同一个HTML中是可以的
-----------------------
这么写吗:<html:form action = "AddStudentAction.do" method="post">




<html:form action = "InsertStudent.do" method="post">

那不就等于这个html页面里有两个表单?
#25
神vLinux飘飘2006-07-22 19:20
一个HTML有两个表单很奇怪么?
#26
Grace_TT2006-07-23 09:49
可是我这个留言板就只有一个表单,我要如何实现让它在提交时,去调用不同的Action呢?
#27
神vLinux飘飘2006-07-23 10:12
你想实现什么功能以至于要調用两个不同的Action呢?
#28
Grace_TT2006-07-23 10:39
就是我想实现一个注册用户可以添加、删除、编辑留言。但是,我不知道编辑留言要怎么实现?
#29
神vLinux飘飘2006-07-23 10:41
那也不至于要用到两个不同的action啊
#30
Grace_TT2006-07-23 10:51

要让用户编辑他的留言,编辑好后,不是还是要通过提交表单来实现吗?

#31
神vLinux飘飘2006-07-23 11:28
是 啊 ,那也才1个表单1个action啊,那用2个那么多?
#32
Grace_TT2006-07-23 11:34
那编辑这个功能要怎么实现呢?给我提供个思路吧。

一个表单的话,要怎么把注册、登录、编辑全部实现呢?
#33
神vLinux飘飘2006-07-23 11:44
注册、登录、编辑怎么可能全放在一个form中呢?

&lt;html&gt;
    &lt;body&gt;
        登录
        &lt;form action="login"&gt;
            ....
        &lt;/form&gt;
        还没注册?
        &lt;form action="reg"&gt;
            ....
        &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;

只有注册后才能进入到回复或者编辑页面,就是说,登录、注册和编辑、回复是不 在同一个HTML页面的,更加不在同一个表单
#34
Grace_TT2006-07-23 12:57
你有没有这样的例子,提供一个给我,就是用到Struts的留言板或者论坛。
#35
神vLinux飘飘2006-07-23 16:54
留言板早丢了,论坛还没做出来
#36
Grace_TT2006-07-23 19:08
留言板早丢了,
-------怎么丢了呀,要不然我还可以学习学习,多好,呵呵。
#37
神vLinux飘飘2006-07-23 19:13
太简单了呀,用屁股都想得出来怎么弄
我现在抛弃STRUTS了,转看看SPRING MVC,这个WEB框架能和SPRING很好的集成,毕竟是SPRING的一部分嘛

对了,以后尽量不要用STRUTS的标签,JAVA的标签是有个标准的,JSTL,JSF和SPRING MVC等等著名的WEB框架都用它,一旦用了标准标签,那你的WEB程序就能顺便迁移到各个WEB框架了,而且能降低你的学习成本--学习标签虽然不用什么时间,但是毕竟也是要时间地
#38
Grace_TT2006-07-23 20:17
太简单了呀,用屁股都想得出来怎么弄
---------你拐着弯骂人哪!

嘿嘿,你再用“屁股”弄一个让我学习学习吧。
#39
Grace_TT2006-07-23 20:18

对了,以后尽量不要用STRUTS的标签,JAVA的标签是有个标准的,JSTL,JSF和SPRING MVC等等著名的WEB框架都用它,一旦用了标准标签,那你的WEB程序就能顺便迁移到各个WEB框架了,而且能降低你的学习成本--学习标签虽然不用什么时间,但是毕竟也是要时间地
-------------嗯,知道了。JSTL有专门的书吗?

[此贴子已经被作者于2006-7-23 20:19:20编辑过]

#40
神vLinux飘飘2006-07-23 20:34

没有,因为标签太简单了....不过有本JSP2.0技术手册里面有比较详细关于JSTL的介绍

#41
tonyjet2006-07-24 17:47
TT好象对struts-config.xml这类文件没兴趣 ???用了这些就不用想那么多了。。。
#42
Grace_TT2006-07-24 20:21
以下是引用tonyjet在2006-7-24 17:47:27的发言:
TT好象对struts-config.xml这类文件没兴趣 ???用了这些就不用想那么多了。。。

TT好象对struts-config.xml这类文件没兴趣 ???
------------------------------为什么这么说?

#43
神vLinux飘飘2006-07-24 20:33
struts-config是struts的灵魂
1