package com.huawei.sdtrp.command; import java.util.logging.Logger; /** * <pre> * 命令解析器,默认实现 * 方法一: * 使用ClassLorder来加载(包名+CMD+"Command")命令类路径 * 具有包名限制 * 方法二: * 在实际Action中,采用Spring注入包名称属性,再使用命令解析器实例化,具体的命令对象(可行,但是设计不太合理[不是Action要做的事情]) * 方法三: * 有没有另外的方式,来构造命令对象???(只知道命令字符串) * </pre> * @author cWX194449 * */ public class CommandParserImpl implements CommandParser { private static Logger log = Logger.getLogger(CommandParserImpl.class.getCanonicalName()); private String packageNameSpace = "com.huawei.sdtrp.command";//命令实现类包路径 @Override public Command parse(String command) { //这种方法,包名定死了 // String packageNameSpace = "com.huawei.sdtrp.command" ; String suffix = "Command"; String fullCommandName = packageNameSpace.concat(".").concat(command).concat(suffix); try { // return (Command)Class.forName(fullCommandName).newInstance(); return (Command)this.getClass().getClassLoader().loadClass(fullCommandName).newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } return null; /* String suffix = "Command"; ActionContext ac = ActionContext.getContext(); ac. WebApplicationContext ctx = WebApplicationContextUtils .getWebApplicationContext(config.getServletContext()); return (Command)ctx.getBean(command.concat(suffix)); return null; */ } } //Action package com.huawei.sdtrp.action; import com.huawei.sdtrp.command.Command; import com.huawei.sdtrp.command.CommandParser; import com.huawei.sdtrp.model.ExecutedResult; import com.huawei.sdtrp.model.Terminal; import com.opensymphony.xwork2.ActionSupport; /** * 基本Action * @author cWX194449 * */ public abstract class BaseAction extends ActionSupport { private static final long serialVersionUID = 1L; private Terminal terminal ;//表单属性搜集 public Terminal getTerminal() { return terminal; } public void setTerminal(Terminal terminal) { this.terminal = terminal; } private CommandParser commandParser ;//注入 public CommandParser getCommandParser() { return commandParser; } public void setCommandParser(CommandParser commandParser) { this.commandParser = commandParser; } private ExecutedResult executedResult ; public ExecutedResult getExecutedResult() { return executedResult; } public void setExecutedResult(ExecutedResult executedResult) { this.executedResult = executedResult; } @Override public String execute() throws Exception { // Object object = this.commandParser.parse(this.terminal.getTerminalData().getCmd()).execute(); // Object object = this.generateCommand(terminal).execute(); // return null == object ?"NULL":object.toString(); if(this.validateParameters()){ this.executedResult = this.generateCommand(terminal).execute(); } if(null == this.executedResult){//异常,构造命令执行结果 // String msg = this.terminal.getTerminalData().getCmd().concat("命令请求异常"); // throw new Exception(msg); //TODO 异常命令执行结果,构造 this.executedResult = new ExecutedResult(); } /*以流的形式,响应终端*/ this.responseTerminal(); // return this.executedResult.getResultStatus(); return null; } /** * 抽象工厂CommandParser产生Command对象 * @param terminal * @return */ public Command generateCommand(Terminal terminal){ // return this.commandParser.parse(this.terminal.getTerminalData().getCmd()); // Command command = this.commandParser.parse(this.terminal.getTerminalData().getCmd()); Command command = this.commandParser.parse(this.terminal.getCmd()); command.init(terminal); return command ; }; /** * 请求参数,检验(default:true相当于不验证) * 若false,需要重新赋值给命令执行结果 * (过滤非法请求) * @return */ public boolean validateParameters(){ return true; } /** * <pre> * 以流的形式,写回到终端 * 根据每个每个命令,返回的内容不一样,需要自已定义实现化 * </pre> */ public abstract void responseTerminal(); } //Action package com.huawei.sdtrp.action; import java.io.IOException; import java.io.OutputStream; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.huawei.sdtrp.model.ExecutedResult; import com.opensymphony.xwork2.ActionContext; /** * 注册动作 * 1、请求数据校验 * 2、授权检查 * @author cWX194449 * */ public class RegisterationAction extends BaseAction { private static final long serialVersionUID = -4767244117752570601L; private String encoding = "UTF-8"; @Override public boolean validateParameters() { // TODO Auto-generated method stub return true; } @Override public void responseTerminal() { ActionContext context = ActionContext.getContext(); HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE); Map session = context.getSession(); ExecutedResult executedResult = this.getExecutedResult(); try { OutputStream out = response.getOutputStream(); byte[] cmdBytes = "Cmd=".concat(executedResult.getCmd()).getBytes(encoding); out.write(cmdBytes);//命令回写 out.write("&".getBytes(encoding));//分隔符 byte[] codeBytes = "Code=".concat(executedResult.getCode()).getBytes(encoding); out.write(codeBytes);//状态回写 out.write("&".getBytes(encoding));//分隔符 byte[] descriptionBytes = "Description=".concat(executedResult.getDescription()).getBytes(encoding); out.write(descriptionBytes); // out.write("&".getBytes(encoding));//分隔符 out.flush(); // out.close(); } catch (IOException e) { e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } } }
留给自己用的
猜你喜欢
转载自cjb-666888.iteye.com/blog/1948979
今日推荐
周排行