zoukankan      html  css  js  c++  java
  • [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页面。


    三、总结

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

  • 相关阅读:
    Leetcode 538. Convert BST to Greater Tree
    Leetcode 530. Minimum Absolute Difference in BST
    Leetcode 501. Find Mode in Binary Search Tree
    Leetcode 437. Path Sum III
    Leetcode 404. Sum of Left Leaves
    Leetcode 257. Binary Tree Paths
    Leetcode 235. Lowest Common Ancestor of a Binary Search Tree
    Leetcode 226. Invert Binary Tree
    Leetcode 112. Path Sum
    Leetcode 111. Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/hhx626/p/6010356.html
Copyright © 2011-2022 走看看