在做一个JSP+Struts小东东,数据库操作在Jcreator里访问完全没什么错误,通过Struts的action处理过后在JSP页面总是访问不了。下面我贴出来。大家找找到底哪里出问题了?
1.在public final class UserDAO类里。有个方法(都没得问题,数据库存储过程也没任何问题):
public final UserModel AdminLogin(String userName,String userPassWord)
具体如下:
/**
*UserLogin:管理员登陆登陆系统
*u:UserModel对象?serName:登陆帐号,userPassWord登陆密码
*数据库存在返回记录,不存在返回null
*/
public final UserModel AdminLogin(String userName,String userPassWord)
{
//变量定义
UserModel u=null;
String ProcSQL="";
String Fields_Name="";
String Where_Str="";
CallableStatement Stmt=null;
ResultSet rs=null;
//确定要取得的字段对应的数据
Fields_Name="userID,userName,userPassWord,passWordProtection,email";
//确定查询条件
Where_Str="userName='"+userName.trim()+"' and userPassWord='"+userPassWord.trim()+"'";
//调用存储过程UserInfosGet_Proc
ProcSQL="{call UserInfosGet_Proc(?,?,?)}";
//创建连接数据库对
Conn conn=new Conn();
try{
//取得数据库连接
Stmt=conn.getConn().prepareCall(ProcSQL);
//设置存储过程参数
Stmt.setString(1,Fields_Name);
Stmt.setString(2,Where_Str);
Stmt.setInt(3,0);
//执行数据库executeQuery操作
rs=Stmt.executeQuery();
//判断是否存在记录
if(rs.next()){
u=new UserModel();
//存在则取得记录,设置UserModel属性
u.setUserID(rs.getInt(1));
u.setUserName(rs.getString(2));
u.setUserPassWord(rs.getString(3));
u.setPassWordProtection(rs.getString(4));
u.setEmail(rs.getString(5));
}
}catch(SQLException sqle){
}catch(Exception e){
}
finally{
try{
rs.close();
rs=null;
conn.Close();
}catch(Exception ce){
}
}
return u;
}
2.在public class UserOOP类里我做了一个提供外部访问的口,如下:
//管理员登陆
public final UserModel QryAdminLogin(String userName,String userPassWord){
return this.getUdao().AdminLogin(userName,userPassWord);
}
3.我用main方法测试时候完全正确:
//main 测试
public static void main(String[] args){
UserModel um=null;
try{
um=new UserOOP().QryAdminLogin("ming206","1");//数据库里确实有这条记录
if(um!=null)
System.out.println("um="+um+"\n"+"id="+um.getUserID());
}catch(Exception e){
System.out.println("e:"+e.getMessage());
}
}
我测试得到的结果是(我主要取得编号和测试这个um对象是否为null):
um=com.net.wwwroot.userpackage.beans.UserModel@a59698
id=32
Press any key to continue...
4.我在UserAction里的代码是:
/**
*@实现父类的抽象方法execute
*@
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
ActionForward forward = null;
//String strutsaction=mapping.getParameter();
UserForm userForm = (UserForm) form;
String strutsaction = userForm.getStrutcAction();
if ("adminLogin".equalsIgnoreCase(strutsaction))
forward = getAdminInfos(mapping, request, response,userForm);
else
forward=mapping.findForward("fail");
return forward;
}
/**
*@getAdminInfos:管理员登陆/后台
*@
*/
private final ActionForward getAdminInfos(
ActionMapping mapping,HttpServletRequest request,
HttpServletResponse response,UserForm userForm){
ActionForward fd = null;
String userName="";
String passWord="";
String str="外边!";
//HttpSession session = request.getSession(true);
//session.invalidate();
//session = request.getSession();
UserModel uu=null;
try{
//调QryAdminLogin,管理员登陆
//参数1:管理员名
//参数2:管理员密码
userName=userForm.getUserName().trim();
passWord=userForm.getUserPassWord().trim();
//这里调用
uu=new UserOOP().QryAdminLogin(userName,passWord);
if(uu!=null)
str="里面有数据"+(new Integer(uu.getUserID())).toString();
else
str="里面没有数据";
}catch(Exception e){
}
//设置页面信息
request.setAttribute("e",str+",刚输入的用户名="+userName+",密码="+passWord);
//request.setAttribute("adminInfos",uu);
//转向
fd= mapping.findForward("success");
return fd;
}
我通过上面的测试:JSP里面是(我是通过在index.jsp页面提交,在action里处理后调到main.jsp):
我的index.jsp页面主要是传三个变量:隐藏信息:strutcAction(决定操作的方法,传的是:adminLogin),
下面是main.jsp测试代码:
<body>
<%
String str=(String)request.getAttribute("e");
%><%="Web页面数据:"+str%>
</body>
当我在index.jsp页面里输入用户名和密码提交后,在main.jsp总是得到这样的结果:
Web页面数据:里面没有数据,刚输入的用户名=ming206,密码=1
也就是说明在action里没有执行
(跟数据库打交道的,目的是得到数据信息)
UserModel um=new UserOOP().QryGetUserInfos(userForm.getUserName().trim());
但是我自己动手设置 UserModel类的 setter,再在action里直接转向,在JSP页面又可以读到
由我认定是 数据库操作上有问题。但是问题在哪里呢?哪个帮我好好看看。我真的搞了一天了。
今天也叫几个帮看了很久,但没得到结果。真的晕啊。以前做都没出现这个问题。。
----------------解决方案--------------------------------------------------------
怎么你定义的类也是final的,你的方法也是final的?
----------------解决方案--------------------------------------------------------
严格的说我定义类为final,里面的所有方法都会是final了
我只是习惯在方法前加final,实际上我没什么意义的,呵呵
只是不想让被其他类继承了。
----------------解决方案--------------------------------------------------------
那以后想扩展怎么办?
----------------解决方案--------------------------------------------------------
老大,真的还不行啊。我用了Jcreator 和 eclipse测试都没问题
如下:
//main 测试
public static void main(String[] args){
UserModel um=null;
try{
um=new UserOOP().QryGetUserInfos("ming206");
if(um!=null)
System.out.println("um="+um+"\n"+"id="+um.getUserID());
}catch(Exception e){
System.out.println("e:"+e.getMessage());
}
}
就是在JSP页面就读不出来。
如下:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="com.net.wwwroot.userpackage.oop.UserOOP" %>
<%@ page import="com.net.wwwroot.userpackage.beans.UserModel" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>处理页面</title>
</head>
<body>
<%
//*************************************************
//直接引用
UserOOP o=new UserOOP();
UserModel u=null;
try{
u=o.QryGetUserInfos("ming206");
out.println("id="+u.getUserID());
}catch(Exception e){
out.println("err:"+e.getMessage());
}
//*************************************************
//通过struts的action处理后
UserModel uu=new UserModel();
String au="";
uu=(UserModel)request.getAttribute("userInfos");
au=(String)request.getAttribute("e");
%>
<br>
<br>
<%="Web UserModel2:"+uu.getUserName()%>
<br>
<%="String:"+au%>
</body>
</html>
其中都显示null,真的帮我看一下啊。
----------------解决方案--------------------------------------------------------
怎么会呢
你再仔细检查一下吧
你的代码太多了,看得头都大了
----------------解决方案--------------------------------------------------------