我已将jQuery Terminal Emulator集成到JSF应用程序中,目的是在ManagedBean中而不是在jQuery中处理命令。 我已经成功地向bean发送了命令,然后将结果设置在回调参数中,但是我无法弄清楚如何在终端中显示这个结果。
以下是相关的代码段:
terminal.xhtml
<h:form>
<p:remoteCommand name="sendRemoteCommand"
action="#{processCommand.rcAction}"
oncomplete="handleComplete(xhr, status, args)" />
</h:form>
<h:panelGroup id="term_demo" layout="block" />
<h:outputScript library="primefaces" name="jquery/jquery.js"
target="body" />
<h:outputScript library="js" name="jquery.terminal-min.js" />
<h:outputScript target="body">
$(document).ready(function() {
$('#term_demo').terminal(function(command, term) {
if (command !== '') {
try {
var result = sendRemoteCommand([ {
name : 'command',
value : command
} ]);
if (result !== undefined) {
term.echo(new String(result));
}
} catch (e) {
term.error(new String(e));
}
} else {
term.echo('');
}
}, {
greetings : 'Javascript Interpreter',
name : 'js_demo',
height : 200,
prompt : 'js> '
});
});
function handleComplete(xhr, status, args) {
// Need to find a way to return args.result
// to the terminal!
}
</h:outputScript>
ProcessCommand.java
@ManagedBean
@RequestScoped
public class ProcessCommand {
private String command;
public void rcAction() {
FacesContext context = FacesContext.getCurrentInstance();
Map map = context.getExternalContext().getRequestParameterMap();
command = (String) map.get("command");
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.addCallbackParam("result", command + "_ok");
}
在JS函数handleComplete()
中,变量args.result
被正确设置为“[command] _ok”,并且我想返回它,以便当jQuery终端函数调用{{1}时在Primefaces'sendRemoteCommand
标记中指定,它能够获得后者返回的结果
非常感谢提前!
编辑:我正在使用JSF 2.0(Mojarra 2.2,Glassfish 4,Primefaces 4.0)
答案 0 :(得分:1)
我最终改变了策略并传递了一个servlet URI作为terminal
函数的第一个参数,感谢GSON,它可以处理终端发送的JSON请求并发送JSON响应。
这样更清洁:)
在Terminal.xhtml中
jQuery(function($) {
$('#terminalPanel').terminal("terminalSerlvet", {
login: false,
greetings: "Javascript Interpreter",
tabcompletion: true,
completion: function(term, string, callback) {
callback(cmd);
}});
});
Servlet:
@WebServlet(urlPatterns = "/terminalSerlvet")
public class JSONTerminalServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
System.out.println("Entering JSONTerminalSerlvet#doPost...");
Gson gson = new Gson();
StringBuilder sb = new StringBuilder();
BufferedReader reader = request.getReader();
TerminalCommandData cmdData;
try {
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
cmdData = (TerminalCommandData) gson.fromJson(sb.toString(), TerminalCommandData.class);
} finally {
reader.close();
}
if (cmdData != null) {
// Write response data as JSON.
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(new Gson().toJson(buildJsonResponse(cmdData)));
}
}