• [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页面。


    三、总结

    这就是一个完整的一条线,这里仅仅是对页面跳转进行了配置,在文中我们看到了一些注入,那么这些类又是在哪儿配置的呢。我们的事务处理又是怎么配置的呢?请看下篇博客!

  • 相关阅读:
    asp.net mvc 国际化(2) 解决问题
    asp.net mvc 国际化(1) 国际化的基础
    Silverlight自学笔记布局基础
    ASP.NET MVC form验证
    Expression Tree 入门
    JQuery 思维导图
    HashMap的Put方法(二)
    HashMap的构造函数(三)
    HashMap的数据结构(一)
    HashMap之扩容resize(四)
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010356.html
Copyright © 2020-2023  润新知