共计 2471 个字符,预计需要花费 7 分钟才能阅读完成。
根据流程图我们可以相应的看出我们的程序从最初的浏览器到最后的页面回显的过程,有什么不明白的地方请留言提示。
主要负责映射文件和 Action 和 Service 的注入,负责后台服务 3 层之间调用 **
相当于我们 asp.net 中的 html 页面是一样,如果跟我们 html 页面大同一样的话,那么他也是可以可以写 ajax 的,并且可以触发我们的事件,通过他触发事件是通过 action 属性来触发,在这个属性里面会有一个地址,是专门用于与我们后台建立连接
<form id="loginForm" action="${pageContext.request.contextPath}/user_login.action" method="post" novalidate="novalidate">
根据 Strust 的配置我们可以找到我们要到方法,前台界面找后台提供的方法,根据 name=login,User_* 表示我们所有以 user 开头的地址都放到了 userAction 类里面。
result 的意思是返回的结果,我们既然可以找到 userAction 类,那么当执行完 userAction 等一些列的功能之后我们肯定要返回结果给我的前台页面,为什么 result 后面会有一个 name 的属性呢??大家都写过 3 层的代码我们通过想要后台给我传过来一个参数,都是方法给予的,没有是类的把,我们只能说类里面包含了方法
所以在我们 userAction 类中我们有很多的方法,而 name=login 的方法结果我们可以跳转到 /WEB-INF/jsp/login.jsp 这个路径下面
<action name="user_*" class="userAction" method="{1}">
<result name="login">/WEB-INF/jsp/login.jsp</result>
Action 是我们行动层,这个是我跟他起的名字,为什么这么说呢。因为 jsp 触发事件之后跑到后台的第一个地方就是 Action。来执行相应的方法,他一般是用 ActionSupport,并且引入 ModelDriven。来使用模型驱动对象,其实就是我们的实体,其实 Action 可以看做是我们 3 层中的 u 层,然后 Action 调用 service
根据我们的 Struts 我们可以找到我们的存放在 userAction 类中的 login 方法,在方法中可以看出来有一个是 return,他就是通过这个返回到了我们 Struts 中的 result 属性中,然后找到了我们的 jsp 页面显示
public String login(){User existUser = userService.login(user);
// 判断返回会来的数据是否为空
if(existUser == null){this.addActionError("登录失败:用户名或者密码或用户没有激活");
return LOGIN;
}else{// 保存到共享变量中
ServletActionContext.getRequest().getSession().setAttribute("existUser", existUser);
// 页面跳转
return "loginSuccess";
}
}
主要实现的事物还有就是调用 Dao, 其实在这里实现了解耦合的作用,也减轻了 Action 的工作量,根据代码看出只是简单的调用了 dao 持久层的方法
/**
* 登录功能
*/
// 用户登录的方法
public User login(User user) {return userDao.login(user);
}
这个是持久化层,其实就是与进行数据库语句,进行增删改查,一般都使用的是 getHibernateTemplate.XX 来实现,实现过程是传入执行 mysql 的语句和参数就可以了,根究代码看出我们实现的查找方法,并且改变我们的状态值,如果成功则返回我们的用户名
/**
* 登录功能
*/
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;
}
vo 他就是实体层,其实与我们 MVC 中 EF 映射是一样的, 其实在 vo 里面我们有一个是实体层,有一个 xml,我们通过 xml 来进行实体的映射
<hibernate-mapping>-- 表示根元素,包含一些属性
<!-- 找到我们的包 User,然后映射的表是 user 表 -->
<class name="cn.itcast.shop.user.vo.User" table="user">
<!--id 主键,用 native -->
<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"/>
</class>
</hibernate-mapping>
通过这几天的学习,对于 ssh 的一条线掌控的差不多了,如果有问题的可以随时跟我联系
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)