2013年马上就要过去了,总结一些近期工作中出现的一些问题
(1)int的包装类型比较时始终不相等
项目中比较id时,始终都不相等,预期是相等的,当时快搞疯了,搞了半天才明白:id的类型是Interger,而Integer是对象,不能直接使用==来比较
@Test public void test_integer(){ Integer a=new Integer(2); Integer b=new Integer(2); System.out.println(a==b); System.out.println(a==(int)b); System.out.println(a.intValue()==b.intValue()); }
运行结果:
注意下面的结果:
(2)启动web项目时报错:找不到缓存类eCache
原因:项目使用的是hibernate 4的jar包,而配置文件中仍然使用hibernate3:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="packagesToScan"> <list> <value>com.kingbase.domain</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <!-- <prop key="hibernate.dialect"> org.hibernate.dialect.PostgreSQLDialect </prop> --> <!--<prop key="hibernate.max_fetch_depth">0</prop> --> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="current_session_context_class">thread</prop> </props> </property> </bean>
(3)Servlet中的成员变量是所有请求共用的
以下是一个普通的servlet:
package com.shop.jn.web.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet { private static final long serialVersionUID = 3853433476973310016L; private int count=0; /** * Constructor of the object. */ public TestServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the GET method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); count++; System.out.println("count:"+count); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); out.println(" <BODY>"); out.print(" This is "); out.print(this.getClass()); out.println(", using the POST method"); out.println(" </BODY>"); out.println("</HTML>"); out.flush(); out.close(); } }
里面有一个成员变量count,初始值是0,每次使用浏览器访问(Get方法)时会递增1,会打印count的值。
运行结果如下:
count:1
count:2
count:3
count:4
count:5
。。。
注意:在不同的电脑上访问,也是递增一,而不是重新从0开始计数,即使用的同一份count。
总结:尽管每次请求使用的是不同的线程(一般情况下)来处理,但是这些线程使用的都是同一个servlet对象,所以servlet中的成员变量不是线程安全的。如果非要在servlet中使用成员变量应该怎么办呢?
像struts2 一样使用ThreadLocal ,参考http://blog.csdn.net/cselmu9/article/details/9128397
(4)spring aop没有拦截我要拦截的方法
在做一个商品管理系统的时候,我有一个aop 类LoginTimesAop,需要拦截UserService 中的一个方法,目的是记录用户连续登录失败的次数,若连续登录失败3次,则锁定不允许再登录。
aop配置如下:
<aop:config> <aop:pointcut id="userServicePointcut" expression="execution(* com.shop.jn.service.UserService.login(..)) and args(..,user2)" /> <aop:aspect id="myAspect" ref="loginTimesAop"> <aop:around pointcut-ref="userServicePointcut" method="around" arg-names="school,user2" /> </aop:aspect> </aop:config>
但是始终没有像预期的那样拦截,要拦截的方法如下:
@Override /**** * Not allowed to be rewritten * @return : [state,user object] */ public Object[] login(final ActionContext actionContext, final GenericUser user) throws UnsupportedEncodingException, Exception { // logger.info("login(ActionContext actionContext,User user)"); Object[] results = new Object[2]; if (user == null) { results[0] = LoginUtil.LOGIN_RESULT_USERNAME_NULL; return results; } else { return login(user.getUsername(), user.getPassword()); } }
上述方法是在com.shop.jn.service.UserService的父类SUserService中。
最终找到了原因:因为我要拦截的方法不在UserService中,尽管是可以从父类SUserService继承的。
参考:http://hw1287789687.iteye.com/blog/1882540
修改方法:
方式一:把父类也包含进去
<aop:pointcut id="userServicePointcut" expression="(execution(* com.shop.jn.service.UserService.login(..)) or execution( * com.common.service.impl.SUserService.login(..)) ) and args(..,user2)" /> <aop:aspect id="myAspect" ref="loginTimesAop"> <!--<aop:before method="before3" arg-names="user2" pointcut-ref="userServicePointcut" /> --> <aop:around pointcut-ref="userServicePointcut" method="around" arg-names="user2" /> </aop:aspect> |
或者:
方式二:直接匹配父类,因为方法就在父类中
<aop:pointcut id="userServicePointcut" expression="execution(* com.common.service.impl.SUserService.login(..)) and args(..,user2)" /> <aop:aspect id="myAspect" ref="loginTimesAop"> <!--<aop:before method="before3" arg-names="user2" pointcut-ref="userServicePointcut" /> --> <aop:around pointcut-ref="userServicePointcut" method="around" arg-names="user2" /> </aop:aspect> |
(5)struts2 的form标签,会自动把当前的路径附加到表单提交的action的前面
商品管理系统有商品管理和超市管理,若没有登录直接进入就会跳转到登录页面。
比如直接在浏览器中输入http://localhost:8084/shop_goods/supermarket/viewSupermarket.action ,会自动跳转到登录页面。但是登录时报错,而直接进入登录页面登录就没有问题。这个问题折磨了一天半。
后来我直接看页面源码才发现问题。
浏览器中的源码是:
怎么凭空多出了上述红框中的内容?
但是登录页面JSP源码如下:
如果我把登录JSP源码改为:
在浏览器中查看源码就是:
<form id="user_login" name="user_login" action="/shop_goods/supermarket/user/login.action" method="post">
本来登录要提交到 http://localhost:8084/shop_goods/user/login.action
结果它给我提交到了http://localhost:8084/shop_goods/supermarket/user/login.action
结论就是:使用<s:form标签时,会自动把当前的路径附加到表单提交的action的前面
解决方法:
方式一:使用原生的form表单:
<form action="<%=basePath%>user/login" method="post" > <table> <tr><td>username:</td> <td><s:textfield name="user.username" value="admin" ></s:textfield> </td></tr> <tr><td>password:</td> <td><s:textfield name="user.password" value="admin2" ></s:textfield> </td></tr> <tr> <td colspan="2"><s:submit value="login" ></s:submit> </td></tr> </table> <form>
方式二:
使用s:url 标签,例如:
action='<s:url action="login" />'
欢迎访问 http://hw1287789687.iteye.com/blog/2053907
相关推荐
【文档描述】:这份文档是一个文员对于2013年工作的个人总结,涵盖了工作成就、存在的问题以及对未来工作的规划。 【标签】:“范文”——这表明这是一个可以作为模板或参考的文员年度工作总结样本。 【主要内容...
【标题】:“市教育学会2013年度工作总结.doc”反映了教育学会在2013年的工作概况,主要涉及教育改革、课程改革、高效课堂教学指导以及教育科研课题的推进。 【描述】:文档是对该年度教育学会工作的全面回顾,强调...
2013年的工作总结是对过去一年工作的全面回顾和反思,旨在分析个人在工作中取得的成绩、存在的问题及未来的改进方向。在2013年度工作总结中,作者提到,他在4月份加入xx环保节能电器有限公司,作为销售团队的一员,...
报告标题中的“2013年度工作总结报告”表明这是一份关于2013年工作的回顾和评估,而“灯光音响 - 付江涛本人”则指出了报告的主题聚焦于灯光音响领域,由付江涛本人撰写。描述部分进一步确认了付江涛在宏泰集团的...
标题中的“年底工作总结2013年工作计划ppt模板”表明,这是一个专门针对2013年初工作汇报设计的PPT模板,用于展示过去一年的工作成果和未来一年的工作规划。PPT作为一种强大的演示工具,能够以视觉化的方式呈现信息...
标题中的“2012年工作总结汇报2013年工作目标ppt模板.rar”表明这是一个PowerPoint演示文稿模板,用于展示2012年度的工作总结以及2013年的计划和目标。这类模板通常包含预设的布局、设计元素和指导性文本,帮助用户...
【顶呱呱幼儿园2013年度工作计划总结】这篇文档是关于顶呱呱幼儿园在2013年度的工作回顾和总结,展示了该园在这一年中的教育理念、管理措施、团队建设、教育教学以及安全工作等方面取得的成就和经验。 1. 教育理念...
【文档描述】:“2013年工厂年度工作总结.doc”是对过去一年工厂运营情况的全面回顾和总结。 【标签】:“范文” 【主要内容概要】: 这篇总结提到了作者入职一年来的个人成长和工作中遇到的问题。作者认识到工作...
这篇文档是对品管部在2013年工作的全面回顾和总结,展示了部门在质量管理上的成就、挑战和改进措施。以下是该总结的关键知识点: 1. **部门管理优化**:品管部通过引入系统化、标准化的思想,提升了工作效率。采用...
这篇文档是公司员工对其2013年度工作的全面回顾和总结,主要涵盖了以下几个关键知识点: 1. **工作经历与适应能力**:员工在2013年9月10日入职,从对工作环境和业务的不熟悉,到在领导和同事的帮助下快速适应,并...
标题中的“2013年电气工段工作总结”表明这是一个关于电气工程领域的年度总结报告,主要涵盖了2013年度的工作内容、成果、问题及改进措施。这份文档可能由一个企业的电气工段负责人编写,旨在回顾过去一年的工作,对...
这篇文档是2013年度一位教师的工作总结,主要涵盖了他在教育岗位上的思想成长、教育教学、分管工作和个人发展四个方面。 首先,在思想上,这位教师展现了对党的忠诚和对教育事业的热情。他积极参与各类学习培训,...
本篇文档是关于2012年度销售经理的工作总结以及对2013年的工作规划。以下是对其中关键知识点的详细解析: **一、年度工作总结** 1. **个人成长与收获**:销售经理在这一年中通过努力工作,对产品知识有了深入理解...
这篇文档是关于物业管理中心项目部在2013年度的工作总结,主要涵盖了该年度的工作成果、管理理念、经济指标和主要工作的详细回顾。 一、2013年物业管理工作指导思想: 在这一年,物业管理中心以成长和挑战为主题,...
【文档标题】提到的是"小学2013年工作总结和2014年工作要点",这是一份教育机构年度工作的回顾与规划。【描述】简单重申了文档的主题,即针对某小学过去一年的工作总结及下一年的工作重点。【标签】"范文"表明这是一...
2013年的工作总结反映出人力资源部在人才引进、制度建设和员工发展方面的努力,而在2014年的工作计划中,他们将继续优化这些领域,以期提升服务质量,降低成本,并加强内部沟通,创建更加和谐高效的工作环境。
在2013年的年度总结报告中,这位质量工程师详细回顾了他在这一年的工作成就、挑战以及未来展望。作为一名质量工程师,他的主要职责涵盖了项目跟踪、权限维护、配置管理、测试计划编制、问题解决等多个方面。他不仅在...
【文档描述】未提供详细描述,但根据标题可推测是关于2013年度该组织的工作回顾和总结。 【标签】"范文"表明这是一个示例或模板,用于展示如何撰写工作总结。 【部分内容】详细列举了2013年文联的四大活动: 1. 万...
【文档描述】:“2013年班组工作总结.doc”是对过去一年班组工作的回顾和总结,强调了班组建设、安全管理、生产技术管理和现场管理等方面的主要成就与不足。 【标签】:“范文” 【主要内容分析】: 在2013年的...
标题中的“2013年医院药房个人工作总结”表明这是一个关于个人在2013年度在医院药房工作的总结报告。描述中的信息简洁,仅提及文档格式,但标签“资料”暗示这是一份与药房工作相关的资料或文档。 在内容部分,可以...