JSP 中的问题:按钮 Click() 上的转发(当目标 jsp 在 web-inf 文件夹下时)

Posted

技术标签:

【中文标题】JSP 中的问题:按钮 Click() 上的转发(当目标 jsp 在 web-inf 文件夹下时)【英文标题】:issue in JSP:forward on button Click()(when target jsp is under web-inf folder) 【发布时间】:2014-10-10 05:22:58 【问题描述】:

我有两个 Jsp: 1。索引.jsp 2.createAccount.jsp (WEB-INF文件夹下)

Index.jsp 应该显示 createAccount 按钮。当我单击 createAccount 按钮时,应该将 jsp 转发到 createAccount.jsp。

当前问题:当我在Tomcat上部署代码时访问index.jsp时它会自动转发到createAccount.jsp而不显示createAccount按钮。

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head><title>Vendor Account</title></head>
  <body>
  <input type="button" value="Create Vendor Account" 
  onclick='<jsp:forward page="WEB-INF/jsp/createAccount.jsp"></jsp:forward>'>


  </body>
</html>

createAccount.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Vendor Account Creation Form</title>
</head>
<body>
This is a Vendor Creation Form.
</body>
</html>

实际输出:http://:8081/VendorPortal/index.jsp 这是一个供应商创建表格。

预期输出:

应显示创建供应商帐户按钮。

请告诉我如何实现上述场景。

【问题讨论】:

【参考方案1】:

Forward(无论是 jsp:forward 还是 requestDispatcher.forward() )是在服务器端执行的,而不是在客户端执行的,所以它需要控制器组件来调用它。它通常是servlet,但也可以是jsp。在该 jsp 中,您需要检测何时转发(不建议这样做,因为它将控制器逻辑与表示逻辑混合在一起)。

为什么不能直接从浏览器访问 WEB-INF/...? - 因为规范禁止它。

免责声明 - 这非常难看,不推荐,但您需要其他选择。 您可以使用 index.jsp 作为控制器。表单提交给自己,你检测到它并转发到目标 jsp。

像这样改变你的 index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%
if(request.getParameter("submit1") != null) 
%>
<jsp:forward page="WEB-INF/jsp/createAccount.jsp"></jsp:forward>    
<%
  return;

%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head><title>Vendor Account</title></head>
  <body>
<form action="index.jsp">
<input type="submit" name="submit1" value="Create Vendor Account">
</form>

  </body>
</html>

【讨论】:

【参考方案2】:

类似:

<form action='createAccount.jsp'><input type='submit' value='Create Vendor Account' /></form>

或使用 onclick javascript

<input type="button" value="Create Vendor Account" onClick="javascript:window.location='createAccount.jsp';"> 

使用适当的路径到你的目标jsp

【讨论】:

我已经尝试了上面的它不起作用,因为目标 jsp 在 web-inf 文件夹下。 您要么需要将该 jsp 移动到根文件夹(不是 WEB-INF),要么创建某种控制器,例如servlet 将接收该请求并转发到 jsp。 WEB-INF 中的文件不能直接访问。查找有关 MVC 模式的帖子以获取更多详细信息。 我无法移出 web-inf 文件夹。没有编写控制器servlet就没有替代方法吗?为什么对于简单的jsp转发来说,我们必须编写一个控制器或移出web-inf文件夹应该有一些替代方法我已经发布了问题以寻找其他替代方法或者为了一个强有力的理由,为什么它不能在不编写控制器的情况下发生。 请认真对待这个问题。这是一个非常基本的问题,但需要强有力的理由。

以上是关于JSP 中的问题:按钮 Click() 上的转发(当目标 jsp 在 web-inf 文件夹下时)的主要内容,如果未能解决你的问题,请参考以下文章

用按钮刷新jsp中的mysql表

再次绑定单击按钮上的排序功能

ng-click 在移动设备上的 Angularjs 问题

jsp重定向和转发

jsp学习之——关于请求转发和重定向的形象理解

jsp和Servlet中的请求转发分别如何实现?