站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题此贴想发久矣(真希望高手们快来回我帖啊,拜托)关于struts mvc

此贴想发久矣(真希望高手们快来回我帖啊,拜托)关于struts mvc

摘要: 此贴想发久矣(真希望高手们快来回我帖啊,拜托)关于struts mvc


小弟我用的jbuilder2005,花血本买了本<<精通struts:基于mvc的java...>>的书,看了有十来天可还是一团雾水.(一.先还是说一下我的web mvc2的理解:我是用1个userbean来写set/get数据库表的一些列,用1个managerbean来实现一些方法(拿登录页来说:里面哈有boolean型方法,userbean对象方法,list方法等),再用1个servlet来获取login.jsp页面里面的值(这里我说下我的数据库连接池是用的一个listenerservlet<它里面的datasource实行了application的封装>)也实行了ds的获取,调用managerbean,以及判断一些值实行返回页面.在页面返回上我是这样返回的:
if (judgePwd == false)
{
String target = "errorOfPassword.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(target);
dispatcher.forward(request, response);
(二.我对于struts mvc的理解存在如下一些问题:
1.认为actionform应相当于上面的userbean(当然它多了个validate()方法).但是我的那个managerbean该用什么来代替呢?(有人跟我说managerbean还是这样用,是不是这样呢?)
2.关键是在action里面怎么返回页面,比如说:我建了login.jsp,errorusername.jsp,errorpassword.jsp,successlogin.jsp
下面是我的loginaction.java的一部分代码:
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
{
loginActionForm loginActionForm = (loginActionForm) actionForm;
String userName = (String)loginActionForm.getUserName();//这里获取login.jsp里面的用户名是否是这样?
String password = loginActionForm.getPassword().toString();//同上

boolean judgeName;
boolean judgePwd;
try
{
ds = (DataSource)servlet.getServletContext().getAttribute("ds");//这句是我写的一listenerservlet.java(它是用来连接数据库连接池的)
con = ds.getConnection();
mlb.setConnection(con);
judgeName = mlb.judgeUserName(userName);//judgename是用来判断用户名是否输入正确
if(judgeName == false)
{
(这里面怎么写啊)
}
      ......
(三.就是action与action之间又是怎么来关联?


你的managerbean有点actionservlet的功能但不全是。
action中的返回是返回的通过actionMapping查找到的ActionForward对象,不是直接转向一个url。在struts中的所有控制都是在actionservlet中做的,这部分是封装好的,不必使用者管。
action和action在struts里可以说是没有任何关系的,除非你自己把它们关联起来

简单来说struts就是通过它的actionservlet(就是在web.xml里配的那个servlet)把页面提交的数据封装成formbean然后交给action处理,action处理后返回一个ActionForward对象,此对象中有url信息,actionservlet通过此ActionForward对象中的url信息转到返回页面
这些信息都是在你的struts-config.xml里配的

网上搜一下,再多找几个例子做一下就明白了


谢谢楼上兄弟,本人正在消化中


赞扬一下:楼主是一个描述问题比较明白的人


还真谢谢yaray兄,小弟我受之有愧哦


我也才学struts20天,我觉得它主要是把mvc给规范化了,M的jsp就用各种标签来实现,不透露任何的逻辑代码,V主要由action来实现,其中action与action的交互由struts-config中的forward来实现,我觉得主要要用struts-config来实现控制是struts的精华,新手愚见,希望大家指正。


谢谢,受意非浅,(希望高手们连系jb给点实例最好)


晕,例子,网上一搜一大把,别告诉我你不会搜啊,哈哈


M: model:ActionForm / Data Object(使用后者属于非推荐用法)
V: view: JSP
C: controller: Struts's ActionServlet
SL: simple Logic: 自定义的Struts Action
BL: Business Logic:此部分可能由于未严格分层而被置于struts的Action中
T: transaction: 事物处理(手动处理/框架处理[如:Spring]/容器处理[如:EJB],等)
DAO: Data Access Operation:数据访问/操作(自定义DAO/持久性框架[如:Hibernate],等)


return mapping.findforward("");
跳转至页面和其他action都可以用这个,这是标准用法啊,书里有写的。。。。。。。。。



先忠心感谢各位大哥,小弟我正在消化中


mark!


各位高手大哥好,请你们继续指点一下:
我看了各位的回复,好是思考了一下,然后就动手弄了一下,可出现了这样的情况:
(一.先是这样,运行后(路径:http://localhost:8083/testProject/login/login.jsp)但是没出现什么东西(login.jsp页面如下:
<%@ page contentType="text/html; charset=GBK" %>
<%@ 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" %>

<head>
<br/>login<br/>
</head>
<body bgcolor="#ffffff">


欢迎登录




<form action="/testProject/loginAction.do">
<table align="center" border="0">
<tr>
<td align="right">
用户名
</td>
<td align="left">


</td>
</tr>
<tr>
<td align="right">
密 码
</td>
<td align="left">
<input type="password" name="password" />//由于此处的password标签不明白用什么,所以就没用标签了

</td>
</tr>
</table>

<input type="submit" name="Submit" value="提交"/>
<input type="reset" name="Reset" value="清除"/>

</form>
</body>


(二.服务器的提示信息是:E:/Jb2005/jdk1.4/bin/javaw -classpath "E:/Jb2005/thirdparty/jakarta-tomcat-5.0.27/bin/bootstrap.jar;E:/Jb2005/jdk1.4/lib/tools.jar" "-Dcatalina.home=E:/Jb2005/thirdparty/jakarta-tomcat-5.0.27" -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9c8e7df2fd37415:1734,suspend=y org.apache.catalina.startup.Bootstrap -config E:/java/testProject/Tomcat/conf/server8083.xml start
2006-9-7 15:52:28 org.apache.coyote.http11.Http11Protocol init

信息: Initializing Coyote HTTP/1.1 on http-8083

2006-9-7 15:52:29 org.apache.catalina.startup.Catalina load

信息: Initialization processed in 8360 ms

2006-9-7 15:52:29 org.apache.catalina.core.StandardService start

信息: Starting service Catalina

2006-9-7 15:52:29 org.apache.catalina.core.StandardEngine start

信息: Starting Servlet Engine: Apache Tomcat/5.0.27

2006-9-7 15:52:29 org.apache.catalina.core.StandardHost start

信息: XML validation disabled

2006-9-7 15:52:35 org.apache.struts.util.PropertyMessageResources

信息: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true

2006-9-7 15:52:35 org.apache.struts.util.PropertyMessageResources

信息: Initializing, config='org.apache.struts.action.ActionResources', returnNull=true

2006-9-7 15:52:37 org.apache.struts.util.PropertyMessageResources

信息: Initializing, config='ApplicationResources', returnNull=true

2006-9-7 15:52:38 org.apache.catalina.core.StandardHost getDeployer

信息: Create Host deployer for direct deployment ( non-jmx )

2006-9-7 15:52:38 org.apache.coyote.http11.Http11Protocol start

信息: Starting Coyote HTTP/1.1 on http-8083

2006-9-7 15:52:39 org.apache.catalina.startup.Catalina start

信息: Server startup in 10000 ms

应是没错吧(想是想把所有代码都帖出来,就是怕各位看着多了就不想看而不帮我解答哦)


有人能帮我说说是为什么吗?jb没提示哪里错,所以我无从下手了啊,如果需要我把所有代码帖出来,我可以马上帖啊,请各位给我说说啊


能不能把整个代码贴出来看看?


多谢,下面就是我的代码:
(1.struts-config.xml:
<?xml version="1.0" encoding="UTF-8"?>
struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

/**
*下面的在我程序里面其实没用它,我用servser8083.xml代替了(不知道有没有问题)
*
/*












<form-beans>
<form-bean name="loginActionForm" type="roject.login.actionForm.loginActionForm" />
</form-beans>









(2.loginActionForm.java:
package roject.login.actionForm;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionMessage;

public class loginActionForm extends ActionForm {
private String password;
private String userName;
private int role;
private int id;

public void setRole(int role)
{
this.role = role;
}

public int getRole()
{
return role;
}

public int getId()
{
return id;
}

public void setId(int id)
{
this.id = id;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String getUserName() {
return userName;
}

public ActionErrors validate(ActionMapping actionMapping,
HttpServletRequest httpServletRequest) {
ActionErrors errors = new ActionErrors();
if(userName == null || userName.length() < 1)
{
errors.add("userName",new ActionMessage("用户名不能为空!"));
}
else
{
if(password == null)
{
errors.add("password",new ActionMessage("密码不能为空!"));
}
}
/** @todo: finish this method, this is just the skeleton.*/
return errors;
}

public void reset(ActionMapping actionMapping,
HttpServletRequest servletRequest) {
password = null;
userName = null;
}
}

(3.managerLoginBean.java
package roject.login.loginbean;

import java.sql.*;
import roject.login.actionForm.loginActionForm;

public class managerLoginBean {
private Connection con = null;
private ResultSet rs = null;
private PreparedStatement pstmt = null;
private Statement stmt = null;

loginActionForm laf = null;

public managerLoginBean() {
}

public void setConnection(Connection con)
{
this.con = con;
}
/**
*下面方法是判断用户名
/*
public boolean judgeUserName(String userName)
{
boolean judgeName = false;
try
{
String sql = "SELECT * FROM Z_USER WHERE USERNAME = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1,userName);
rs = pstmt.executeQuery();
while(rs.next())
{
laf = new loginActionForm();
laf.setUserName(rs.getString("userName"));
judgeName = true;
}
}
catch (SQLException se)
{
se.printStackTrace();
}
finally
{
try
{
if (rs != null)
{
rs.close();
}
}
catch (Exception ex2)
{
ex2.printStackTrace();
}
try
{
if (pstmt != null)
{
pstmt.close();
}
}
catch (Exception ex3)
{
ex3.getStackTrace();
}
}
return judgeName;
}
/**
*下面方法是判断密码
/*
public boolean judgePassword(String userName,String password)
{
boolean judgePwd = false;
try
{
String sql = "SELECT * FROM Z_USER WHERE USERNAME = ? AND USERPASSWORD = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1,userName);
pstmt.setString(2,password);
rs = pstmt.executeQuery();
while(rs.next())
{
laf = new loginActionForm();
laf.setPassword(rs.getString("password"));
laf.setUserName(rs.getString("userName"));
judgePwd = true;
}
}
catch (SQLException se)
{
se.printStackTrace();
}
finally
{
try
{
if (rs != null)
{
rs.close();
}
}
catch (Exception ex2)
{
ex2.printStackTrace();
}
try
{
if (pstmt != null)
{
pstmt.close();
}
}
catch (Exception ex3)
{
ex3.getStackTrace();
}
}
return judgePwd;
}

public loginActionForm getRole(String userName,String password)
{
try
{
String sql = "SELECT * FROM Z_USER WHERE USERNAME = ? AND USERPASSWORD = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1,userName);
pstmt.setString(2,password);
rs = pstmt.executeQuery();
while(rs.next())
{
laf = new loginActionForm();
laf.setUserName(rs.getString("userName"));
laf.setRole(rs.getInt("role"));
}
}
catch (SQLException se)
{
se.printStackTrace();
}
finally
{
try
{
if (rs != null)
{
rs.close();
}
}
catch (Exception ex2)
{
ex2.printStackTrace();
}
try
{
if (pstmt != null)
{
pstmt.close();
}
if(con != null)
{
con.close();
}
}
catch (Exception ex3)
{
ex3.getStackTrace();
}
}
return laf;
}
}



(4.loginAction.java
package roject.login.action;

import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import roject.login.actionForm.loginActionForm;
import org.apache.struts.action.Action;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import roject.login.loginbean.managerLoginBean;

public class loginAction extends Action {
private DataSource ds = null;
private Connection con = null;

managerLoginBean mlb = new managerLoginBean();

public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm,
HttpServletRequest servletRequest,
HttpServletResponse servletResponse)
{
loginActionForm loginActionForm = (loginActionForm) actionForm;
String userName = (String)loginActionForm.getUserName();
String password = loginActionForm.getPassword().toString();

boolean judgeName;
boolean judgePwd;
try
{
ds = (DataSource)servlet.getServletContext().getAttribute("ds");
con = ds.getConnection();
mlb.setConnection(con);
judgeName = mlb.judgeUserName(userName);
if(judgeName == false)
{
return actionMapping.findForward("error");
}
else
{
judgePwd = mlb.judgePassword(userName,password);
if(judgePwd == false)
{
return actionMapping.findForward("fail");
}
else
{
loginActionForm = mlb.getRole(userName,password);
servletRequest.removeAttribute("userName");
servletRequest.setAttribute("userName",loginActionForm.getUserName());
if(loginActionForm.getRole() == 1)
{
return actionMapping.findForward("success");
}
}
}
}
catch(SQLException sqle)
{
getServlet().log("Connection.process",sqle);
}
finally
{
try
{
con.close();
}
catch(SQLException e)
{
getServlet().log("Connection.close",e);
}
}
return null;
}
}





呵呵,代码看起来有点长哦,但是,各位大哥千万不要放弃帮帮我哦,在此非常感谢,谢谢了


dimg_ren(vanish)你真是个牛人,学struts学了20天?呵呵,历害


赫赫,楼主兄弟,我也是刚从上个星期才开始学struts的,也像你一样摆弄了这样的简单东西,几经波折也终于搞出来了,看你的问题,感觉你对Action,ActionForm和ActionForward这几者关系不是特别清楚,当然,不是说作用上的不清楚,其实struts很关键的一个东西就是struts-config文件,你应该多领悟一下那个里面的东西,上面说的这些东西之间的关系是通过这个文件完成的,你的问题很可能是对配置文件理解不够造成的!(因为觉得你代码写的太长不够清晰没有看,呵呵)


首先,应该清楚,STRUTS是通过XML对结构及关联进行配置的,而JBUILDER对STRUTS的整合并不好,很多XML要手工添加,如果要学习STRUTS最好使用ECLIPSE,很多东西都可以自动生成,你回头再去看生成的东西就会清楚很多
其次,STRUTS框架中,所有跳转都使用的是 RETURN MAPPING,FINDFORWARD("xxxxxxxx")不需要跳转的可以用return null,
从代码中可以看出,楼主对MVC的理解有点问题,怎么要在STRUTS中生成CONNECTION?这样不是违背的降低偶合的初衷?比较好的做法是,JSP--ACTION---LOGIC---DAO

1.actionform : 对JSP的FORM的封装,即,将你的页面输入信息封装到类中,这样就将你原本的REQUEST.GETPRAMETER()替换为GET、SET了

2.action里面怎么返回页面, RETURN MAPPING.FINDFORWARD("xxxxxxxx")不需要跳转的可以用return null

3.action与action之间又是怎么来关联,同上

跳转使用的是别名,即



中的SUCCESS、ERROR、FAIL这几个,而不是PATH的URL





过了一天多才登录进来看看,真的让我很高兴,谢谢各位的热心帮助,在各位的热心帮助下,我相信我会学好这个struts,请容许几天之后再给分吧.再次让我说声:谢谢你们.


↑返回目录
前一篇: 关于JDBC
后一篇: 麻烦大家进来看看啊!关于环境变量配置的问题!