我想做的很容易:
我有一个关于某些变量值的菜单。让我告诉我们代码:
<s:div cssClass="menu_table" id="loginContent">
<c:choose>
<c:when test="${not action.loggedOn}">
<s:form action="checkLogin" theme="simple">
<span id="err" class="menu_err">
<s:property value="error" />
</span>
<s:textfield name="nickname" />
<s:password name="password" />
<span class="menu_span">
<sj:submit targets="loginContent" value="Login" />
</span>
</s:form>
</c:when>
<c:when test="${action.loggedOn}">
<s:form action="checkLogout" theme="simple">
<s:label cssClass="menu_title" value="Ciao #{nickname}" />
<span class="menu_span">
<sj:submit targets="loginContent" value="Logout" />
</span>
</s:form>
</c:when>
</c:choose>
</s:div>
行为很简单:如果action.loggedOn为true,我加载一部分代码,否则加载另一部分代码。
现在,当我加载每一个或另一个时,我可以对服务器进行AJAX调用(通过使用JQuery支持),更改错误变量的值(是一个字符串)和loggedOn的值(是boolean)。
我想知道(通过使用这个框架)是否可以在服务器上直接执行这部分代码并在客户端上重新加载? (换言之,我的意思是:是否可以执行jsp页面服务器端(对于标准请求,但这次使用ajax)并且只向客户端呈现一小部分代码)
或者(我认为)我需要创建客户端函数并重新绘制我的div(例如,使用JSON变量,或其他Jquery函数),因为ajax调用后的字符串结果?
使用JSF和其他框架可以实现第一种选择。我也可以用Struts做到这一点吗?希望我的问题很明确:))
只是好奇。
由于
答案 0 :(得分:1)
根据我的知识,您提出的要求是不可能的,您必须在您的帖子中找到您所建议的重绘选项
答案 1 :(得分:1)
我认为最干净的方法是在控制器中创建一个新方法,只返回菜单部分的jsp(就像你在问题中显示的那个)。您可以进行ajax调用,然后在菜单的容器中加载新的jsp:
$.ajax({
url: 'yourUrl',
success: function(html){
$('#menuContainer').html(html); },
error: function() {
alert('There was an error!'); }
});
在客户端执行JavaScript时,始终在服务器中执行JSP。但是你可以在控制器中创建几个方法,它们只能渲染整个页面的一部分,并使用它们只更新一个部分。
编辑:如何在同一控制器方法中发送json或html
<action name="HelloWorld" class="vaannila.HelloWorld">
<result name="sendJson" type="json"/>
<result name="sendHTML">/url/yourjsp.jsp</result>
</action>
并在你的行动中像这样
public String execute(){
if(json){
return "sendJson";
}
if(html){
return "sendHTML";
}
}