这些天学Struts2,用它写了一个用户注册登录程序,主要是,MyEclipse给出的错误是
No configuration found for the specified action: 'userLogin' in namespace: ''. Form action defaulting to 'action' attribute's literal value.
select username,password  from fortest where username='null' and password='null'
//这是登录Action
package org.qiang.action;import com.opensymphony.xwork2.ActionSupport;import org.qiang.action.UserRegisterAction;
import org.qiang.db_conn.DB_Connection;public class UserLoginAction extends ActionSupport{
private String username;
private String password;
DB_Connection db_conn = new DB_Connection();
String sql = "select username,password  from fortest where username='"+ this.getUsername()+"' and password='"+this.getPassword()+"'";

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String execute() {
System.out.println(sql);
db_conn.exeSqlQuery(sql);
return SUCCESS;
}

public void validate() {
if (getUsername() == null || getUsername().trim().equals("")) {
addFieldError("username", "请输入用户名");
}
if (getPassword() == null || getPassword().trim().equals("")) {
addFieldError("password", "请输入用户密码");
}
if (db_conn.exeSqlQuery(sql)==null){
addFieldError("password","你输入的用户名或密码有误 ,请重新输入");
}
}
}
//数据库连接程序,这个估计没问题,用过几次
package org.qiang.db_conn;import java.sql.*;
public class DB_Connection {
String userName="root";
String userPassword="123";
String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
Connection dbcon;   
Statement stmt;
ResultSet rs;
    
    public DB_Connection()
    {
    stmt = null;
rs = null;
    try
{
Class.forName("com.mysql.jdbc.Driver");
dbcon= DriverManager.getConnection(url,userName,userPassword);

}
catch(SQLException ex)
{
System.out.println(ex.toString());
}
catch(ClassNotFoundException ex)
{
System.out.println(ex.toString());
}
    }
   
public boolean exeSqlUpdate(String strSql)
{
try
{
    stmt=dbcon.createStatement();
stmt.executeUpdate(strSql);
return true;            
}
catch(Exception ex)
{
System.out.println(ex.toString());
return false;
}
}

    public ResultSet exeSqlQuery(String strSql)
{
try
{
    stmt=dbcon.createStatement();
rs =stmt.executeQuery(strSql);             
}
catch(Exception ex)
{
System.out.println(ex.toString());
rs = null;
}
return rs;
}  
}<!--jsp页面的表单代码段-->
<s:form name="login" action="userLogin" method="post">
<table width="40%" align="center"> <tr>
<td>
<s:textfield name="username" label="用  户  名" />
</td>
</tr>
<tr>
<td>
<s:password name="password" label="用户密码" />
</td>
</tr>
<tr>
&nbsp;
</tr>
<tr>
<td>
<s:submit value="提交(execute)"></s:submit>
</td>
<td>
<s:reset value="重置(reset)"></s:reset>
</td>
</tr>
</table>
</s:form>struts.xml
     <action name="userLogin" class="org.qiang.action.UserLoginAction">
<result name="input">/userLogin.jsp</result>
<result name="success">/loginSuccess.jsp</result>
     </action>问题是:在登录页面,我输入任意用户名跟密码,都能够登录成功,无论数据库中有没有对应的字段
我用的是Myeclips 8.0 MySQL 5.0
请各位指教,先行谢过了

解决方案 »

  1.   

    指定form的namespace属性为strut.xml中userLogin所在的namespace
      

  2.   

    'userLogin' in namespace”
    你的struts.xml中是不是package中namespace设置有问题?如果你在package中设置了namespace建议你去掉namespace试试。
      

  3.   

    只看发的那些代码没什么问题,报的是没找到那个对应的userLogin,用了命名空间,就不能直接用某一action了,而还要加上他的前缀命名空间,这样,程序才能由命名空间找到特定的那个action
      

  4.   

    看看你 struts.xml中是不是package中namespace设置有问题 
    可以这样写 xxx.userLogin.action
    xxx代表你的命名空间 
    推荐你看看 风中叶 或者 马士兵的视频STRUTS2的
      

  5.   

    LZ,你的web.xml文件配置没有呢?
      

  6.   

    struts.xml配置文件少了一层package
    <package name="org.qiang.action" >
    <action name="userLogin" class="org.qiang.action.UserLoginAction">
    <result name="input">/userLogin.jsp</result>
    <result name="success">/loginSuccess.jsp</result>
    </action>
    </package>
      

  7.   

    1 如果是因为namespace对应不上的话,你可以在页面<s:form>的标签内加入namespace属性,对应的值与struts.xml文件中设置的namespace值相同。
    2 你输入任何值都可以登录成功是因为你的execute方法中只有一个返回值,在执行提交时自动调用execute方法后都会返回那一个success,所以只会按照返回值为success所对应的那个页面跳转。
    3 select username,password from fortest where username='null' and password='null'
    这两个变量username和password属性为空的问题应该是由于你在类体中直接引用了定义的两个私有属性。虽然说你有了set和get方法可以获取表单中的值,但是在方法体外写的话只是一个引用,如果不设初始值的话java会给它设定一个默认值,字符串的默认值就是null。
    4 楼主的validate验证我觉得没什么用,你提交的时候根本就没有调用哪个方法。
      

  8.   

    看看你的struts.xml文件的<package....>中有没有 namespace="/..."如果有的话你的<s:form name="login" action="userLogin" method="post">中的action=".../userLogin".另外在struts.xm中的要配置<result name="input" ...> 加为你的校验不通过时,struts会自动返回INPUT 而不只是 你写的SUCCESS
      

  9.   

    <struts>
        <constant name="struts.devMode" value="true"/>
    <package name="default" namespace="/" extends="struts-default">
    <action name="index">
    <result>/index.jsp</result>
    </action>
     <action name="userLogin" class="org.qiang.action.UserLoginAction">
    <result name="input">/userLogin.jsp</result>
    <result name="success">/loginSuccess.jsp</result>
    </action>
    </package>
    </struts>配置文件是这样的
      

  10.   


    给你的form加上namespace="/"