Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我需要在实际程序执行之前打开blah.do?_Java_Struts 1 - Fatal编程技术网

Java 为什么我需要在实际程序执行之前打开blah.do?

Java 为什么我需要在实际程序执行之前打开blah.do?,java,struts-1,Java,Struts 1,我在学校学习struts。我有一个非常基本的hello world,但有一件事我似乎没有弄对 我有struts表单、struts操作、主jsp(使用welcomeStruts.jsp)和struts config.xml。。这是我正在处理的四个文件 表格如下: public class mensaje extends org.apache.struts.action.ActionForm { private String message; public String getMes

我在学校学习struts。我有一个非常基本的hello world,但有一件事我似乎没有弄对

我有struts表单、struts操作、主jsp(使用welcomeStruts.jsp)和struts config.xml。。这是我正在处理的四个文件

表格如下:

public class mensaje extends org.apache.struts.action.ActionForm {
    private String message;
    public String getMessage() {
    return message;
    }
    public void setMessage (String message) {
        this.message = message;
    }
}
行动是:

public class mensajeAction extends org.apache.struts.action.Action {
     @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
       HttpServletRequest request, HttpServletResponse response)
       throws Exception {
        mensaje hellwForm = (mensaje) form;
        hellwForm.setMessage("Hello World");
        return mapping.findForward("success");
      }
}
来自jsp的调用如下所示:

<html:form action="/mensajeAct">
    <bean:write name="mensaje" property="message"/>
</html:form>

最后,这是我在struts配置中的内容

    <form-beans>
        <form-bean name="mensaje" type="Struts.Form.mensaje"/>
    </form-beans>
    <global-forwards>
        <forward name="welcome"  path="/Welcome.do"/>
    </global-forwards>
    <action-mappings>
        <action input="/Welcome" name="mensaje" path="/mensajeAct" scope="session" type="Struts.Action.mensajeAction" validate="false"/>
        <action path="/Welcome" forward="/welcomeStruts.jsp"/>
    </action-mappings>

现在。。。如果我只转到我的浏览器(localhost:8080/helloworld),它将不会在操作中添加“helloworld”部分。 但是,如果我首先在浏览器中转到.do(localhost:8080/helloworld/mensajact.do),然后返回主页(localhost:8080/helloworld),它现在就可以工作了。在我访问了.do一次之后的这个时候,我可以在netbeans中进行更改,点击play,它会接受这些更改

所以,问题是,我在struts中是否做错了什么,或者是GlassFish在捉弄我?我试过IE和Firefox,两者的表现都一样


多谢

您的
*.do
应该与
中的
路径映射。因此,url中的
mensajact.do
本地主机:8080/helloworld/mensajact.do
映射到
path=“/mensajact”(
)并将您带到相关的操作类(
mensajaction

步骤:

  • RequestProcessor使用
    mensajact.do
  • 它从
    struts config.xml
  • 它实例化了您的应用程序中给定的Action类(
    mensajaction
    类型
    属性
  • 在Action类中执行必要的步骤后,它将搜索
    在您的
    并转发到
    blah.jsp

  • 在上述mensajactionaction类中的代码中,您将操作响应转发给了“success”servlet,该servlet未映射到struts-config.xml中。 根据Struts 1.0规范,它需要被映射,因为对于Struts中的每个请求和响应,请求处理器都会查看Struts-config.xml,因为它是主控制器配置


    希望这有帮助

    实际的答案是因为Struts 1.x框架设计为在Servlet容器(如ApacheTomcat)中运行

    所有Servlet容器都遵循基本原则,即web应用程序必须包含
    web.xml
    文件。为了让Struts工作,它遵循如下简单配置:

    <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            <init-param>
              <param-name>config</param-name>
              <param-value>/WEB-INF/struts-config.xml</param-value>
            </init-param>
    </servlet>
    
    <servlet-mapping>
          <servlet-name>action</servlet-name>
          <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    
    行动
    org.apache.struts.action.ActionServlet
    配置
    /WEB-INF/struts-config.xml
    行动
    *.做
    
    说明Servlet容器必须提取所有以
    .do
    结尾的URL部分,并调用Servlet名称为
    action
    的Servlet。这是您的struts
    ActionServlet
    。这是实际的处理器,它将责任委托给Struts
    RequestProcessor
    ,并运行您的
    Action

    这种类型的架构称为
    模型-视图-控制器
    模式,这就是Struts 1.x的设计基础


    本质上,如果在
    web.xml
    文件中没有
    映射到Struts的
    ActionServlet
    ,您的应用程序将根本无法执行。

    因此,成功后我将转发回jsp??我尝试了以下方法,但仍然得到了相同的结果@弗雷多格,你试过什么?理想情况下,您的
    应该只看到您编辑的注释。如果您在
    路径中提供jsp名称,请提供
    路径=“welcomeStruts.jsp”
    ,仅当您再次提供
    .do.
    路径=“/welcomeStruts.do”
    时,才使用
    //code>。希望您理解其中的差异,并确保您的jsp在项目中的路径正确。谢谢vysh。我似乎仍然无法使它正常工作。我尝试在前进中同时使用/welcomeStruts和“welcomeStruts.jsp”。这是我发的邮件上的一个打字错误。当我第一次运行该项目时,/mensajact中的数据不在那里(如中所示,它没有说“helloworld”)。如果我手动打开localhost:8080/helloworld/mensajact.do,那么在我连续运行项目的所有时候,它都可以正常工作。我只是不担心,但是,我应该把它映射到什么呢?你需要尝试一下:在你的struts action mappings部分,在你的action Mapping标记中,你需要为一个jspUnrelated引导它的响应,但很遗憾你的学校教给你一个不久前就过时了的框架。这也使得遵循最佳编程实践变得更加困难,因为各层相互交织。@DaveNewton我完全同意你的看法。同时,我也希望我们有更好的老师。我正在听老师给我们的“教程”。。在我们应该遵循的三个教程中,有两个没有像预期的那样起作用;这可以实现两件事:一是帮助其他现在和未来的学生,二是帮助老师理解他们应该更加关注。最后,他们把原来的学校“教程”搞砸了。从著名的网络资源中获取了一些教程,然后用收集到的知识重新编写了原始教程。我在“按我的方式”做事后注意到的差异1。增加了一个额外的全球前锋2。已更改index.jsp 3中的逻辑。我对前锋动作的理解肯定有所提高。我第二次手动完成了它们,而不是由netbeans生成,这要感谢allI在web.xml中有servlet映射。它和你放进去的东西一模一样。我没有在顶部添加它,因为它是一个自生成的文件(包括servlet映射),并且没有弄乱它。我要说的是,如果这些