- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我所在的项目使用 Spring-MVC 作为 Controller ,JSF 负责渲染。我现在需要在我的页面中实现一些 Ajax 功能。我所追求的是这样的:
第三步是我迷路的时候。到目前为止,我发现我必须使用纯 JSP 和图 block ( Handling Ajax Requests with Spring MVC Controllers ) 来实现“开箱即用”的此类功能。但我需要使用 JSF 和我的 XHTML 片段之一作为"template"。
我已经在 spring 配置文件中配置了 AJAX 解析器,但它用于返回 JSON 对象。现在我需要返回整个 HTML。我想使用服务器进行渲染,而不是从 JSON 对象模拟它并将 HTML 粘贴到页面上的正确位置。有没有办法“说服”org.springframework.faces.mvc.JsfView在AJAX请求中工作?这是我正常的 JSF 解析器配置:
<bean id="jsfViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.faces.mvc.JsfView" />
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".xhtml" />
</bean>
这是我的 JSON Ajax 解析器配置:
<bean id="ajaxViewResolver" class="com.myproject.web.springmvc.AjaxViewResolver">
<property name="ajaxView">
<bean class="com.myproject.web.springmvc.AjaxView" />
</property>
<property name="ajaxPrefix" value="ajax_"></property>
</bean>
这是我的 JSON AjaxViewResolver
中的代码:
public class AjaxViewResolver extends AbstractCachingViewResolver {
private Logger logger = Logger.getLogger(AjaxViewResolver.class);
private String ajaxPrefix;
private View ajaxView;
@Override
protected View loadView(String viewName, Locale locale) throws Exception {
logger.debug("loadView - enter");
logger.debug("loadView - viewName : " + viewName);
logger.debug("loadView - locale : " + locale);
View view = null;
if (viewName.startsWith(this.ajaxPrefix)) {
view = ajaxView;
}
logger.debug("loadView - returns : " + view);
return view;
}
public String getAjaxPrefix() {
return ajaxPrefix;
}
public void setAjaxPrefix(String ajaxPrefix) {
this.ajaxPrefix = ajaxPrefix;
}
public View getAjaxView() {
return ajaxView;
}
public void setAjaxView(View ajaxView) {
this.ajaxView = ajaxView;
}
}
这是我的 JSON AjaxView
类:
public class AjaxView extends AbstractView {
private Logger logger = Logger.getLogger(AjaxView.class);
/**
* Serialises the modelMap into a JSON string and writes the string to the outputStream
*/
@Override
protected void renderMergedOutputModel(Map map, HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.debug("renderMergedOutputModel - enter");
logger.debug("renderMergedOutputModel - map : " + map);
logger.debug("renderMergedOutputModel - request : " + request);
logger.debug("renderMergedOutputModel - response : " + response);
JSONSerializer serializer = new JSONSerializer();
serializer.exclude("*.class");
String jsonString = serializer.deepSerialize(map);
response.setContentType("text/plain; charset=UTF-8");
response.getOutputStream().write(jsonString.getBytes());
logger.debug("renderMergedOutputModel - response : " + response);
logger.debug("renderMergedOutputModel - exit");
}
}
有什么想法吗?
最佳答案
看起来从来没有人需要这个。我花了几个小时浏览 JSF 和 Spring MVC 代码,并找到了一个适合我的解决方案。我想在这里介绍一下,如果你们可以做一些同行评审。谢谢。
解决方案是基于com.myproject.web.springmvc.AjaxViewResolver
创建新的bean并进入房地产ajaxView
注入(inject)新创建的类nz.co.bnz.olb.ib.web.springmvc.AjaxJsfView
延伸org.springframework.faces.mvc.JsfView
.
这是 Spring 配置的片段:
<bean id="ajaxJsfViewResolver" class="nz.co.bnz.olb.ib.web.springmvc.AjaxViewResolver">
<property name="ajaxView">
<bean class="nz.co.bnz.olb.ib.web.springmvc.AjaxJsfView">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".xhtml" />
</bean>
</property>
<property name="ajaxPrefix" value="ajaxJsf_"></property>
</bean>
如你所见,我必须传入 prefix
和suffix
属性来定义如何形成 XHTML 文件的 URL(对于 JsfView
是必需的)。我还创建了新的前缀 ajaxJsf_
对于这个解析器。这是新类:
public class AjaxJsfView extends JsfView {
private Logger logger = Logger.getLogger(AjaxJsfView.class);
private String prefix;
private String suffix;
private String viewName;
@Override
protected void renderMergedOutputModel(Map map, HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.debug("renderMergedOutputModel - enter");
logger.debug("renderMergedOutputModel - map : " + map);
logger.debug("renderMergedOutputModel - request : " + request);
logger.debug("renderMergedOutputModel - response : " + response);
viewName = (String)map.get("view");
super.renderMergedOutputModel(map, request, response);
logger.debug("renderMergedOutputModel - response : " + response);
logger.debug("renderMergedOutputModel - exit");
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
@Override
public String getUrl() {
return getPrefix() + viewName + getSuffix();
}
@Override
public void setUrl(String arg0) {
super.setUrl(arg0);
}
}
用作“ View ”的实际文件的定义可以在 renderMergedOutputModel
中看到。方法。它取自 map 上关键“ View ”下的“模型”。 “ View ”的完整路径是在重写方法 getUrl()
中实现的。因此,作为最后一步,我必须实现 Controller 的方法来返回其中包含预期值的 map :
public ModelAndView getSomeTest(HttpServletRequest request, HttpServletResponse response){
Map<String, Object> map = new HashMap<String, Object>();
map.put("view", "pathToMyXHTMLFile/someTest");
map.put("name", "tomik");
ModelAndView returnModelAndView = new ModelAndView("ajaxJsf_increaseLimit", map);
return returnModelAndView;
}
最后,这是使用的 XHTML,并最终以带有填充值的 HTML 形式返回:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core">
<p>Hello <h:outputText value="#{name}"/></p>
</ui:composition>
关于java - 如何使用 springmvc 作为 Controller 渲染对 jsf 页面的 ajax 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5187756/
我正在尝试检查 Entry 中是否存在重复项,并使用内联消息提醒用户该数字存在。 $(document).ready(function(){ $("#con1").blur(function(
我有一个基于类的 View 。我在引导模式上使用 Ajax。为了避免页面刷新,我想使用此类基于 View 返回 JSON 响应而不是 HTTP 响应,但我只看到了如何为基于函数的 View 返回 JS
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个大型内部企业基于 Web 的应用程序在 IIS6 上运行 ASP.NET 3.5,生成 401 个“未经授权”响应,然后是 200 个“Ok”响应(如 Fiddler 所述)。我知道为什么会发
感谢您研究我的问题。 我有一个node/express服务器,配置了一个server.js文件,它调用urls.js,而urls.js又调用 Controller 来处理http请求,所有这些都配置相
当我使用以下命令时,我得到正确的 JSON 响应: $ curl --data "regno=&dob=&mobile=" https://vitacademics-rel.herokuapp.co
我有一个非常简单的 RESTful 服务,它通过 POST 接收一些表单数据,其目的是在云存储(Amazon S3、Azure Blob 存储等)中简单地保留文本主体(具有唯一 ID)作为一个文件..
UDP 不发送任何 ack,但它会发送任何响应吗? 我已经设置了客户端服务器UDP程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗? 我的假设是; 客户端 --> 广播服务器地
我有一个电梯项目,其中 有一个扩展 RestHelper 的类,看起来像这样 serve{ "api" / "mystuff" prefix { case a
我们正在寻求覆盖 Kong 错误响应结构并编写自定义消息(即用我们的自定义消息替换“超出 API 速率限制”、“无效的身份验证凭据”等)。 我们要找的错误响应结构(代码是自定义的内部错误代码,与HTT
我正在尝试监听 EKEventStoreChangedNotification 以检查当我的应用程序处于后台时日历是否已更改。 我在 View Controller 的 initWithNibMeth
我了解 javascript,并且正在学习 ASP.NET C# 我想要做什么(完成的是javascript): document.getElementById('divID-1'
是否可以过滤所有 har 对象并仅获取 POST 请求/响应?也许在初始化 BrowserMobProxyServer 期间是这样做的方法?我需要将 har 对象保存到文件中并上传到 har 查看器。
我正在尝试向 Oauth 的 API 发送响应。遗憾的是,Symfony2 文档在解释 $response->headers->set(...); 的所有不同部分方面做得很差。 这是我的 OauthC
我正在尝试测试用例来模拟 api 调用,并使用 python 响应来模拟 api 调用。 下面是我的模拟, with responses.RequestsMock() as rsps: url
在尝试在 Haskell 中进行一些领域驱动设计时,我发现自己遇到了这个问题: data FetchAccessories = FetchAccessories data AccessoriesRes
我正在与 ANT+ USB 棒连接,并用项目 react 器替换我自己天真的“MessageBus”,因为它看起来非常合适。 USB接口(interface)本质上是异步的(单独的输入/输出管道),我
我正在将项目迁移到AFNetworking 2.0。使用AFNetworking 1.0时,我编写了代码来记录控制台中的每个请求/响应。这是代码: -(AFHTTPRequestOperation *
我有以下代码段。 ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){
我有问题......我在 php 中有一个监听器脚本可以执行以下操作: if ($count != 1) {echo 'no';} else { echo "yes";} 因此它会回显"is"或“
我是一名优秀的程序员,十分优秀!