【问题标题】:Replace HTML code from Java Servlet dynamically动态替换 Java Servlet 中的 HTML 代码
【发布时间】:2016-03-04 02:22:05
【问题描述】:

我目前正在学习使用 JSP 和 Servlet 进行 Java 服务器端编程。我创建了一个简单的动态 Web 项目并将其部署在 apache tomcat 中。基本上,只有一个页面(jsp)作为前端,它会根据用户选择的内容(表单/单选按钮)随 servlet 动态更改。

The directory structure:
|   index.jsp
|
+---img
|       apples.jpg
|       oranges.jpg
|       salad.jpg
|       strawberries.jpg
|
\---WEB-INF
    |   web.xml
    |
    \---classes
            DynamicServlet.class
            DynamicServlet.java

我已将 web.xml 配置为启动 index.jsp @(http://localhost:port/contextname)

<web-app>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>    
</web-app>

相关index.jsp中的代码

...<head>...<style> 
.jumbotron {
    background-image: linear-gradient( rgba(0, 0, 0, ${grad}), rgba(0, 0, 0, ${grad}) ), url('${pageContext.request.contextPath}/img/${img}');
    background-size: cover;
    color: ${color};
}

...<body>
<div class="container"> <!-- jumbotron-container -->
    <div class="jumbotron">
        <h1>Hello, World!</h1> <!-- <====This line====> -->
    </div>  <!-- /jumbotron --> 
</div>  <!-- /jumbotron container -->

<div class="container"> <!-- form-container -->
    <form action="${pageContext.request.contextPath}/magic" method="get">
        <label class="form-label">Pick your favorite:</label>
        <div class="input-group form-group col-xs-6">
            <span class="input-group-addon">
                <input type="radio" name="option" value="apples">
            </span>
            <input type="text" class="form-control" disabled="disabled" placeholder="Apples">
        </div>  <!-- /apples -->

        <div class="...
        </div>  <!-- /oranges -->

        <div class="...
        </div>  <!-- /strawberries -->

        <div class="...
        </div>  <!-- /salad -->

        <input type="submit" class="btn btn-primary" value="Submit">
    </form> <!-- /form -->
</div>  <!-- /form-container -->

结果是这样的:

现在,当用户做出选择并提交时,servlet 会根据用户选择使用图像更新 jumbotron 封面。如您所见,我为此使用了EL。

Servlet 代码:

    ...doGet(HttpServletRequest.....{
           String option = request.getParameter("option");
           try {
                switch (option) {
                    case "apples":
                        request.setAttribute("img", "apples.jpg");
                        break;

                    case "oranges":....and so on

    }...
  ...request.getRequestDispatcher("index.jsp").forward(request, response);

它按预期工作。我无法弄清楚的是如何根据选择CHANGE jumbotron 文本。我正在寻找一种方法以某种方式替换 index.jsp 中的&lt;h1&gt;Hello, World!&lt;/h1&gt; 行,基于用户从servlet 中选择的自定义文本(类似于&lt;h1&gt;Yay, Apples!&lt;/h1&gt;),最好使用getRequestDispatcher()。实现这一目标的任何提示?

注意: 1. 登陆页面必须有一个静态的jumbotron text(Hello, World!)
2. 更改必须反映在同一页面上。我不打算创建一个 单独的jsp。

我是初学者,所以如果我错过了一个明显的解决方案,请体谅。谢谢。

【问题讨论】:

  • 只需设置一个请求属性并像在 doGet() 中一样转发到 JSP 吗?
  • @BalusC:我想到了,但不知道在 HTML 中放什么,因为我最初想要一个静态文本,然后从 servlet 中更改它。所以真的不能像我为 img 所做的那样决定把 EL 放在哪里。抱歉听起来有点糊涂。

标签: java html jsp servlets el


【解决方案1】:

我认为你的整个问题最终归结为这样的事情:

我想在 EL 表达式不计算结果时显示静态默认值

在这种情况下,请在条件表达式中使用 empty 运算符。

<h1>${empty title ? 'Hello World' : title}</h1>

那么,如果你想改变它,只需在 servlet 中的下面一行。

request.setAttribute("title", "Not a Hello World");

鉴于您基本上对名称为 option 的请求参数的值感兴趣,您甚至可以将其完全保留在视图端。

<h1>${param.option eq 'apples' ? 'Yay, Apples!' : param.option eq 'oranges' ? 'Yay, Oranges!' : 'Hello World'}</h1>

【讨论】:

  • +1 完美地总结了这个问题。是的,它起作用了,这正是我想要的。我一直在讨论应该如何使用三元 EL 运算符。你解释得很精彩。更多点提到了将其全部保留在视图方面的可能性,尽管我现在更喜欢 servlet 实现,因为这对我来说是一个学习练习。只有一件事,是否可以混合 EL 和文本?我试过:

    ${empty title ? “你好,引导程序!” :'是的,'标题'是!'}

    ,但这导致状态 500:JSP 错误。你能指出错误吗?
  • 谢谢!新的 EL 3.0 += 操作符就像一个魅力。 @BalusC:从现在开始,您就是我的 servlet/jsp 大师。 :D
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多