我在Java EE项目中使用struts:
在我的src
中,如果我使用下面的404
,我会收到<IFRAME src="${pageContext.request.contextPath}/WEB-INF/page/menu/alermDevice.jsp" name="dev" id="dev" frameBorder="0" width="500" scrolling="auto" height="400">
</IFRAME>
错误:
<IFRAME src="elecMenuAction_alermDevice.do" name="dev" id="dev" frameBorder="0" width="500" scrolling="auto" height="400">
</IFRAME>
但如果我在src下使用:
struts.xml
我会得到正确的信息。
这是我的<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.ui.theme" value="simple"></constant>
<constant name="struts.action.extension" value="do"></constant>
<package name="system" namespace="/system" extends="struts-default">
<action name="elecTextAction_*" class="elecTextAction" method="{1}">
<result name="save">/system/textAdd.jsp</result>
</action>
<action name="elecMenuAction_*" class="elecMenuAction" method="{1}">
<result name="menuHome">/WEB-INF/page/menu/home.jsp</result>
<result name="title">/WEB-INF/page/menu/title.jsp</result>
<result name="left">/WEB-INF/page/menu/left.jsp</result>
<result name="change">/WEB-INF/page/menu/change.jsp</result>
<result name="loading">/WEB-INF/page/menu/loading.jsp</result>
<result name="logout" type="redirect">index.jsp</result>
<result name="alermStation">/WEB-INF/page/menu/alermStation.jsp</result>
<result name="alermDevice">/WEB-INF/page/menu/alermDevice.jsp</result>
</action>
</package>
</struts>
:
HTML
为什么我使用路径无法访问JSP?只使用我能得到的动作吗?
答案 0 :(得分:1)
Web服务器无法从WEB-INF
文件夹中获取资源。调用action时,它会返回一个响应作为结果的执行。它使用结果类型dispatcher
,默认情况下用于将请求转发到指定的URL(请求的JSP页面)。
Dispatcher Result
包含或转发到视图(通常是jsp)。在幕后 Struts将使用目标servlet / JSP的
RequestDispatcher
接收与原始相同的请求/响应对象 的servlet / JSP。因此,您可以使用它们在它们之间传递数据request.setAttribute()
- Struts操作可用。有三种方法可以执行结果:
如果我们在JSP的范围内(
PageContext
可用),PageContext
的{{1}}方法是 调用。如果没有
PageContext#include(String)
且我们没有任何类型的包含(请求中没有PageContext
属性),然后调用"javax.servlet.include.servlet_path"
已成就。否则,会调用
RequestDispatcher#forward(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
。
当调用servlet调度程序时,它没有这样的限制,并且可以返回具有最初请求的相同响应的资源。