在不使用HttpClient的情况下将处理后的JSP内容获取到spring控制器中?

2023-11-21

所以通常在 Spring 控制器中你只需返回一个ModelAndView对象并将请求转发到 JSP。

我需要做的实际上是获取已处理的 JSP 的内容,这样我就可以在 JSONP 响应中发送它(例如:callback("processed HTML from JSP");)

我知道我可以使用HttpClient获取内容,但想知道是否有办法通过调用以下内容来避免额外的步骤:

String contents = processJSP(modelAndView);




为极客更新以展示我的最终解决方案:

首先,您需要一个假的 HttpResponse 来保存响应:

@Service
public class SpringUtils {
    private static final Logger LOG = Logger.getLogger(SpringUtils.class);

    @Autowired private ViewResolver viewResolver;
    @Autowired private LocaleResolver localeResolver;

    public String renderView(HttpServletRequest request, ModelAndView mav) {
        try {
            View view = viewResolver.resolveViewName(mav.getViewName(), localeResolver.resolveLocale(request));
            HttpServletResponse localResponse = new MyHttpServletResponseWrapper(new DummyResponse());

            view.render(mav.getModel(), request, localResponse);

            return localResponse.toString();
        } catch (Exception e) {
            return "";
        }
    }

    public boolean doesViewExist(HttpServletRequest request, String viewName) {
        try {
            if (viewResolver.resolveViewName(viewName, localeResolver.resolveLocale(request)) != null) {
                return true;
            }
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        }

        return false;
    }

    static class MyHttpServletResponseWrapper extends HttpServletResponseWrapper {
        private StringWriter sw = new StringWriter();

        public MyHttpServletResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        public PrintWriter getWriter() throws IOException {
            return new PrintWriter(sw);
        }

        public ServletOutputStream getOutputStream() throws IOException {
            throw new UnsupportedOperationException();
        }

        public String toString() {
            return sw.toString();
        }
    }
}





虚拟响应

public class DummyResponse implements HttpServletResponse {
    public DummyResponse() {
    }

    public void setAppCommitted(boolean appCommitted) {}
    public boolean isAppCommitted() { return false; }
    public int getContentCount() { return -1; }
    public boolean getIncluded() { return false; }
    public void setIncluded(boolean included) {}
    public String getInfo() { return null; }
    public ServletResponse getResponse() { return null; }
    public OutputStream getStream() { return null; }
    public void setStream(OutputStream stream) {}
    public void setSuspended(boolean suspended) {}
    public boolean isSuspended() { return false; }
    public void setError() {}
    public boolean isError() { return false; }
    public ServletOutputStream createOutputStream() throws IOException {
        return null;
    }
    public void finishResponse() throws IOException {}
    public int getContentLength() { return -1; }
    public String getContentType() { return null; }
    public PrintWriter getReporter() { return null; }
    public void recycle() {}
    public void write(int b) throws IOException {}
    public void write(byte b[]) throws IOException {}
    public void write(byte b[], int off, int len) throws IOException {}
    public void flushBuffer() throws IOException {}
    public int getBufferSize() { return -1; }
    public String getCharacterEncoding() { return null; }
    public void setCharacterEncoding(String charEncoding) {}
    public ServletOutputStream getOutputStream() throws IOException {
        return null;
    }
    public Locale getLocale() { return null; }
    public PrintWriter getWriter() throws IOException { return null; }
    public boolean isCommitted() { return false; }
    public void reset() {}
    public void resetBuffer() {}
    public void setBufferSize(int size) {}
    public void setContentLength(int length) {}
    public void setContentType(String type) {}
    public void setLocale(Locale locale) {}

    public Cookie[] getCookies() { return null; }
    public String getHeader(String name) { return null; }
    public Collection<String> getHeaders(String arg0) { return null; }
    public Collection<String> getHeaderNames() { return null; };
    public String[] getHeaderValues(String name) { return null; }
    public String getMessage() { return null; }
    public int getStatus() { return -1; }
    public void reset(int status, String message) {}
    public void addCookie(Cookie cookie) {}
    public void addDateHeader(String name, long value) {}
    public void addHeader(String name, String value) {}
    public void addIntHeader(String name, int value) {}
    public boolean containsHeader(String name) { return false; }
    public String encodeRedirectURL(String url) { return null; }
    public String encodeRedirectUrl(String url) { return null; }
    public String encodeURL(String url) { return null; }
    public String encodeUrl(String url) { return null; }
    public void sendAcknowledgement() throws IOException {}
    public void sendError(int status) throws IOException {}
    public void sendError(int status, String message) throws IOException {}
    public void sendRedirect(String location) throws IOException {}
    public void setDateHeader(String name, long value) {}
    public void setHeader(String name, String value) {}
    public void setIntHeader(String name, int value) {}
    public void setStatus(int status) {}
    public void setStatus(int status, String message) {}
}

可能不是简单的方法。 也许将视图解析器注入控制器并使用特殊响应调用渲染会有所帮助,但不确定:

ViewResolver viewResoler = // injected
View view = viewReslover.resolveViewName(String viewName, Locale locale);
HttpServletResponse xresponse = // custom response, buffers data
view.render(Map model, HttpServletRequest request, HttpServletResponse xresponse);
String content = // extract conten from data from xresponse 

'

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不使用HttpClient的情况下将处理后的JSP内容获取到spring控制器中? 的相关文章

随机推荐

  • IBOutletCollection 的实际高效使用

    IBOutletCollection的实际用法看起来怎么样 不幸的是 苹果文档简单地提到了它 但没有给出更广泛的用法 好的 它与IB保持了一对多的关系 但是如何高效地访问和使用特定的对象呢 与标签名 如何保证对象的顺序 我最近使用它来轻松初
  • 如何将日期和时间从自然语言翻译为日期时间? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一种方法将 明天早上 6 点 或 下周一中午 翻译为适当的日期时间对象 我想过设计一套复杂的规则 但还有其他方法吗 解析日期时间 能够解析
  • 如何在 Java 中将文件读取为无符号字节?

    如何在 Java 中将文件读取为字节 需要注意的是 所有字节都必须为正数 即不能使用负数范围 这可以在 Java 中完成吗 如果可以 怎么做 我需要能够将文件的内容乘以一个常量 我假设我可以将字节读入 BigInteger 然后相乘 但是由
  • 多线程安全日志记录

    我们有一个在多个线程中运行并使用 Log4Net 作为日志记录框架的应用程序 我们遇到了一些日志事件未记录的情况 正如文档中提到的 文件附加器其他 Appender 是 not对于多线程操作是安全的 我在网上搜索解决方案或 Appender
  • 如何清除或清空 StringBuilder? [复制]

    这个问题在这里已经有答案了 我正在使用一个字符串生成器在循环和每 x 迭代中我想清空它并从一个空开始StringBuilder 但我看不到任何类似于 NET的方法StringBuilder Clear在文档中 只是delete方法看起来过于
  • Python 中 exec 和 eval 的使用

    所以我明白了什么exec and eval并且compile做 但为什么我需要使用它们呢 我不太清楚使用场景 谁能给我一些例子 以便我更好地理解这个概念 因为我知道这都是理论 我将举一个我使用过的例子eval我认为这是最好的选择 我正在编写
  • .net 中转换为短路径的标准方法

    寻找标准的防错误方法将 长名称 例如 C Documents and settings 转换为等效的 短名称 C DOCUME 1 我需要它来从我的 C 应用程序中运行外部进程 如果我用 长名称 中的路径提供它 它就会失败 如果您准备开始调
  • python 中未定义名称 exit

    以下是代码 当我运行时 我收到一条错误消息 指出 名称退出未定义 谁能告诉我为什么 非常感谢您的时间和关注 if len sys argv 4 do something pass else print usage something her
  • 将二进制转换为浮点值的计算器 - 我做错了什么?

    我有以下代码 它将 6 个浮点数以二进制形式写入磁盘并读回 include
  • 在本地计算机上使用 Jupyter Notebook 在远程计算机上运行代码

    我使用 Jupyter Notebook 来运行生物信息学分析 我喜欢它 然而 只有当我在个人计算机上运行它时 它才真正发挥得很好 不过 我经常使用具有多核的远程计算机进行分析 以减少处理时间 我希望能够在我的个人计算机上使用 Jupyte
  • Hilt 循环依赖

    我正在使用 Hilt 创建一个宠物项目 也许我遇到这个问题是因为我安装一切都在SingletonComponent class 也许我应该为每一个创建组件 宠物项目有一个NetworkModule UserPrefsModule 当我尝试创
  • Exchange Server(内部)是否支持 REST API?

    这份适用于 Exchange Server 的文档表明 大部分 API Web 服务都是基于 SOAP 的 https msdn microsoft com en us library office dd877012 v exchg 150
  • Python 正则表达式——无关匹配

    我想使用分割字符串 和空格作为分隔符 我想保留分隔符 除非它是空格 我尝试使用以下代码来实现此目的 def tokenize s import re pattern re compile s return pattern split s p
  • 数组既可以关联又可以索引吗?

    JavaScript 中的数组可以关联和索引吗 我希望能够通过位置或键值查找数组中的项目 Javascript 中不存在关联数组之类的东西 您可以使用对象文字 它look类似于关联数组 但它们具有无序属性 常规 Javascript 数组基
  • 如何保存球衣响应的文件?

    我正在尝试使用 Jersey 从网络资源下载 SWF 文件 我编写了以下代码 但无法正确保存文件 Response response webResource request MediaType APPLICATION OCTET STREA
  • 在 MySQL DB 中存储特殊字符的正确 PHP 方法

    使用 PHP 在 MSQUL 数据库中存储特殊字符 如下所示 以避免注入的最佳方法是什么 我现在就是这样做的 book text POST book text book text htmlentities book text ENT QUO
  • 链接到 Qt 中的共享库

    我刚刚创建了tinyxml 作为共享库 并且想弄清楚如何链接它 这是如何实现的 您必须在 pro 文件中添加 includepath 和 libs 像下面这样的东西 只需改变你的路径即可 LIBS ltinyxml LIBS L libs
  • 如何处理 WCF 客户端断开连接

    如何处理 WCF 客户端断开连接 我尝试过回调 但它似乎仅在客户端通过使用 断开连接 按钮 明确 断开连接时才有效 我希望我的服务器在客户端断开连接时收到通知 即使是手动断开连接或客户端进程崩溃 使用OperationContext Cur
  • 为什么 Firefox 以红色突出显示 HTML 过渡文档类型?

    看起来 Firefox 将其视为错误 这是什么意思 如果我将其更改为 Firefox 会正常处理它 顺便说一句 我使用的是 Firefox 12 0 如果您将鼠标悬停在该红线上 Firefox 会给您答案 几乎标准模式文档类型 预期的 查看
  • 在不使用HttpClient的情况下将处理后的JSP内容获取到spring控制器中?

    所以通常在 Spring 控制器中你只需返回一个ModelAndView对象并将请求转发到 JSP 我需要做的实际上是获取已处理的 JSP 的内容 这样我就可以在 JSONP 响应中发送它 例如 callback processed HTM