[SSH 2] 以网站主页面浅谈Struts2配置
导读:前面总体的介绍了一下SSH框架,那么作为Struts这一支,具体是怎么配置的呢?本篇博客则主要是以自己做过的实例中的登录一条线,简单介绍一下struts2的配置,如有不妥之处,还请大家多提点提点!
一、Struts2介绍
当Web容器收到 请求(HttpServletRequest)它将请求传递给一个标准的的过滤链包括(ActionContextCleanUp)过滤器,然后经过Other filters(SiteMesh ,etc),接下来需要调用FilterDispatcher核心控制器,然后它调用ActionMapper确定请求哪个Action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。接下来FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager)
从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象,ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N) 一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)来呈现页面,之后拦截器(Interceptor N)会在被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和(核心控制器)(FilterDispatcher)。
二、具体应用
2.1,Vo层(Hibernate)配置
Vo层主要介绍映射关系的配置,实体类和平时写的model层是一致的,get,set两个方法,需要注意的是,之前的model类如果要调用另一个表的数据,则是用一个字段作为外键,在model类里,这个外键和一般字段一样,也是赋予get和set两个方法,但是在Hibernate里面略有不同,不同之处在于,之前的一个字段,现在变成了一个对象,比如:
// 一个用户对应多个订单:
private Set<Order> orders = new HashSet<Order>();然后再通过get和set方法,去获取这个对象中的数据。下面看映射关系配置:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="cn.itcast.shop.user.vo.User" table="user">
<id name="uid">
<generator class="native"/>
</id>
<property name="username"/>
<property name="password"/>
<property name="name"/>
<property name="email"/>
<property name="phone"/>
<property name="addr"/>
<property name="state"/>
<property name="code"/> <set name="orders" cascade="delete">
<key column="uid"/>
<one-to-many class="cn.itcast.shop.order.vo.Order"/>
</set>
</class>
</hibernate-mapping></span>
总结:主要配置主键、属性、有关联的实体。
2.2,在Dao层查询登录用户
<span style="font-family:KaiTi_GB2312;font-size:18px;"> // 用户登录的方法
public User login(User user) {
String hql = "from User where username = ? and password = ? and state = ?";
List<User> list = this.getHibernateTemplate().find(hql,
user.getUsername(), user.getPassword(), 1);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}</span>
2.3,Service层登陆方法(Bll逻辑层)
首先是注入Dao层,区别于之前的new创建对象:
<span style="font-family:KaiTi_GB2312;font-size:18px;">// 注入UserDao
private UserDao userDao; public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}</span>
登陆方法:
<span style="font-family:KaiTi_GB2312;font-size:18px;">// 用户登录的方法
public User login(User user) {
return userDao.login(user);
}
</span>
2.4,Action层代码
首先是模型驱动的对象创建和Service层的注入:
<span style="font-family:KaiTi_GB2312;font-size:18px;">// 模型驱动使用的对象
private User user = new User(); public User getModel() {
return user;
} // 注入UserService
private UserService userService; public void setUserService(UserService userService) {
this.userService = userService;
}</span>
登陆方法:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> /**
* 登录的方法
*/
public String login() {
User existUser = userService.login(user);
// 判断
if (existUser == null) {
// 登录失败
this.addActionError("登录失败:用户名或密码错误或用户未激活!");
return LOGIN;
} else {
// 登录成功
// 将用户的信息存入到session中
ServletActionContext.getRequest().getSession()
.setAttribute("existUser", existUser);
// 页面跳转
return "loginSuccess";
} }</span>
这个方法是说,如果失败了,就进行错误提示。如果成功了,则页面跳转到loginSuccess所配置的对应界面,这个成功之后所跳转的页面配置就在struts2里面。下面,看具体配置:
2.5,struts2配置
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.devMode" value="false" /> <package name="shop" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="PrivilegeInterceptor" class="cn.itcast.shop.interceptor.PrivilegeInterceptor"/>
</interceptors> <global-results>
<result name="msg">/WEB-INF/jsp/msg.jsp</result>
<result name="login">/WEB-INF/jsp/login.jsp</result>
</global-results> <!-- 配置用户模块的Action -->
<action name="user_*" class="userAction" method="{1}">
<result name="registPage">/WEB-INF/jsp/regist.jsp</result>
<result name="input">/WEB-INF/jsp/regist.jsp</result>
<result name="loginPage">/WEB-INF/jsp/login.jsp</result>
<result name="login">/WEB-INF/jsp/login.jsp</result>
<result name="loginSuccess" type="redirectAction">index</result>
<result name="quit" type="redirectAction">index</result>
<result name="checkcodeFail">/WEB-INF/jsp/regist.jsp</result>
</action>
</package>
</struts></span>
说明:interceptors是拦截器配置,global—results是一些公共的页面跳转配置,就像是平常做项目统一配置的错误页,一旦出现了问题,就跳转到错误页,这也是一样的道理。用户模块的Action配置则是对应到Action类的配置,在这里配置的是:如果登陆成功(返回的是loginSuccess,则定向到index界面),如果返回的是login,则跳转到web_inf文件下jsp文件中的login.jsp页面。
三、总结
这就是一个完整的一条线,这里仅仅是对页面跳转进行了配置,在文中我们看到了一些注入,那么这些类又是在哪儿配置的呢。我们的事务处理又是怎么配置的呢?请看下篇博客!
[SSH 2] 以网站主页面浅谈Struts2配置的更多相关文章
- [SSH 3]以网上商城项目浅谈spring配置
导读:在做ITOO项目的时候,就用到了容器+反射,从而运用了依赖注入和依赖查找.如果看过WCF端的配置文件,那么对于这个spring的配置就很容易理解.本篇博客,是对于自己做的一个小项目中所运用到的s ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈struts2之chain
转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...
- 浅谈Struts2
学过SSH框架很长一段时间了,一直没有很系统的总结一下,这里先简单谈谈Struts2. 为什么要用Struts2? 这里列举一些Servlet的缺点: 1.每写一个servlet在web.xml中都要 ...
- 浅谈 Struts2 面试题收藏
Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- 小学生之浅谈Struts2与struts1的运行机制
Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...
- 浅谈:SAMBA配置设置
通过以下命令安装samba: yum install -y samba samba拥有三个服务,分别是: smbd 提供文件及打印共享功能,使用139.445端口 nmbd 提供NetBIOS支持 ...
- 浅谈:配置本地yum源(centos)
删除YUM的所有配置信息[root@server yum.repos.d]#rm -rf * 现在手动配置:1.在根目录下创建文件夹centos-yum: [root@server /]#mkdir ...
随机推荐
- C# 多线程网络通信
博客园 :梦工厂2012 本月由于事情太多,没能有太多的时间去写博客.不过还好在月底抽时间写了这个多线程网络通信的程序 .程序说明:控制端 创建一个写线程threadWrite和一个读线程thread ...
- BEvent_客制化Event Agent通道(案例)(待整理)
2014-09-09 Created By BaoXinjian
- NeHe OpenGL教程 第三十一课:加载模型
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- python(8) 自己制造异常让程序退出,把print的内容写入到文件
异常 也可以自己输出异常原因: raise Exception("404 404 404") import math import time #print 到文件的代码****** ...
- HTML5 编辑 API 之 Range 对象(一)
一.Range 对象基本概念 通过使用 Range 对象所提供的方法实现一个鼠标选取内容,通过点击按钮打印出选中内容,当然注意在不同的浏览器下可选中的内容数量是不同的. <!DOCTYPE h ...
- JavaScript面向对象编程指南
引言 面向对象程序设计 基本数据类型.数组.循环及条件表达式 基本数据类型 函数 函数Function 预定义函数 变量的作用域 函数也是数据 闭包 对象 原型 原型 继承 原型链 浅拷贝与深拷贝 原 ...
- tuple解包给类的构造函数
首先我们的第一步当然是将tuple解包.tuple提供了一个get函数来获取第N个元素.例如: get<1>(make_tuple(...)); 要将一个tuple全部拆解,就可以使用通过 ...
- iOS 加入自定义字体方法
1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序添加以下代码 输出所有字体 NSArray *familyNames = [UIFont fa ...
- UIActionSheet 传值
#pragma mark - actionSheet - (void)shareOrder:(NSDictionary *)product { UIActionSheet *as = [[UIActi ...
- winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部 z
http://www.zuowenjun.cn/post/2015/05/20/162.html 判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为Dat ...