如何从JSP调用servlet方法?

时间:2013-07-16 19:47:21

标签: java jsp servlets

我的Servlet中有以下方法。

private String process(HttpServletRequest arg0, HttpServletResponse arg1) {
    return ("a key");
} 

protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
    process(arg0, arg1);
}

在web.xml中添加以下代码

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>iusa.ubicacel.actions.map.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

在inicio.jsp中添加以下内容

<script type="text/javascript" src="<%=request.getContextPath()%>/MyServlet"></script>

在上面的src标签中,我想从MyServlet中的流程方法添加google map api url(我将从servlet中的数据库中检索)。我从我的方法错误的评论中理解。可以请任何人告诉我如何只使用这个jsp和servlet正确地完成它。

3 个答案:

答案 0 :(得分:1)

使用JSP编写servlet的最佳实践是遵循MVC模式:您的servlet将是控制器,JSP是视图,而模型将包含从servlet传递到JSP页面的域对象通过请求属性。

我不认为你现在所拥有的是完全错误的。但它只适用于需要从servlet生成所有javascript代码的特殊场景(这几乎不是真正的要求)。假设在你的情况下这是一个真正的要求(也许你从数据库中读取了整个javascript内容),可以定义一个呈现JS内容的servlet(并且可能将其映射为/main.js或其他东西,以便使JSP页面的动态生成透明。

最有可能的是,您只需要在运行时动态生成一堆小项(例如您的Google地图网址,API密钥或您在数据库中存储的任何内容)。如果是这种情况,那么您的JavaScript代码可以在.js文件中静态定义,并允许使用一些构造函数参数(或其他)进行初始化。

在此设置中,您的servlet将从数据库中读取url,通过调用request.setAttribute("googleMapsUrl", url)将其传递给视图,然后调用requestDispatcher.forward(...)将控制权传递给JSP。

在JSP中,您现在需要将静态脚本包含在src中,然后您可以使用另一个脚本标记来根据绑定到请求的动态值初始化您的代码:

<c:url value="/static.js" var="scriptUrl"/>
<script type="text/javascript" src="${scriptUrl}"></script>
<script type="text/javascript">
    // let's assume your static script defines an object called `MyGoogleMapsDriver`...
    var googleMapsDriver = new MyGoogleMapsDriver('${googleMapsUrl}');
</script>

我希望这会有所帮助。

答案 1 :(得分:0)

您不需要,您应该访问数据:

保存来自 Servlet 的数据 - &gt; request.setAttribute(&#34; MyObject&#34;,data);

JSP 之后,您加载了需要的数据 - &gt;的 request.getAttribute(&#34;为MyObject&#34;的

对不起我的英文, 祝你好运。

答案 2 :(得分:-1)

注意:我不建议这样做,但这是问题的直接答案。有关更多信息,请查看评论。


如果您只是'想要添加从流程方法返回的字符串',则需要执行以下操作:

  1. 制作方法publicstatic
  2. 然后编写以下scriptlet:<%= MyServletName.process(request, response); %>。这将输出处理方法的结果。
  3. 最后,您将拥有以下内容:

    <script src="<%= MyServletName.process(request, response); %>"></script>
    

    变量requestresponse在此范围内可用。

    重要:您尝试以这种方式实现的目标看起来像糟糕的设计。由于各种原因在这个答案中评论。检查@LuiggiMendoza和@DaveNewton的评论。

    以下是需要注意的几点:

    1. 编写scriplet很容易,但不建议任何意思。请参阅:How to avoid Java code in JSP files?

    2. 从JSP调用Servlet方法是错误设计。 Servlet方法旨在处理HTTP方法。它们不是为处理具体情况而设计的。

    3. 你要做的事情是反模式,你没有分开顾虑。 JSP页面应该是构造和呈现信息的视图。该信息应进行预处理。