当前位置: 首页 > 知识库问答 >
问题:

更改html页面的一部分而不刷新整个页面

章昊
2023-03-14

我有一个html页面和一个带有Thymeleaf模板引擎的java应用程序,我正在寻找一个教程,向服务器发出请求,并根据响应仅呈现页面的一部分。

此时,我有一些按钮具有相同页面的链接,带有不同的参数,我的div是基于属性文章列表创建的(我从服务器接收基于button_id)

超文本标记语言:

<a href="/index?button_id=1"> button 1 </a>
<a href="/index?button_id=2"> button 2 </a>

<div class="" th:each="article : ${articleList}">
    <p th:text="${article.getText()}">Article</p>

Java:

public class NodController implements IGTVGController {
  public void process(
        final HttpServletRequest request, final HttpServletResponse response,
        final ServletContext servletContext, final TemplateEngine templateEngine) 
        throws Exception {

    final WebContext ctx = new WebContext(request, response, servletContext, request.getLocale());

    Integer button_id = Integer.valueOf(request.getParameter("button_id"));
    List<String> articleList = getArticleList(button_id);
    request.getSession().setAttribute("articleList",articleList);

    templateEngine.process("/index", ctx, response.getWriter());
    }

我希望我的按钮处理我的索引控制器,只更改文章的div,而不是刷新整个页面。

我尝试过使用ajax,但是我没有找到我能理解的服务器端代码示例,所以我不知道如何处理请求,也不知道如何使用servlet。我也没有设法向我当前的控制器发送任何请求。

我还在thymeleaf api中发现了这种方法:

public final void process(String templateName, IContext context,
                      IFragmentSpec fragmentSpec, Writer writer)

IFragmentSpec应该“选择要处理的模板片段(一旦读取和解析),丢弃模板的其余部分”,但我找不到关于它的更多信息,比如如何使用它,或者它是否是我正在寻找的。

共有2个答案

柯波峻
2023-03-14

您必须使用AJAX从服务器动态加载内容。

>

  • 考虑将您的前端设计为SPA。查看AngularJS或Knockout。

    此外,如果这只是应用程序的一小部分,则可以使用类似jQuery AJAX的老式方法。

    我强烈建议考虑通过使用服务器作为REST服务和前端作为客户端来分离关注点。如果您想保持大型应用程序的可维护性和可扩展性,这是最佳做法。

    您应该寻找如何使用服务器端技术实现REST的教程。这是很常见的做法,所以我认为你应该能够找到一个。

    如果你有任何问题,我很乐意更新这个答案。

  • 红智鑫
    2023-03-14

    这是javascript代码

    //get text 1 by ajax
        function getText1(urlstarted) {
            xmlHttp = false;
            if (window.XMLHttpRequest) { // Mozilla, Safari,...
                xmlHttp = new XMLHttpRequest();
                if (xmlHttp.overrideMimeType) {
                    // set type accordingly to anticipated content type
                    //http_request.overrideMimeType('text/xml');
                    xmlHttp.overrideMimeType('text/html');
                }
            } else if (window.ActiveXObject) { // IE
                try {
                    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    try {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {}
                }
            }
            if (!xmlHttp) {
                alert('Cannot create XMLHTTP instance');
                return false;
            }
    
            var url=urlstarted+"/jsp/viewText1.jsp"; //put the link to ur Ajax page here
             xmlHttp.onreadystatechange = startAjaxingText;
            xmlHttp.open("GET", url, true);
            xmlHttp.send(null);
        }
        function startAjaxingText() {
            if (xmlHttp.readyState != 4) {
    
                document.getElementById('image').style.display='block' ;
                document.getElementById('result').style.display='none' ;
            }
    
            if (xmlHttp.readyState == 4) {
    
                if (xmlHttp.status == 200) {
    
    
    
    
                        document.getElementById('image').style.display='none' ;
                        document.getElementById('result').style.display='block';
                        document.getElementById('result').innerHTML = xmlHttp.responseText;
    
    
                } else {
                    alert("There was a problem with the request.");
                }
            }
    
        }
    //get text 2 by ajax
        function getText2(urlstarted) {
            xmlHttp = false;
            if (window.XMLHttpRequest) { // Mozilla, Safari,...
                xmlHttp = new XMLHttpRequest();
                if (xmlHttp.overrideMimeType) {
                    // set type accordingly to anticipated content type
                    //http_request.overrideMimeType('text/xml');
                    xmlHttp.overrideMimeType('text/html');
                }
            } else if (window.ActiveXObject) { // IE
                try {
                    xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (e) {
                    try {
                        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {}
                }
            }
            if (!xmlHttp) {
                alert('Cannot create XMLHTTP instance');
                return false;
            }
    
            var url=urlstarted+"/jsp/viewText2.jsp"; //put the link to ur Ajax page here
             xmlHttp.onreadystatechange = startAjaxingText2;
            xmlHttp.open("GET", url, true);
            xmlHttp.send(null);
        }
        function startAjaxingText2() {
            if (xmlHttp.readyState != 4) {
    
                document.getElementById('image').style.display='block' ;
                document.getElementById('result').style.display='none' ;
            }
    
            if (xmlHttp.readyState == 4) {
    
                if (xmlHttp.status == 200) {
    
    
    
    
                        document.getElementById('image').style.display='none' ;
                        document.getElementById('result').style.display='block';
                        document.getElementById('result').innerHTML = xmlHttp.responseText;
    
    
                } else {
                    alert("There was a problem with the request.");
                }
            }
    
        }
    

    现在你的扣子会像这样

        <input name="button_1" id="button_1" type="button" value="button_1" onclick="getText1('<%=request.getContextPath()%>');" />
         <input name="button_2" id="button_2" type="button" value="button_2" 
    onclick="getText2('<%=request.getContextPath()%>');" />
    

    你的div看起来像

    <div id="image" style="display:none"><img src="<%= request.getContextPath()%>/images/ajax-loader.gif" alt="Loading...."/> </div>
                    <div id="result" style="display:none"></div></td>
    

    你的viewText1.jsp页面,做ajax部分

    out.println("text1");//or any logic u want 
    

    您的视图文本2。做ajax部分的jsp页面

     out.println("text2");//or any logic u want 
    

    注意:viewText1的结果。jsp或viewText2。jsp必须是文本,可以是表,也可以是段落

     类似资料:
    • 问题内容: 这有可能吗? 这是问题所在: 我有一个使用此URL的关键字搜索(搜索后):http:// localhost / thi / search?keyword = key 然后我有一个使用AjaxForm插件(jquery)的滑块搜索… 当我执行滑块搜索时,显然我仍然会在关键字搜索URL中(因为请求是通过ajax发送的) 有没有办法将当前网址更改为类似http:// localhost /

    • 问题内容: 我从数据库获取数据并将其显示在div中…我要做的是单击链接时应更改div的内容 一种选择是通过URL将参数传递给自身并重新加载页面… 我需要这样做而 无需重新加载\刷新 … 目的是当我单击任何链接时,div和php变量的内容无需刷新即可更新....这样 用户可以看到新数据 ,然后如果执行某些查询,它将在新变量上 ps我知道它将需要一些AJAX,但我不知道AJAX ..所以请以我可以学习

    • 问题内容: 我有一个附加到Java程序的基本html文件。每当刷新页面时,此java程序都会更新HTML文件的部分内容。我只希望在每个时间间隔后刷新页面的该部分。我可以将要刷新的部分放在中,但是我不确定如何仅刷新该内容。任何帮助,将不胜感激。谢谢。 问题答案: 为此使用Ajax。 构建一个函数,该函数将通过ajax获取当前页面,而不是整个页面,仅从服务器中获取有问题的div。然后(再次通过jQue

    • 问题内容: 我有一个文件,其中我在页面顶部显示外部页面(使用iframe),其他部分是写在文件中的html代码的输出。 HTML代码如下所示: 现在,我想以编程方式刷新页面而不刷新。 我的问题是我可以不刷新页面就刷新页面吗? 答案/提示将不胜感激。 问题答案: 该嵌在主HMTL页面(或在JSP)。因此,如果刷新页面,则肯定会再次加载iframe。 为了避免这种情况,我可以考虑以下两种选择: 使用A

    • 我有一个php网站,它必须以分页格式在页面上显示项目列表,我使用php实现了这一点,但现在我想在其中添加ajax功能,所以我添加了这个函数,在分页部分单击page no时调用。Ajax/jQuery函数:(.paginate是页面链接的类) 我的分页功能有点像这样: 在我想要显示分页的div的页面上,我得到的是整个页面作为响应,而不是分页的div。我已经将分页的div分离到一个单独的页面,并将其包

    • 问题内容: 我知道我们可以通过定期轮询更改来做到这一点。这可以通过AJAX(例如与一起使用)来实现。 但是我想知道还有其他方法可以做到这一点吗?其他成本更低或更有效的方法?出色的聊天客户端遵循什么逻辑?一旦您开始键入,另一端就会知道您正在键入。 我们在stackoverflow上遵循什么机制来更新upvote计数或显示已进行编辑等操作,而无需刷新页面? 问题答案: 当要使客户端和服务器保持实时(近