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

当前页面: 开发资料首页J2EE 专题关于struts的再贴(在此感谢上次热心帮助我的高人们,也希望高人们再次热心指点)

关于struts的再贴(在此感谢上次热心帮助我的高人们,也希望高人们再次热心指点)

摘要: 关于struts的再贴(在此感谢上次热心帮助我的高人们,也希望高人们再次热心指点)


上次的帖,小弟我在此再次说谢谢他们,他们对于我不厌其烦的提问而热心帮助我,真是十分感谢!
也由于上次的贴,我获得了不小东西.很认真可虑许久(我知道要精通struts是要段时间(特别是我))但是我的这个小的程序却始终没有调式成功(也换了n+1种方法),很是郁闷.(我用的是jbuilder2005)先说一下我的方法(程序是一个登录的):
一.先建工程
二.建Web Module(WAR)
三.建actionForm(名字是secondTestActionForm.java代码:
package secondteststruts;

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.ActionMessage;

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

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

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

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("name",new ActionMessage("用户名不能为空!"));
}
else
{
if(password == null)
{
errors.add("pwd",new ActionMessage("密码不能为空!"));
}
}
/** @todo: finish this method, this is just the skeleton.*/
return errors;
}

public void reset(ActionMapping actionMapping,
HttpServletRequest servletRequest) {
password = null;
userName = null;
}
}
注意一下:我的login.jsp里面只有:
<tr>
<td align="right">
用户名
</td>
<td align="left">


</td>
</tr>
<tr>
<td align="right">
密 码
</td>
<td align="left">


我不知道在loginActionForm里面可不可有id,role两项?因为当我没有输入值提交时它报了一个错:type Status reportmessage No input attribute for mapping path /secondTestActiondescription The server encountered an internal error (No input attribute for mapping path /secondTestAction) that prevented it from fulfilling this request.我也知道是路径错,但是我不太熟悉,不知道在哪里改,怎么去改?)

四.建action(名字是:secondTestAction.java代码:
package secondteststruts;

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 org.apache.struts.action.Action;
import loginBean.managerLoginBean;
import javax.sql.DataSource;
import java.sql.*;

public class secondTestAction 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) {
secondTestActionForm secondTestActionForm = (secondTestActionForm)actionForm;
String userName = (String)secondTestActionForm.getUserName();
System.out.println("userName="+userName);
String password = secondTestActionForm.getPassword().toString();
System.out.println("password="+password);

boolean judgeName;
boolean judgePwd;
try
{
ds = (DataSource)servlet.getServletContext().getAttribute("ds");
System.out.println("000");
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
{
secondTestActionForm = mlb.getRole(userName,password);
servletRequest.removeAttribute("userName");
servletRequest.setAttribute("userName",secondTestActionForm.getUserName());
if(secondTestActionForm.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;
}
}
在此*.java上面的错是这样的:con = ds.getConnection();此句出错
错误如下:
type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause java.lang.NullPointerException
secondteststruts.secondTestAction.execute(secondTestAction.java:69)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
note The full stack trace of the root cause is available in the Apache Tomcat/5.0.27 logs.)



在上面的secondTestAction.java中的此句:ds = (DataSource)servlet.getServletContext().getAttribute("ds");是连接数据库连接池的
在这里我把我的数据库连接池发出来:
<?xml version="1.0" encoding="UTF-8"?>









maxWait
5000


maxActive
1000


maxIdle
20


driverClassName
oracle.jdbc.driver.OracleDriver


url
jdbc:oracle:thin:@localhost:1521:system


username
system


password
sql







我的数据库连接池配的server8083.xml + web.xml
<?xml version="1.0" encoding="UTF-8"?>

secondTestStruts

DB Connection
jdbc/oracle/system
javax.sql.DataSource
Container


listener.DbLinkListener



/WEB-INF/struts-bean.tld
/WEB-INF/struts-bean.tld


/WEB-INF/struts-html.tld
/WEB-INF/struts-html.tld


/WEB-INF/struts-logic.tld
/WEB-INF/struts-logic.tld


/WEB-INF/struts-template.tld
/WEB-INF/struts-template.tld


/WEB-INF/struts-tiles.tld
/WEB-INF/struts-tiles.tld


/WEB-INF/struts-nested.tld
/WEB-INF/struts-nested.tld



action
org.apache.struts.action.ActionServlet

config
/WEB-INF/struts-config.xml


debug
2


application
ApplicationResources

2


action
*.do


五.我的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">

<form-beans>
<form-bean name="secondTestActionForm" type="secondteststruts.secondTestActionForm" />
</form-beans>








第三步错误:
errors.add("name",new ActionMessage("用户名不能为空!"));

这里使用了Struts错误处理机制,但是用法不对.Struts错误处理应该要建立错误资源文件,所有的错误信息写在资源文件里,比如:error.properties里
name.null=用户名不能为空!

那么在代码里这样使用:
errors.add("name",new ActionMessage("name.null"));


上面的资源文件要在struts-config.xml文件里注册进去

第四步错误:
空指针异常,也就是说对象ds为空,数据源没有得到...

还有提醒楼主,JAVA编码规范,类名以大写字母开头,这是一个程序员的良好习惯


谢谢lip009兄,你说的对象ds为空,但是我在jb里面看到了连接成功(代码如下:package listener;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class DbLinkListener extends HttpServlet implements ServletContextListener
{
private DataSource ds;

public void contextInitialized(ServletContextEvent sce)
{
ServletContext application = sce.getServletContext();
Context env = null;

/**
* Get the JNDI and set pool to a atrribute
* Which we can use it in everywhere.
*/

try
{
env = (Context)new InitialContext().lookup("java:comp/env");
ds = (DataSource) env.lookup("jdbc/oracle/system");
System.out.println("连接成功!");
if (ds == null)
{
application.log("Can not find jdbc/oracle/system JNDI");
System.out.println("连接失败!");
}
}
catch (NamingException ne)
{
application.log("Can not get jdbc/oracle/system JNDI");
}
application.setAttribute("ds", ds);
}
  .....
}
)当然这个是当程序编译时,它就会编译server8083.xml就会只动编译上面代码而打印出"连接成功"(我想DbLinkListener .java这种连接池应该还是可以用吧).如果真像你说的是ds没有获取到的话,我想就是这句出了问题: ds = (DataSource)servlet.getServletContext().getAttribute("ds");(secondTestAction.java里面的),那么我该怎么样去获得我上面的DbLinkListener .java里面的ds呢在secondTestAction.java里面.
当然希望能给我另外的比较好的连接池方法更好.
谢谢



运行 ds = (DataSource)servlet.getServletContext().getAttribute("ds");这句后面的System.out.println("000");成功打印了,报错是在这句:ds.getConnection();真不知道是ds没有获取到还是什么原因呢?


高人们,来了就告诉我那个ds的问题啊,我真不知道在struts里面怎么弄哦
谢谢


把DbLinkListener类里的ds修饰成public static
直接DbLinkListener.ds


就这样行吗?不太理解


试试


我改成了这样://ds = (DataSource)servlet.getServletContext().getAttribute("ds");
ds = dl.ds;
System.out.println("000");
con = ds.getConnection();
mlb.setConnection(con);
但是还是报userName=camel

password=camel

000

2006-9-14 17:39:44 org.apache.struts.action.RequestProcessor processException

警告: Unhandled Exception thrown: class java.lang.NullPointerException

StandardWrapperValve[action]: Servlet.service() for servlet action threw exception

java.lang.NullPointerException

java.lang.NullPointerException

at secondteststruts.secondTestAction.execute(secondTestAction.java:72)

at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)

at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)

at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)

at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)

at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)

at java.lang.Thread.run(Thread.java:534)
这种错
谢谢你再次指点,谢谢


高手们,在jb2005中怎么配置Resource Bundle资源?


支持一下


郁闷中,没人回我


Jsp页面里好像没Form呢,你怎么提交的啊


↑返回目录
前一篇: EJB能够做数据整合,挖掘方面的吗?
后一篇: JSP如何获取文本框内容