单例、多例与线程安全问题

单例与多例问题是指,当多个用户访问某个类时,系统是为每个用户创建一个该类实例,还是整个系统无论多少用户访问,只创建一个该类实例。

线程安全问题是指,多个用户同时在访问同一个程序时,其对于某一数据的修改,会不会影响到其他用户中的该数据。若无影响,则是线程安全的;若有可能影响,则是线程不安全的。

现在对HttpServlet、HttpSession、Struts2中的Action、Hibernate中的SessionFactory与Session,进行总结。
(1)HttpServlet
单例。即无论多少用户访问同一个业务,如LoginServlet,Web容器只会创建一个该Servlet实例。而该实例是允许多用户访问的。
若Servlet中包含成员变量,则每个用户对于成员变量的修改,均会影响到其他用户所看到的该变量的值,所以这时是线程不安全的。若不包含成员变量,则是线程安全的。
(2)HttpSession
多例。Web容器会为每个用户开辟一个Session,多个用户会有多个Session。而每个用户只能访问自己的Session。所以,对于Session来说,就不存在并发访问的情况,也就不存在线程安全的问题了。所以可以说是线程安全的。
(3)Struts2的Action
多例。对于同一个业务,例如LoginAction,系统会为每一个用户创建一个LoginAction的实例,并使其成员变量username与password接收用户提交的数据。同一用户只能访问自己的Action。所以,对于Action来说,就不存在并发访问的情况,也就不存在线程安全的问题了。所以可以说是线程安全的。
(4)Hibernate的SessionFactory
单例。无论多少用户访问该项目,系统只会创建一个SessionFactory对象,即这个对象是可以被所有用户访问的。
SessionFactory实现类中所包含的成员变量基本都是final常量,即任何用户均不能修改。所以,也就不存在用户的修改对其他用户的影响问题了,所以是线程安全的。
(5)Hibernate的Session
多例。系统会为每个用户创建一个Session。
Session的实现类中定义了很多的非final成员变量,一个事务对成员变量所做的修改,会影响到另一个事务对同一数据的访问结果,所以是线程不安全的。

Struts2接受请求参数

先来几句题外话:很多大佬都说Struts2存在安全问题,已经过时啦,可以直接入手Spring Boot~Spring Cloud之类的,有入手尝试SpringBoot确实开放效率会高很多,非常便捷。但是滴滴滴本来就是个菜鸡啊,有很多东西其实还是想经历一遍,然后达到螺旋式的上升。温故而知新,希望在10月秋招中得到橄榄枝~~~

关于Struts2接收请求参数,滴滴滴将记录下四种方式:

属性驱动方式
域驱动方式
集合数据接收
ModelDriver 方式

属性驱动方式是指服务器接受来自客户端离散数据的方式。用户提交的数据,Action原封不动的进行逐个接收。这种接收方式的要求是:在Action类中定义与请求参数同名的属性,需要定义该属性的set方法,这样能满足Action自动将请求参数的值赋予同名属性

举例如下:

1.在某一jsp文件body中写入form表单
<form action=”test/register.action” method=”post”>
姓名:<input type=”text” name=”name”/><br>
年龄:<input type=”text” name=”age”/><br>
<input type=”submit” value=”注册”/>
</form> 

2.编写form表单中指定的action

public class RegisterAction{
    private String name;
    private int age;
    //getter and setter

    public String […] Continue Reading…

关于SSH框架集成中出现的failed to lazily initialize a collection of role could not initialize proxy – no session异常解决办法

 

异常信息截图如下:这是滴滴滴近期在学习csdn博客 博主倪升武的SSH项目中,出现的一个问题,在easyUI——Action——Service——DB的数据查询阶段,能正常打印得到的数据库结果,在数据返回中,页面无结果显示,打开chrome查看详情如下:failed to lazily initialize a collection of role could not initialize proxy – no session。判断为hibernate出现问题。

hibernate懒加载报错

 

我的解决办法为:在web.xml中通过filter配置扩大session作用范围,注意要设置在struts的上方。

扩大Session作用范围

根据其他的网络资料称,可以在model中取消懒加载,滴滴滴测试了下,此项目内是无效的,而且取消懒加载并非是最佳解决方案。

(一)SSH在Eclipse和MyEclipse上的整合——为何要使用SSH框架~~~还没写完

SSH是一个经典的开发框架,滴滴滴学习SSH和SSM都有大半年啦,温故而知新,因此写下此文章。(文章吸收借鉴了很多老师的观点,撒花致谢)
第一个问题就是我们在使用Java开发中为何要使用SSH框架(Spring+Struts+Hibernate)呢?
首先我们需要知道,当前SSH框架在整个JAVA-WEB发展中所处的位置:

开始:Servlets
因为标签解耦:JSP
因为页面数据解耦:JSP +javabean
因为控制层解耦:JSP +Servlets+javabean
因为控制层共用:JSP +Struts
因为解耦数据库:JSP +Struts+hibernate
因为解耦控制层和数据层:JSP +Struts+Spring+Hibernate
因为界面和控制层解耦:JSP +Struts2+Spring+Hibernate
因为struts2安全问题:JSP +springmvc+Spring+Hibernate
因为mybatis更能适应业务复杂性:JSP +SpringMvc+Spring+Mybatis

总结的讲SSH是一个继往开来的产物,解决了之前的servlet等问题,但又因为struts2自身的安全问题,今年来出现式微,也导致了后来的SSM框架以及微服务的兴起,但是SSH仍然保持着重要的地位,框架技术占比依然很高。

同时关于SSH和J2EE的关系:SSH是框架技术,J2EE是SUN公司制定的JAVA企业级开发标准,SSH参考和实现了J2EE的相关标准和一些设计理念,自成一套系统。

         J2EE将网站的开发分为四层:
客户层组件
J2EE应用程序可以是基于web方式的(浏览器),也可以是基于传统方式的.浏览器方面主要推动了html+css+js
 
web 层组件
J2EE web层组件可以是JSP 页面或Servlets
 
业务层组件
EJB做了业务逻辑的处理和数据库相关的操作。
有三种企业级的bean: 会话(session) beans,实体(entity) beans,和消息驱动(message-driven)
beans. 会话bean 表示与客户端程序的临时交互.实体bean 表示数据库的表中一行永久的记录. 当客户端程序中止或服务器关闭时,就会有潜在的服务保证实体bean 的数据得以保存.消息驱动 bean 结合了会话bean 和 JMS的消息监听器的特性,允许一个业务层组件异步接收JMS 消息.
 
企业信息系统层
存储信息。企业信息系统层处理企业信息系统软件包括企业基础建设系统,大型机事务处理,数据库系统,和其它的遗留信息系统。
 
这套规范降低了网站的开发难度,可网站的开发还是比较困难。2000年有些人就发现,J2EE这套规范臃肿、低效、难用且脱离现实。于是他们下定决心,对其改造。
2000~2001年 […] Continue Reading…