MVC(如struts)如何解决多个用户操作在同一个页面进行的问题?

wbw88 2003-10-21 11:22:18
我老觉得MVC(如struts)不好解决多个用户操作在同一个页面进行的问题,因为MVC老是把每一个用户操作映射到一个Action,然后再转向一另个页面(虽然可以是同一个页面)。
...全文
70 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kui 2003-11-26
  • 打赏
  • 举报
回复
lykAction文件:用于实现分页、记录删除、编辑、更新、连接等功能
-----------------------------------------------
package OST;

import OST.jdbc.util.ConnectionPool;
import OST.lykDAO;

import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.ModuleException;
import org.apache.struts.util.MessageResources;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;

public final class lykAction extends Action
{
// 变量定义:
private Log log = LogFactory.getLog("org.apache.struts.webapp.Example");

private ConnectionPool pool;

public lykAction() {
pool = ConnectionPool.getInstance();
}


//函数定义:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception
{
// Extract attributes and parameters we will need
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
HttpSession session = request.getSession();
lykForm m_lykForm = (lykForm) form;

Connection con = null;

try
{
con = pool.getConnection();
lykDAO m_lykDAO = new lykDAO(con);

String action=request.getParameter("action");

if(action==null)action="find";

if(action.equals("delete"))
{
String expression=request.getParameter("expression");
m_lykDAO.removeID(expression);
}
////////////
if(action.equals("update"))
{
String expression=request.getParameter("expression");
lyk m_lyk= new lyk();
//<update>
m_lyk.setUser_id(m_lykForm.getUser_id());
m_lyk.setPassword(m_lykForm.getPassword());
m_lyk.setName(m_lykForm.getName());
m_lyk.setDescription(m_lykForm.getDescription());
m_lyk.setWeb_site(m_lykForm.getWeb_site());
m_lyk.setAddress(m_lykForm.getAddress());
//</update>

m_lykDAO.update(m_lyk,expression);
}
///////////////
//<sqlstr>
String sql="SELECT * FROM dbo.attraction";
//</sqlstr>
Collection col = m_lykDAO.findSQL(sql);
request.setAttribute("lyk",col);

//<分页>
m_lykForm.setRowCount(col.size());
m_lykForm.setLength(5);//设置每页显示记录数

String page=request.getParameter("page");
int ipage;
try
{
ipage=java.lang.Integer.parseInt(page,10);
}
catch (Exception e)
{
ipage=m_lykForm.getPage();
}
m_lykForm.setPage(ipage);
m_lykForm.setOffset(ipage*m_lykForm.getLength());
m_lykForm.setPageCount(m_lykForm.getRowCount()/m_lykForm.getLength()+1);

String strPage="";

strPage+="共";
strPage+=String.valueOf(m_lykForm.getRowCount());
strPage+="条记录,共";
strPage+=String.valueOf(m_lykForm.getPageCount());
strPage+="页,当前是第";
strPage+=String.valueOf(ipage+1);
strPage+="页, ";

int istart,iend;
istart=ipage-5;
if(istart<0) {istart=0;}
iend=istart+10;
if(iend>m_lykForm.getPageCount()) {iend=m_lykForm.getPageCount();}
istart=iend-10;
if(istart<0) {istart=0;}
for(int i=istart;i<iend;i++)
{
strPage+="<a href='lykAction.do?action=find&page=";
strPage+=String.valueOf(i);
strPage+="'>";
strPage+=String.valueOf(i+1);
strPage+="</a>";
strPage+=" ";
}

m_lykForm.setMybeanvariable1(strPage);
m_lykForm.setAction(action);
request.setAttribute("lykForm",m_lykForm);
//</分页>

return mapping.findForward("success");
}
catch (SQLException e)
{
e.printStackTrace();
throw new RuntimeException("Unable to get connection.");
}
finally
{
try
{
if (con != null)
con.close();
}
catch (SQLException e)
{
throw new RuntimeException(e.getMessage());
}
}

}

}
---------------------------------------------------
上面也可以加上查询条件。从if(action.equals("delete"))和if(action.equals("update"))等句子看出,可以把action当作事件类型,这样就可以实现ASP.NET中的事件驱动了。
kui 2003-11-26
  • 打赏
  • 举报
回复
关于“先显示一个表单给用户填写查找条件,写完后用户点“查找”。然后就在下面显示查找的结果(是一个表格),当用户点表格里的每一条记录时,就会在表格右面显示该记录的详细信息。然后当用户点“修改”时,用户可以修改该详细内容。”的问题:
在Struts中用一个Action和一个JSP实现这些功能是完全可以的。在JSPStudio中通过数据库文件向导自动产生的文件就实现了上述功能,当然,手工编写代码也行。
下面我给出一个logic:iterate 标签在数据库查询表格显示结果的实例,包含了分页、删除、编辑、更新、连接功能。所有代码由JSPStudio自动产生,JSPStudio下载地址ftp://162.105.80.43/incoming/

包含分页、连接、删除、更新功能的软件表格文件lykOUT.jsp内容如下:
--------------
<%@ page contentType="text/html;charset=GB2312" language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html:html>
<head>
<title></title>
<html:base/>
</head>
<body bgcolor="white">
<table cellPadding=2 width="80%" border=2>
<tr>
<td><span CONTENTEDITABLE=true>user_id</span></td>
<td><span CONTENTEDITABLE=true>password</span></td>
<td><span CONTENTEDITABLE=true>name</span></td>
<td><span CONTENTEDITABLE=true>description</span></td>
<td><span CONTENTEDITABLE=true>web_site</span></td>
<td><span CONTENTEDITABLE=true>address</span></td>
<td><span CONTENTEDITABLE=true>删除</span></td>
<td><span CONTENTEDITABLE=true>编辑</span></td>
<td><span CONTENTEDITABLE=true>链接</span></td>

</tr>
<bean:define property='offset' name='lykForm' id='offset' />
<bean:define property='length' name='lykForm' id='length' />
<logic:iterate name='lyk' id='lyk' type='OST.lyk' scope='request' offset='<%= String.valueOf(offset) %>' length='<%= String.valueOf(length) %>'>
<logic:notEqual name='lykForm' property='action' value='edit'>
<tr>
<td><bean:write name='lyk' property='user_id' /></td>
<td><bean:write name='lyk' property='password' /></td>
<td><bean:write name='lyk' property='name' /></td>
<td><bean:write name='lyk' property='description' /></td>
<td><bean:write name='lyk' property='web_site' /></td>
<td><bean:write name='lyk' property='address' /></td>
<td><a href="lykAction.do?action=delete&expression=<bean:write name='lyk' property='user_id' />">删除</a></td>
<td><a href="lykAction.do?action=edit&expression=<bean:write name='lyk' property='user_id' />">编辑</a></td>
<td><a href="lykAction.do?action=link&expression=<bean:write name='lyk' property='user_id' />">链接</a></td>

</tr>
</logic:notEqual>
<logic:equal name='lykForm' property='action' value='edit'>
<tr>
<form method='post' name='lykForm' action="/OST/lykAction.do?action=update&expression=<bean:write name='lyk' property='user_id' />">
<td><html:text name='lyk' property='user_id' /></td>
<td><html:text name='lyk' property='password' /></td>
<td><html:text name='lyk' property='name' /></td>
<td><html:text name='lyk' property='description' /></td>
<td><html:text name='lyk' property='web_site' /></td>
<td><html:text name='lyk' property='address' /></td>
<td><a href="lykAction.do?action=delete&expression=<bean:write name='lyk' property='user_id' />">删除</a></td>
<td><html:submit value='更新'></html:submit></form ><html:form method='post' action='/lykAction.do?action=reset'><html:submit value='取消'></html:submit>
</html:form ></td>
<td><a href="lykAction.do?action=link&expression=<bean:write name='lyk' property='user_id' />">链接</a></td>

</tr>
</logic:equal>
</logic:iterate>

<tr><td align=middle colSpan=10 ><bean:write property='mybeanvariable1' name='lykForm' filter='false' /></td></tr>

</tr>
</table>
</body>
</html:html>
--------------------------------------------------------------------------
其中在“<logic:iterate name='lyk' id='lyk' type='OST.lyk' scope='request' offset='<%= String.valueOf(offset) %>' length='<%= String.valueOf(length) %>'>”中,offset代表本页开始显示的记录,length代码本页显示的记录条数。
<logic:notEqual name='lykForm' property='action' value='edit'> 表示非常编辑时执行下面的代码。
<logic:equal name='lykForm' property='action' value='edit'> 表示编辑时执行下面的代码。
<a href="lykAction.do?action=link&expression=<bean:write name='lyk' property='user_id' />">是显示分页及相应连接的内容。

------------------------------------------------
上面没有包含查询在内,但只要在前面加一个<form>标签作查询就行了。


wbw88 2003-11-25
  • 打赏
  • 举报
回复
to jaxe(浩毛) :
to zhouyiqing(玉樹臨風)

LookupDispatchAction 是什么东西呀,有没有这方面的资料呀
jaxe 2003-11-07
  • 打赏
  • 举报
回复
用LookupDispatchAction就解决了。
kathir 2003-11-06
  • 打赏
  • 举报
回复
你的查询结果显示在表格里,这些字段应该有一个能标示这条纪录的唯一标示符,比如编号等。当你点击表格时,应该有个函数记住你点击那一行,然后你再在<script>里,写一个函数, if(t1.rows.length==1)//t1是你点击的表格id
{
alert("没有个人信息!")
return
}
if(isNaN(hrowsel.value))//hrowsel一个隐藏文本框,记住上一个函数里的你点击的具体行
{
alert("请选择要查看的个人信息!")
return
}

if(hrowsel.value==""||hrowsel.value==" "||hrowsel.value==null)
{
alert("请选择要查看的个人信息!")
return
}
var curRow=hrowsel.value
ycode=t1.childNodes(0).childNodes(curRow).childNodes(2).innerText
根据所得的ycode,你可以从数据库里选出对应的信息显示在右边的列表里

zhouyiqing 2003-10-29
  • 打赏
  • 举报
回复
看看這個LookupDispatchAction,是個好東西!
Leemaasn 2003-10-22
  • 打赏
  • 举报
回复
一般是做成脚本+session
whyxx 2003-10-22
  • 打赏
  • 举报
回复
这种东西没什么问题啊,用一个action处理所有操作(用一个hidden变量来判断用户是何种操作)和用N个action每个处理一种操作有什么不同吗,一个麻烦但结构清晰,一个简单但处理有点像batch,
VVV_lucky 2003-10-22
  • 打赏
  • 举报
回复
一个操作对应一个action.
麻烦但是清晰。

至于你说的,确实需要转页面呀,这是B/S的东西,只要需要和服务器交换信息就要刷画面。不过有的可以做成脚本。
wbw88 2003-10-22
  • 打赏
  • 举报
回复
关键是为了方便用户操作,所有这些操作都要放在同一个页面。
软猫克鲁 2003-10-22
  • 打赏
  • 举报
回复
我想,你可以单独用一个Action来处理“查找”之类的响应。也许……
wbw88 2003-10-21
  • 打赏
  • 举报
回复
如:我需要在一个页面进行下面查询操作:

先显示一个表单给用户填写查找条件,写完后用户点“查找”。然后就在下面显示查找的结果(是一个表格),当用户点表格里的每一条记录时,就会在表格右面显示该记录的详细信息。然后当用户点“修改”时,用户可以修改该详细内容。

不知大家是怎么解决这类问题的。
wbw88 2003-10-21
  • 打赏
  • 举报
回复
如果用MVC结构,就会在不同的页面转来转去,

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧