学习了一天的struts2架构了,现在简单的总结一下:
Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品,所以struts2的一个重要的优点就是可以将软件层次分开。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
一般要做一个网站,都要遵循MVC的框架,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构。
要分析一个网站,按照我们人类的思维,都会从可视化的界面分析开始,现在我们根据V-C-M的顺序来研究一下以上两节中做的Demo。
首先是View层,主要有两个界面,一个是login.jsp,另一个是register.jsp,两个文件里边分别有一个表单,每个表单都有一个action行为,如action="loginAction",当点击summit按钮的时候会触发,到底会触发哪个类的哪个函数呢,这个在struts.xml的文件里会有映射的类和方法,比如:
<action name="loginAction"
class="com.dianzi.action.login.LoginAction" method="login">
<result name="success">/jsp/login/success.jsp</result>
<result name="input">/jsp/login/login.jsp</result>
<result name="error">/jsp/error.jsp</result>
</action>
就是所映射的类和方法,表明当点击summit时,会触发loginAction行为,在映射文件中又将loginAction行为映射给了com.dianzi.action.login.LoginAction的类的login方法。
然后就是Controller层了,在View层中点击事件,通过映射文件将其行为传给Controller层,在此层中会做一些逻辑处理,如:
public String login() {
User user = new User(username, password);
int state = userDao.login(user);
System.out.println("state=" + state);
if (state == -1) {
this.addFieldError("username", "用户名不正确,请先注册!");
return INPUT;
} else if (state == -2) {
this.addFieldError("password", "密码不正确,请重新输入密码!");
return INPUT;
} else if (state > 0) {
System.out.println("[测试]登录成功!用户ID=" + state);
this.setId(state);
return SUCCESS;
} else {
this.addFieldError("username", "登录失败,请与管理员联系!");
return INPUT;
}
}
此逻辑处理就是用输入的用户名和密码创建一个User对象,生成User对象后就会和我们Model层的数据结构映射起来。
public int login(User user) {
// int state = 0 ; //初始化状态变量
Session session = util.getSession();
try {
Query queryName = session
.createQuery("from User u where u.name = ?");
queryName.setString(0, user.getName());
List listName = queryName.list();
if (null == listName ||listName.isEmpty()) {
return -1; // 用户名不存在
}
Query queryNamePswd = session
.createQuery("from User u where u.name = ? and u.password = ?");
queryNamePswd.setString(0, user.getName());
queryNamePswd.setString(1, user.getPassword());
List listNamePswd = queryNamePswd.list();
if (null == listNamePswd ||listNamePswd.isEmpty()) {
return -2; // 密码不正确
}
Iterator it = listNamePswd.iterator();
User userquery = (User) it.next();
return userquery.getId(); // 验证成功,取ID值
} catch (Exception e) {
System.out.println("UserDaoImpl.isExist()方法发生异常:");
e.printStackTrace();
return 0; // 异常时返回0
} finally {
util.closeSession(session);
}
}
User对象装进model层后,会进数据库去查看数据库中是否有此用户名和帐号,如果有返回用户id,如果没有返回其他值。而对象与数据库之间的映射又是通过一些映射文件来完成的,如User.hbm.xml。
<hibernate-mapping package="com.dianzi.model">
<class name="User" table="T_USER_TEST">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="java.lang.String"
length="100">
</property>
<property name="password" column="password"
type="java.lang.String" length="100">
</property>
<property name="roleId" column="roleId"
type="java.lang.Integer">
</property>
</class>
</hibernate-mapping>
经过mapping后就可以那对象的属性和数据库的字段进行匹配,根据匹配情况会返回不同的值,返回的值被Controller层接受后做一些处理,比如Controller层会根据登陆返回的值,login函数会返回不同的值。
Controller返回不同的值后,映射文件会根据返回的值的不同决定View层应该show出的界面。
所以总的过程应该时View-Mapping-Contoller—Mapping-Mapping-Model-Controller-Mapping-View顺序。
最后将我做的Demo上传如附件。