`

2013年工作中一些问题回顾和总结

    博客分类:
  • Java
阅读更多

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

  • 大小: 9.8 KB
  • 大小: 28.9 KB
  • 大小: 8.8 KB
  • 大小: 26.3 KB
  • 大小: 6 KB
5
0
分享到:
评论
7 楼 a666sh 2016-07-09  
我也遇到这个问题了,BaseDao继承下来的类,在上面使用@Transactional注解没有用,然后重写父类方法,就有那个被spring管理的小标志了
6 楼 hw1287789687 2014-04-29  
更多总结见:
http://hw1287789687.iteye.com/blog/2053907
http://hw1287789687.iteye.com/blog/2056423
5 楼 hw1287789687 2014-04-29  
huxi 写道
不错哦,善于总结,时间长了,积累一定很多 加油 

呵呵,一来是总结,备忘,遇到相同的问题分分钟就可以搞定;二来希望分享出来,可以帮助技术同仁
4 楼 huxi 2014-04-29  
不错哦,善于总结,时间长了,积累一定很多 加油 
3 楼 快乐的boy 2014-01-01  
 
2 楼 hw1287789687 2013-12-31  
sunzhong1030 写道
我兴冲冲的跑进来一看,发现楼主真的是技术控. 我原以为是可以拿给领导看的工作总结呢.

呵呵,并非技术控,这只是在java技术方面的总结
1 楼 sunzhong1030 2013-12-31  
我兴冲冲的跑进来一看,发现楼主真的是技术控. 我原以为是可以拿给领导看的工作总结呢.

相关推荐

    文员2013年度工作总结.doc

    【文档描述】:这份文档是一个文员对于2013年工作的个人总结,涵盖了工作成就、存在的问题以及对未来工作的规划。 【标签】:“范文”——这表明这是一个可以作为模板或参考的文员年度工作总结样本。 【主要内容...

    市教育学会2013年度工作总结.doc

    【标题】:“市教育学会2013年度工作总结.doc”反映了教育学会在2013年的工作概况,主要涉及教育改革、课程改革、高效课堂教学指导以及教育科研课题的推进。 【描述】:文档是对该年度教育学会工作的全面回顾,强调...

    2013年度工作总结与计划.docx

    2013年的工作总结是对过去一年工作的全面回顾和反思,旨在分析个人在工作中取得的成绩、存在的问题及未来的改进方向。在2013年度工作总结中,作者提到,他在4月份加入xx环保节能电器有限公司,作为销售团队的一员,...

    2013年度工作总结报告.pdf

    报告标题中的“2013年度工作总结报告”表明这是一份关于2013年工作的回顾和评估,而“灯光音响 - 付江涛本人”则指出了报告的主题聚焦于灯光音响领域,由付江涛本人撰写。描述部分进一步确认了付江涛在宏泰集团的...

    年底工作总结2013年工作计划ppt模板.rar

    标题中的“年底工作总结2013年工作计划ppt模板”表明,这是一个专门针对2013年初工作汇报设计的PPT模板,用于展示过去一年的工作成果和未来一年的工作规划。PPT作为一种强大的演示工具,能够以视觉化的方式呈现信息...

    2012年工作总结汇报2013年工作目标ppt模板.rar

    标题中的“2012年工作总结汇报2013年工作目标ppt模板.rar”表明这是一个PowerPoint演示文稿模板,用于展示2012年度的工作总结以及2013年的计划和目标。这类模板通常包含预设的布局、设计元素和指导性文本,帮助用户...

    顶呱呱幼儿园2013年度工作计划总结.doc

    【顶呱呱幼儿园2013年度工作计划总结】这篇文档是关于顶呱呱幼儿园在2013年度的工作回顾和总结,展示了该园在这一年中的教育理念、管理措施、团队建设、教育教学以及安全工作等方面取得的成就和经验。 1. 教育理念...

    2013年工厂年度工作总结.doc

    【文档描述】:“2013年工厂年度工作总结.doc”是对过去一年工厂运营情况的全面回顾和总结。 【标签】:“范文” 【主要内容概要】: 这篇总结提到了作者入职一年来的个人成长和工作中遇到的问题。作者认识到工作...

    品管部2013年年度工作总结.doc

    这篇文档是对品管部在2013年工作的全面回顾和总结,展示了部门在质量管理上的成就、挑战和改进措施。以下是该总结的关键知识点: 1. **部门管理优化**:品管部通过引入系统化、标准化的思想,提升了工作效率。采用...

    公司员工2013年度个人工作总结.doc

    这篇文档是公司员工对其2013年度工作的全面回顾和总结,主要涵盖了以下几个关键知识点: 1. **工作经历与适应能力**:员工在2013年9月10日入职,从对工作环境和业务的不熟悉,到在领导和同事的帮助下快速适应,并...

    2013年电气工段工作总结.rar

    标题中的“2013年电气工段工作总结”表明这是一个关于电气工程领域的年度总结报告,主要涵盖了2013年度的工作内容、成果、问题及改进措施。这份文档可能由一个企业的电气工段负责人编写,旨在回顾过去一年的工作,对...

    2013年度教师工作总结.doc

    这篇文档是2013年度一位教师的工作总结,主要涵盖了他在教育岗位上的思想成长、教育教学、分管工作和个人发展四个方面。 首先,在思想上,这位教师展现了对党的忠诚和对教育事业的热情。他积极参与各类学习培训,...

    2012年销售经理年度工作总结及2013年工作计划.doc

    本篇文档是关于2012年度销售经理的工作总结以及对2013年的工作规划。以下是对其中关键知识点的详细解析: **一、年度工作总结** 1. **个人成长与收获**:销售经理在这一年中通过努力工作,对产品知识有了深入理解...

    物业管理中心项目部2013年工作总结.doc

    这篇文档是关于物业管理中心项目部在2013年度的工作总结,主要涵盖了该年度的工作成果、管理理念、经济指标和主要工作的详细回顾。 一、2013年物业管理工作指导思想: 在这一年,物业管理中心以成长和挑战为主题,...

    小学2013年工作总结和2014年工作要点.doc

    【文档标题】提到的是"小学2013年工作总结和2014年工作要点",这是一份教育机构年度工作的回顾与规划。【描述】简单重申了文档的主题,即针对某小学过去一年的工作总结及下一年的工作重点。【标签】"范文"表明这是一...

    人力资源部2013年工作总结及2013年工作计划.doc

    2013年的工作总结反映出人力资源部在人才引进、制度建设和员工发展方面的努力,而在2014年的工作计划中,他们将继续优化这些领域,以期提升服务质量,降低成本,并加强内部沟通,创建更加和谐高效的工作环境。

    2013年年度总结报告

    在2013年的年度总结报告中,这位质量工程师详细回顾了他在这一年的工作成就、挑战以及未来展望。作为一名质量工程师,他的主要职责涵盖了项目跟踪、权限维护、配置管理、测试计划编制、问题解决等多个方面。他不仅在...

    2013年文联工作总结.doc

    【文档描述】未提供详细描述,但根据标题可推测是关于2013年度该组织的工作回顾和总结。 【标签】"范文"表明这是一个示例或模板,用于展示如何撰写工作总结。 【部分内容】详细列举了2013年文联的四大活动: 1. 万...

    2013年班组工作总结.doc

    【文档描述】:“2013年班组工作总结.doc”是对过去一年班组工作的回顾和总结,强调了班组建设、安全管理、生产技术管理和现场管理等方面的主要成就与不足。 【标签】:“范文” 【主要内容分析】: 在2013年的...

    2013年医院药房个人工作总结.doc

    标题中的“2013年医院药房个人工作总结”表明这是一个关于个人在2013年度在医院药房工作的总结报告。描述中的信息简洁,仅提及文档格式,但标签“资料”暗示这是一份与药房工作相关的资料或文档。 在内容部分,可以...

Global site tag (gtag.js) - Google Analytics