0

我的 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 的 process 方法中添加 google map api url(我将从 servlet 的数据库中检索)。我从评论中了解到我的方法是错误的。谁能告诉我如何仅使用此 jsp 和 servlet 即可正确执行此操作。

4

3 回答 3

1

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

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

最有可能的是,您只需要在运行时动态生成一堆小项目(例如您的谷歌地图 url、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>

我希望这有帮助。

于 2013-07-16T20:08:48.777 回答
0

你不需要那个,你应该访问数据:

从Servlet保存数据-> request.setAttribute( "MyObject", data);

JSP中加载需要的数据后 -> request.getAttribute( "MyObject" ) ;

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

于 2015-09-12T15:02:58.727 回答
-1

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


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

  1. 让你的方法publicstatic.
  2. 然后编写以下脚本:<%= MyServletName.process(request, response); %>. 这将输出处理方法的结果。

最后,您将拥有以下内容:

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

变量requestresponse在此范围内可用。

重要提示:您试图以这种方式实现的东西看起来像一个糟糕的设计。出于各种原因,在此答案中发表了评论。检查@LuiggiMendoza 和@DaveNewton 的评论。

以下是需要考虑的几点:

  1. 编写脚本很容易,但无论如何都不推荐。请参阅:如何避免 JSP 文件中的 Java 代码?.

  2. 从 JSP 调用 Servlet 方法是不好的设计。Servlet 方法旨在处理 HTTP 方法。它们不是为处理特定情况而设计的。

  3. 您正在尝试做的事情是反模式,您没有分离关注点。JSP 页面应该是一个结构和呈现信息的视图。该信息应进行预处理。

于 2013-07-16T19:53:30.353 回答