Java 为什么我需要在实际程序执行之前打开blah.do?
我在学校学习struts。我有一个非常基本的hello world,但有一件事我似乎没有弄对 我有struts表单、struts操作、主jsp(使用welcomeStruts.jsp)和struts config.xml。。这是我正在处理的四个文件 表格如下: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
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
)
步骤:
mensajact.do
struts config.xml
mensajaction
)
类型
属性
在您的
并转发到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。这是您的strutsActionServlet
。这是实际的处理器,它将责任委托给StrutsRequestProcessor
,并运行您的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映射),并且没有弄乱它。我要说的是,如果这些