在struts中的跳转后JSP页面request中的值如何读取?

ktu_war 2006-10-19 08:32:58
登录页面Login把用户提交
<%@ page contentType="text/html; charset=GBK" 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 locale="true">
<head>
<title>
用户登录页面
</title>
<html:base/>
</head>
<body bgcolor="#ffffff"><p>
<center>
<h2>用户登录页面</h2><p>
<html:errors/><p>
<html:form action="/loginAction.do" focus="userName">
姓名:<html:text property="userName" size="16" maxlength="16">
</html:text>
密码:<html:password property="password" size="16" maxlength="16">
</html:password>
<html:submit property="submit" value="提交"/>
<html:reset property="reset" value="重置"/>
</html:form>
</body>
</html:html>

在FormBean中(LoginForm.java)设好相同的属性(省略方法):
private String userName;
private String password;

在Action中(LoginAction.java)的execute方法内容:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
LoginForm loginForm = (LoginForm) form;
String userName=loginForm.getUserName();
String password=loginForm.getPassword();
LoginDAO dao=new LoginDAO();
User user=new User(userName,password);
//判断是否有该用户
if(dao.login(userName,password)){

request.setAttribute("userbean",user); //在这设置了提交的对象,为什么在跳转后的页面读取不出来??

return(mapping.findForward("Success"));
}else{
return(mapping.findForward("Failure"));
}
}

其他的Bean有:
LoginDAO.java:
package loginstruts;

import java.sql.*;
public class LoginDAO {

Connection conn=null;

public LoginDAO() {
}
//连接数据库
public Connection getConnectionDB(){
String strDB="sun.jdbc.odbc.JdbcOdbcDriver";
String strUrl="jdbc:odbc:login";
try {
Class.forName(strDB);
conn=DriverManager.getConnection(strUrl);
System.out.println("connetin seccess......");
} catch (Exception ex) {
ex.printStackTrace();
}
return conn;
}
//关闭数据库
public void closeConnectionDB(){
try {
conn.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}

//判断是否有传入的用户
public boolean login(String u,String p){
User user=new User(u,p);
String strSql="select * from user";
getConnectionDB();
try {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(strSql);
while(rs.next()){
user.setPassword(rs.getString("Password"));
user.setUserName(rs.getString("UserName"));
if(u.equals(user.getUserName()) || (p.equals(user.getPassword()))){
rs.close();
st.close();
closeConnectionDB();
return true;
}
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return false;
}
}

User.java:
package loginstruts;

public class User {
private String userName;
private String password;

public User(){

}
public User(String name,String psw) {
this.userName=name;
this.password=psw;
}

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

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

public String getUserName() {
return userName;
}

public String getPassword() {
return password;
}
}


struts-config.xml中的配置(部分):
<struts-config>
<form-beans>
<form-bean name="LoginForm" type="loginstruts.LoginForm"/>
</form-beans>

<action-mappings>
<action path = "/loginAction"
type = "loginstruts.LoginAction"
name = "LoginForm"
scope = "request"
input = "/Login.jsp">
<forward name="Success" path="/Welcome.jsp" redirect="true" />
<forward name="Failure" path="/Login.jsp" redirect="true" />
</action>
</action-mappings>
</struts-config>

最后我在跳转后的Welcome.jsp页面中就是读不出request中的数据出来,为什么呢?
<%@ page contentType="text/html; charset=GBK" language="java" %>
<%@ page import="loginstruts.*" %>
<%@ 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 locale="true">
<head>
<title> 用户登录成功 </title>
<html:base/>
</head>

<body bgcolor="#ffffff"><p>
<center>
</center>
<h2>登录成功</h2><p>

<logic:present name="userbean" scope="request">
<h2>Hello,
<bean:write name="userbean" property="name" />!<p>
</h2>
</logic:present>

</body>
</html:html>

也试过在Welcome.jsp中用如下代码读出来的request.getAttribute("userbean")中的值为null....为什么呢?是不是哪里错了?求教...
<h2>
<%
User tb=(User)request.getAttribute("userbean");
String name=tb.getUserName();
out.println(name);
%>
</h2>

改了一下Action(LoginAction.java)的execute方法内容,在方法中可以正确读出来:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
LoginForm loginForm = (LoginForm) form;
String userName=loginForm.getUserName();
String password=loginForm.getPassword();
LoginDAO dao=new LoginDAO();
User user=new User(userName,password);

if(dao.login(userName,password)){

request.setAttribute("userbean",user); //在这设置了提交的对象,为什么在跳转后的页面读取不出来??

User user1=(User)request.getAttribute("userbean");
System.out.println(user1.getUserName()); //在这里可以正确读出来用户名.

return(mapping.findForward("Success"));
}else{
return(mapping.findForward("Failure"));
}
}

跳转后就不行了,不是这样提交和读取的吗??求教..........
...全文
286 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ktu_war 2006-10-19
  • 打赏
  • 举报
回复
我狂晕,原来是自己头晕搞错了,property="name"这里,自己在User中用户名属性是用userName,不是name,怪不得读不出来。。。改为:
<logic:present name="userbean" scope="request">
<h2>Hello,
<bean:write name="userbean" property="userName" />!<p><!-- property="name"改为User.java中的userName,注:bean:define 不用这样写也是可以的 -->
</h2>
</logic:present>

谢谢大家!!
ktu_war 2006-10-19
  • 打赏
  • 举报
回复
Request 只能保存字符串 保存在 Session 里吧

错了,request是可以存对象的。
你可以去查查:reqwuest.setAttribute(String,Object);
ktu_war 2006-10-19
  • 打赏
  • 举报
回复
测试了,首先的确必须把struts-config.xml中跳转中的redirect改为"false",才能够在跳转页获取值。我是在Welcome.jsp中用java语句获取得的。

所以,我下面这段写法也是写错了(上面的错误就是出现在这里),另外我用tcmis的写法也不行。按尽量在jsp少用java语句的原则,应该如何修改。
<logic:present name="userbean" scope="request">
<h2>Hello,
<bean:write name="userbean" property="name" />!<p>
</h2>
</logic:present>
lzz5451371 2006-10-19
  • 打赏
  • 举报
回复
<bean:write name="elment" property="UserName" />!<p>
lzz5451371 2006-10-19
  • 打赏
  • 举报
回复
Request 只能保存字符串 保存在 Session 里吧
tcmis 2006-10-19
  • 打赏
  • 举报
回复
不是什么重定向,是你的模型对象里面没有get方法。。。
ktu_war 2006-10-19
  • 打赏
  • 举报
回复
好像是重定向的问题,我再试试看...
ktu_war 2006-10-19
  • 打赏
  • 举报
回复
重定向改为false,后会出现方法找不到的错误:

javax.servlet.ServletException: No getter method for property name of bean userbean
tcmis 2006-10-19
  • 打赏
  • 举报
回复
<logic:present name="userbean" scope="request">
<h2>Hello,
<bean:write name="userbean" property="name" />!<p>
</h2>
</logic:present>

你的是个对象,直接这样输出是不行的,需要这样写
<logic:present name="userbean" scope="request">
<h2>Hello,
<bean:define id="elment" name="userbean"/>
<bean:write name="elment" property="name" />!<p>
</h2>
</logic:present>

当然前提你的User user=new User(userName,password);必须是返回了一个user对象,而且不为空,否则就是显示不出来。
benny007ok 2006-10-19
  • 打赏
  • 举报
回复
<action-mappings>
<action path = "/loginAction"
type = "loginstruts.LoginAction"
name = "LoginForm"
scope = "request"
input = "/Login.jsp">
<forward name="Success" path="/Welcome.jsp" redirect="true" />
<forward name="Failure" path="/Login.jsp" redirect="true" />
</action>
</action-mappings>

这段改成:
<action-mappings>
<action path = "/loginAction"
type = "loginstruts.LoginAction"
name = "LoginForm"
scope = "request"
input = "/Login.jsp">
<forward name="Success" path="/Welcome.jsp" redirect="false" /><!-如果设为true就不会把参数转发-->
<forward name="Failure" path="/Login.jsp" redirect="false" />
</action>
</action-mappings>
xq_zhang 2006-10-19
  • 打赏
  • 举报
回复
rs.close();
st.close();
closeConnectionDB();
---------------------------
把这几个去掉试试!

67,513

社区成员

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

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