如果一个Use Case中既有读操作,又有写操作
如果一个Use Case中既有读操作,又有写操作,则试试能否把读操作全部做完,再进行写操作。不要混起来做。 好处就是:读操作放一起,就有希望把它们抽出来作为一个方法,以后别的类可以重用它。
如果一个Use Case中既有读操作,又有写操作,则试试能否把读操作全部做完,再进行写操作。不要混起来做。 好处就是:读操作放一起,就有希望把它们抽出来作为一个方法,以后别的类可以重用它。
偶惊奇地发现,我不用作任何"+1", "-1"之类的操作 String str = "prefixKeywordPostfix"; String KEYWORD = "Keyword"; String prefix = str.substring(0, str.indexOf(KEYWORD)); //"prefix" String keyword = str.substring(str.indexOf(KEYWORD), str.indexOf(KEYWORD) + KEYWORD.length()); //"Keyword" String postfix = str.substring(str.indexOf(KEYWORD)+ KEYWORD.length()); //"Postfix"
这样就行: String str = prefix + keyword + postfix; //如"prefix" + "Keyword" + "Postfix" return str.substring(prefix.length(), str.indexOf(postfix)); //"Keyword"
invalidate: ((org.apache.struts2.dispatcher.SessionMap<String, Object>) session).invalidate(); http://struts.apache.org/2.0.14/docs/how-do-we-get-invalidate-the-session.html 创建新session: 不需要自写代码。因为当你用session.put(xxx,xxx)时,Struts2如果发现当前没有httpSession就会自己新建一个。 //org.apache.struts2.dispatcher.SessionMap public V put(K key, V value) { synchronized (this) { if (session == null) { session = request.getSession(true); } …. }
否则,会死的很难看
private static void generateSetters(Class<?> clazz) { Method[] methods = clazz.getMethods(); for (Method m : methods) { if (m.getName().startsWith(“set”) && m.getParameterTypes().length == 1){ System.out.println(“bean.” + m.getName() + “(\”abc\”);”); } } } will print: bean.setName(“abc”); bean.setUserId(“abc”); You can put it inside eclipse as a code template: ${:import(java.lang.reflect.Method)} public static void main(String args[]) { Class<?> clazz = ${Bean}.class; …
Generate all the setter invocation statements of a javabean Read More »
Convention提供了一个UnknownHandler。如果系统按命名习惯或者Annotation都找不到Action,就会用这个UnknownHandler再去web下或者classpath下找出一个Action 这个Handler不应该用。正式系统里的Action是严肃的,要么按命名习惯推导出,要么用Annotation显式定义好,不能随便乱找 所以,要禁掉这个Handler. 办法分两步: 1.自己写一个空的Handler public class MyUnknownHandler implements UnknownHandler { @Override public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException { return null; } @Override public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException { return null; } @Override public Object handleUnknownActionMethod(Object action, String methodName) throws NoSuchMethodException { return null; } } …
[Struts2 Convention] 禁止Convention的UnknownHandler Read More »
作为View的Result文件,如freemarker文件,不一定放在web目录里面,也没放在classpath下 这时候还能用Convention插件吗? 答案是:可以。解决方案分为两步: 1. 自定义 "struts.convention.resultMapBuilder" 在你自定义的resultMapBuilder中,你要根据action的路径去其对应的View目录中搜得所有View文件,然后将这些文件交给Convention Plugin处理 下面是一个参考实现: public class MyResultMapBuilder extends DefaultResultMapBuilder { @Override protected void createFromResources(Class<?> actionClass, Map<String, ResultConfig> results, String resultPath, String resultPrefix, String actionName, PackageConfig packageConfig, Map<String, ResultTypeConfig> resultsByExtension) { // 找到本action对应的View目录 // //其中getTemplateRootDir()是你的view文件的根目录 File actionTemplateDir = new File(getTemplateRootDir(), flatResultLayout ? resultPath : resultPrefix); // 列出该目录中所有的View文件 Collection<File> actionTemplates = …
[Struts2 Convention] 如果Result文件不在web下或classpath下,怎么办? Read More »
https://cwiki.apache.org/confluence/display/WW/Convention+Plugin#ConventionPlugin-Overwritingpluginclasses
转自: http://www.coderanch.com/t/508779/ORM/java/Ehcache-TimeToLiveSecond-TimeToIdleSeconds timeToLiveSecond is the time in seconds from the point of creation in the cache till it expires (regardless of how frequently it is accessed in that time) timeToIdleSeconds is the time in seconds before an object in the cache expires if it is not accessed.