一直都不是很明白,我做了一个项目,当在浏览器上输入http://localhost:8080/mySurvey1/login.do时,它就自然的跳转到我的login.jsp页面,不是很明白它的处理过程。下面是我的dispatcherServlet-servlet.xml页面
<!--定义映射-->
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
             <!--接受请求的login.do,转入控制器loginAction-->
                <prop key="login.do">loginAction</prop>
                <!--接受请求的regedit.do,转入控制器regeditAction-->
                <prop key="regedit.do">regeditAction</prop>
                <!--接受请求的survey.do,转入控制器setSurveyAction-->
                <prop key="survey.do">setSurveyAction</prop>
                <!--接受请求的setSurvey.do,转入控制器surveyAction-->
                <prop key="setSurvey.do">surveyAction</prop>
            </props>
        </property>
</bean>
<!--定义视图-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.InternalResourceView</value>
        </property> 
        <!--所有的jsp页面都放在根目录的jsp文件夹中-->
        <property name="prefix">
            <value>/jsp/</value>
        </property>
        <!--所有jsp的后缀都是.jsp-->
        <property name="suffix">
            <value>.jsp</value>
        </property>
</bean>
<!--定义控制器loginAction-->
    <bean id="loginAction" class="com.mySurvey.action.LoginAction">
     <!--定义要封装的表单-->
        <property name="commandClass">
            <value>com.mySurvey.bean.User</value>
        </property>
        <!--定义要依赖注入的处理逻辑login-->
        <property name="login">
           <ref local="login" />
       </property>
       <!--定义登录失败要返回的页面-->
        <property name="viewPage">
            <value>login</value>
        </property>
        <!--定义登录成功的页面-->
        <property name="successPage">
            <value>surveyName</value>
        </property>
    </bean>
下面是我登录时跳转的action页面
package com.mySurvey.action;
//导入Java类
import java.util.HashMap;
import java.util.Map;
//导入spring的类
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
//导入mySurvey的相关类
import com.mySurvey.bean.User;
import com.mySurvey.domain.Login;
//该类作为登录的控制器
public class LoginAction extends SimpleFormController{
private Login login;
private String viewPage;
private String successPage;
//实现onSubmit()方法
    public ModelAndView onSubmit(Object command) throws Exception {
     //强制转换成User
     User user = (User)command;
        Map model = new HashMap(); 
        //进行登录的业务逻辑处理
        getLogin().login(user);
        //存放消息
        model.put("user", user);
        model.put("userId", user.getId()); 
        model.put("msg", getLogin().getMsg());
        if ("登录成功".equals(getLogin().getMsg())) {
         //返回到登录成功的页面
            return new ModelAndView(getSuccessPage(), model); 
        } else {
         //返回到登录失败的页面
            return new ModelAndView(getViewPage(), model); 
        }
    } 
    //依赖注入要返回的登录失败的页面
    public void setViewPage(String viewPage) { 
        this.viewPage = viewPage; 
    } 
    //获取要返回的登录失败的页面
    public String getViewPage() { 
        return viewPage; 
    }
    //获取业务逻辑
public Login getLogin() {
return login;
}
//设定业务逻辑
public void setLogin(Login login) {
this.login = login;
}
//获取要返回的登录成功的页面
public String getSuccessPage() {
return successPage;
}
//依赖注入要返回的登录成功的页面
public void setSuccessPage(String successPage) {
this.successPage = successPage;
}
}下面是我的login.jsp页面
<%@page contentType="text/html;charset=GBK"%><html> 
<head><title>网上调查系统之用户登录</title>
<style type="text/css">.style1 {
color: #FF0000;
font-weight: bold;
}</style>
</head> 
<body> 
<!--该表单的提交都要通过login.do-->
    <form name="user" action="/mySurvey1/login.do" method="post"> 
    <table width="776" border="1">
    <tr>
    <!--采用EL语法-->
      <td height="38" colspan="2"><div align="center">用户登录『<span class="style1">消息提示:${msg}</span>』</div></td>
    </tr>
    <tr>
      <td width="320"><div align="right">用户名:</div></td>
      <td width="440"><input type="text" name="username" value="${user.username}"/></td>
    </tr>
    <tr>
      <td><div align="right">密码:</div></td>
      <td><input type="password" name="password" value="${user.password}"/></td>
    </tr>
    <tr>
      <td colspan="2"><div align="center">
          <input type="submit" name="method" value="登录">  
          <input type="reset" name="Submit" value="重置">
        </div></td>
    </tr>
  </table>
    </form> 
</body> 
</html>
我的理解是,当我第一次输入:http://localhost:8080/mySurvey1/login.do时,它应该是跳转到loginAction的,我开始怎么认为,但跳转到loginAction时,第一次因为没有拿到表单的数据,所以返回一个失败要跳转到的页面,上面我定义的是跳转到login.jsp,确实如此,我是这么认为的,但是当我在配置文件里面改了失败的时候跳转到另外的页面的时候不是login.jsp页面的时候呢,我以为这个时候在浏览器当中输入http://localhost:8080/mySurvey1/login.do时不会跳转到登录页面,但事实上它还是跳转到登录界面,我很纳闷,请问这是怎么回事的呢。
最好高手能够把这个流程说一说哦,感谢各位了哦。

解决方案 »

  1.   

    框架啊,在Struts里有个返回是INPUT,就是填写表单的那个页面,当没有填写表单数据无法完成数据绑定而返回,可能是这个原因,具体实现嘛就不知道了
      

  2.   

    我这个是用spring和hibernate做的一个项目,如果说默认第一次登录的时候因为没有和表单绑定,跳转到默认的页面,也就是表单的那个页面,这样理解的话,那应该可以改写默认的页面的,在配置里面是怎么改的呢。我这里并没有用到struts,我在spring里面的配置文件里面是这样改的,<property name="INPUT">
             <value>regedit</value>
            </property>但是这样改过之后,一运行tomcat服务器就报错
    信息: Initializing Spring FrameworkServlet 'dispatcherServlet'
    19:44:28,473 ERROR DispatcherServlet:244 - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'urlMapping' defined in ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginAction' defined in ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'INPUT' of bean class [com.mySurvey.action.LoginAction]: No property 'INPUT' found
    Caused by: 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginAction' defined in ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]: Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'INPUT' of bean class [com.mySurvey.action.LoginAction]: No property 'INPUT' found
    Caused by: 
    org.springframework.beans.InvalidPropertyException: Invalid property 'INPUT' of bean class [com.mySurvey.action.LoginAction]: No property 'INPUT' found
    at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:376)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1112)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:862)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:423)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:757)
    at org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler(AbstractUrlHandlerMapping.java:256)
    at org.springframework.web.servlet.handler.SimpleUrlHandlerMapping.registerHandlers(SimpleUrlHandlerMapping.java:125)
    at org.springframework.web.servlet.handler.SimpleUrlHandlerMapping.initApplicationContext(SimpleUrlHandlerMapping.java:103)
    at org.springframework.context.support.ApplicationObjectSupport.setApplicationContext(ApplicationObjectSupport.java:73)
    at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:72)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1168)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:427)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:249)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:155)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:246)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:291)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:352)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:332)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:266)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:236)
    请为我这里理解是可以的吗,如果可以的话,我改它第一次登录的时候的默认转向界面,那为什么会发生错误的呢。
      

  3.   

    在你原来代码中,判断登录成功和失败那里,后台打印2句话看看,当你第一次访问的时候,他执行的是哪个条件. 
     
    当我照你说的那样在我的loginAction里面的判断登录成功和失败的页面上加上在后台打印两句话,但奇怪的是,但我第一次输入http://localhost:8080/mySurvey1/login.do时,它后台没有反应,这说明我第一次输入这个链接的时候是否并没有转到loginAction里面呢。要是这样的话,那我第一次访问的时候它是怎么样跳转到我的登录页面的呢。
      

  4.   

    struts1 我有点看不明白  唉……