当前位置:文档之家› struts2 实验报告

struts2 实验报告

1.系统分析与设计1.1 系统功能描述本系统是个非常简单的注册、登录系统。

本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。

当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。

当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。

系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。

系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。

故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。

当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。

除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。

1.2 系统功能流程1.3 数据库设计相关的映射文件:<hibernate-mapping package = <class name ="User" table ="user_table"> <id name ="id"column ="user_id"><generator class ="identity"</id ><property name ="user"column =nique ="true"/><property name ="pass"column ="user_pass"not-null ="true"length ="50"/><property name ="email"length ="100"/></class ></hibernate-mapping >一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。

2.系统实现与测试 2.1 系统采用的关键技术MVC 框架采用了Struts2框架,Struts2框架的易用性,极好的简化了系统的MVC 层的实现;本系统使用了Struts2的JSON 插件来完成Ajax 功能,除此之外本系统为了避免进行底层的Ajax 交互,还是用了一个简单Prototype.js 函数库,用以简化Ajax 编程。

Struts2框架的稳定性,为系统的稳定运行提供了保证。

Spring 容器作为系统的Ioc 容器,将系统中所有组件都放在Spring 容器中进行管理,并且充分利用了Spring Ioc 容器的功能,采用依赖注入来管理系统中各组件的依赖关系,避免了各组件之间的硬编码耦合,提高了系统的可扩展性。

借助Hibernate ORM 框架实现系统的持久化,通过Hibernate 的框架帮助,允许上层程序采用面向对象的方式编程,二Hibernate 负责把面向对象的持久化操作转换成JDBC 操作,但Hibernate 的底层操作对开发者完全透明,从而让用户从具体的JDBC 访问中释放出来,无需理会底层的JDBC 数据库访问,而是以面向对象的方式进行持久化操作。

2.2 关键程序流程以注册为例说明:加载类(FilterDispatcher )读取配置(struts 配置文件中的Regist.Action ) 派发请求(客户端发送请求)调用Action (FilterDispatcher 从struts 配置文件中读取与之相对应的Action ) 启用拦截器(WebWork 拦截器链自动对请求应用通用功能) 处理业务(回调RegistAction 的execute()方法)返回响应(通过execute 方法将信息返回到FilterDispatcher )查找响应(FilterDispatcher 根据配置查找响应的是什么信息如:SUCCESS 、ERROER ,将跳转到哪个jsp 页面) 响应用户(jsp--->客户浏览器端显示)2.3 关键代码分析Regist.action 的execute 方法public String execute() throwsException{Map session = ActionContext.getContext().getSession(); String ver2 = (String )session.get("rand");session.put("rand" , null ); if (vercode .equals(ver2)) {if (mgr return }else {return}} else {addActionError("验证码不匹配,请重新输入"); }return "failure";}业务逻辑层:publicint addUser(String user , String pass , String email) throws Exception{ try { User u = new User(); u.setUser(user);userDaoreturn }catche.printStackTrace();thrownew Exception("新增用户时出现异常"); }}publicvoid save(User user){getHibernateTemplate().save(user); }SessionFactory 是Hibernate 的持久化操作的基础对象,是整个数据库经过编辑后的内存镜像,通常对应一个底层数据库。

进行Hibernate 的持久化操作前,必须先完成SessionFactory 的初始化。

本系统通过Spring 容器管理SessionFactory ,从而允许开发人员无需手动管理Hibernate 的SessionFactory 。

代码如下:<bean id ="sessionFactory"class ="org.springframework.orm.hibernate3.Loc alSessionFactoryBean"><property name ="dataSource"ref ="dataSource"/> <property name ="mappingResources"> <list ><value >User.hbm.xml </value ></list > </property ><property name ="hibernateProperties"> <props > <prop key ="hibernate.dialect">><prop key ="show_sql">true </prop ><prop key ="hibernate.hbm2ddl.auto">update </prop ><prop key ="hibernate.jdbc.batch_size">20</prop > </props > </property > </bean >DAO 组件是基于Hibernate 的持久化操作的,因此必须获得SessionFactory 的引用才可以进行持久化操作。

由于系统的DAO 组件将由Spring 容器来管理,而且系统的SessionFactory 也是由Spring 的容器来管理,因此DAO 组件无需显示去的SessionFactory 的引用,而是接受Spring 容器注入即可。

配置如下:<bean id ="userDao"class ="org.reg_erDaoHibernate"><property name ="sessionFactory"ref ="sessionFactory"/> </bean >配置业务逻辑组件所依赖的DAO 组件。

代码如下:<bean id ="mgr"class ="org.reg_erManagerImpl"> <property name ="userDao"ref ="userDao"/> </bean >在Spring 容器中配置了业务逻辑组件后,还必须为业务逻辑方法增加事物控制。

因为用户的业务逻辑方法对应用户的一次业务请求,通常而言,用户的每次业务请求都是逻辑不可分的,一次应该为该方法增加事物控制。

本系统采用Spring 的BeanNameAutoProxyCreator 后处理器完成。

代码如下:<bean id ="transactionManager"class ="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name ="sessionFactory"ref ="sessionFactory"/> </bean ><bean id ="transactionInterceptor"class ="org.springframework.transaction.interceptor.TransactionInterceptor">name ="transactionManager"ref =<property name = <props ><prop key ="get*">PROPAGATION_REQUIRED,readOnly </prop ><prop key ="*">PROPAGATION_REQUIRED </prop ></props ></property ></bean ><bean class ="org.springframework.aop.framework.autoproxy.BeanNameAutoP roxyCreator"><property name ="beanNames"> <list ><value >mgr </value > </list > </property ><property name ="interceptorNames"> <list ><value >transactionInterceptor </value > </list > </property > </bean >由于Struts2的Action 也是由Spring 容器负责管理,因此,必须保证Spring 容器在Web 应用初始化时立即创建。

相关主题