BOS项目第2天
1. 根据pdm导出sql文件生成表
导出sql文件
使用mysql命令运行sql脚本
sourc空格+全路径.sql
使用反转工具生成实体类和hbm文件
使用方法:day38
2. 抽取持久层代码(BaseDao&BaseDaoImpl)
接口
/**
* 通用Dao接口
*
*
* @param <T>
*/
public interface IBaseDao<T> {
public void save(T entity);
public void update(T entity);
public void delete(T entity);
public T findById(String id);
public List<T> findAll();
public void executeUpdate(String queryName,Object...args);
}
实现类(BaseDaoImpl)
/**
* 通用dao实现
*
*
*/
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T>{
Class<T> entityClass;//实体类型
//注入SessionFactory对象
@Resource
public void setSF(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
/**
* 在构造方法中获取实体类型
*/
public BaseDaoImpl() {
//获得父类(BaseDaoImpl)类型
ParameterizedType superclass = (ParameterizedType) this.getClass().getGenericSuperclass();
//获得泛型数组
Type[] typeArguments = superclass.getActualTypeArguments();
//获得实体类型
entityClass = (Class<T>) typeArguments[0];
}
public void save(T entity) {
this.getHibernateTemplate().save(entity);
}
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
public T findById(String id) {
return this.getHibernateTemplate().get(entityClass, id);
}
public List<T> findAll() {
String hql = "FROM " + entityClass.getSimpleName();
return this.getHibernateTemplate().find(hql);
}
//执行任意HQL
public void executeUpdate(String queryName, Object... args) {
Session session = this.getSession();
//命名查询
Query query = session.getNamedQuery(queryName);
int length = args.length;
int i = 0;
for (Object arg : args) {
//为?赋值
query.setParameter(i++, arg);
}
query.executeUpdate();
}
}
3. 抽取表现层(BaseAction)
/**
* 通用Action
*
*
*/
public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
protected T model;//模型对象
public T getModel() {
return model;
}
/**
* 获得实体类型,通过反射创建模型对象
*/
public BaseAction() {
//获得父类(BaseAction) 类型
ParameterizedType superclass = (ParameterizedType) this.getClass().getGenericSuperclass();
//获得父类上的泛型数组
Type[] typeArguments = superclass.getActualTypeArguments();
//获得实体类型
Class<T> domainClass = (Class<T>) typeArguments[0];
try {
model = domainClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
4. 登录功能
验证码validatecode.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Random"%>
<%@ page import="java.io.OutputStream"%>
<%@ page import="java.awt.Color"%>
<%@ page import="java.awt.Font"%>
<%@ page import="java.awt.Graphics"%>
<%@ page import="java.awt.image.BufferedImage"%>
<%@ page import="javax.imageio.ImageIO"%>
<%
int width = 80;
int height = 32;
//create the image
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// set the background color
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
// draw the border
g.setColor(Color.black);
g.drawRect(0, 0, width - 1, height - 1);
// create a random instance to generate the codes
Random rdm = new Random();
String hash1 = Integer.toHexString(rdm.nextInt());
// make some confusion
for (int i = 0; i < 50; i++) {
int x = rdm.nextInt(width);
int y = rdm.nextInt(height);
g.drawOval(x, y, 0, 0);
}
// generate a random code
String capstr = hash1.substring(0, 4);
session.setAttribute("key", capstr);
g.setColor(new Color(0, 100, 0));
g.setFont(new Font("Candara", Font.BOLD, 24));
g.drawString(capstr, 8, 24);
g.dispose();
response.setContentType("image/jpeg");
out.clear();
out = pageContext.pushBody();
OutputStream strm = response.getOutputStream();
ImageIO.write(image, "jpeg", strm);
strm.close();
%>
<input id="loginform:codeInput" class="loginFormTdIpt" type="text"
name="checkcode" title="请输入验证码" />
<img id="loginform:vCode" src="${pageContext.request.contextPath }/validatecode.jsp"
οnclick="javascript:document.getElementById('loginform:vCode')
.src='${pageContext.request.contextPath }/validatecode.jsp?'+Math.random();" />
登陆:
第一步:修改login.jsp页面中action提交地址
<a href="#" οnclick="document.forms[0].submit();" id="loginform:j_id19" name="loginform:j_id19">
第二步:创建UserAction,提供login方法
@Controller//("abc")
@Scope("prototype")
public class UserAction extends BaseAction<User>{
//提供属性接收验证码
private String checkcode;
@Resource
private IUserService userService;
/**
* 用户登录
*/
public String login(){
//从session中获取自动生成的验证码
String key = (String) ActionContext.getContext().getSession().get("key");
if(StringUtils.isNotBlank(checkcode) && checkcode.equals(key)){
//验证码正确
User user = userService.login(model);
if(user != null){
//登录成功,将User对象放入session
ActionContext.getContext().getSession().put("loginUser", user);
return "home";
}else{
//登录失败,添加错误信息,跳转到登录页面
this.addActionError(this.getText("loginError"));
return "login";
}
}else{
//验证码有误,添加错误信息,跳转到登录页面
this.addActionError(this.getText("checkcodeError"));
return "login";
}
}
第三步:创建UserService
@Service
@Transactional
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
public User login(User model) {
String password = model.getPassword();
//使用md5加密
password = MD5Utils.md5(password);
User user = userDao.findUserByUsernameAndPassword(model.getUsername(),password);
return user;
}
第四步:创建UserDao
@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao{
/**
* 根据用户名和密码查询用户
*/
public User findUserByUsernameAndPassword(String username, String password) {
String hql = "FROM User u WHERE u.username = ? AND u.password = ?";
List<User> list = this.getHibernateTemplate().find(hql,username,password);
if(list != null && list.size() > 0){
return list.get(0);
}
return null;
}
}
第五步:配置struts.xml
<!-- 用户管理Action -->
<action name="userAction_*" class="userAction" method="{1}">
<result name="home">/index.jsp</result>
</action>
5. 消息提示框messager
<script type="text/javascript">
$(function(){
//屏幕右下角提示框
window.setTimeout(function(){
$.messager.show({
title:'欢迎信息',
msg:'欢迎张三登录成功',
timeout:5000,//5秒钟后消失
showType:'slide'
});
}, 3000);
//普通提示框
//$.messager.alert("提示信息","提示内容正文","question");
//确认框
/**
$.messager.confirm("确认信息","你确定删除当前数据吗?",function(r){
alert(r);
});
**/
//带有输入功能的确认框
/**
$.messager.prompt("确认信息","你确定删除当前数据吗?",function(r){
alert(r);
});
**/
//进度条
$.messager.progress();
window.setTimeout(function(){
$.messager.progress('close');//关闭进度条
}, 3000);
});
</script>
6. 菜单按钮menubutton
<body>
<a class="easyui-menubutton" data-options="menu:'#mm'">控制面板</a>
<!-- 制作菜单 -->
<div id="mm">
<!-- 每个子div是一个菜单选项 -->
<div οnclick="alert('111')" data-options="iconCls:'icon-edit'">修改密码</div>
<!--区域分隔线 -->
<div class="menu-sep"></div>
<div>退出系统</div>
<div>联系管理员</div>
</div>
</body>
7. 编写struts2拦截器实器实现未登录用户访问
第一步:编写拦截器
public class LoginInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation ai) throws Exception {
// 判断是否存在session
Object session = ActionContext.getContext().getSession()
.get("session_user");
if (session == null) {
// 不存在转回登陆界面
Object obj = ai.getAction();
if (obj instanceof ActionSupport) {
ActionSupport action = (ActionSupport) obj;
//提示信息
action.addActionError(action.getText("mustLogin"));
}
return "login";
}
//放行
return ai.invoke();
}
}
第二步:在struts.xml中注册拦截器
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="bosLogin" class="com.itheima.bos.web.interceptor.BOSLoginInerceptor">
<param name="excludeMethods">login</param>
</interceptor>
<!-- 拦截器栈 -->
<interceptor-stack name="bos">
<interceptor-ref name="bosLogin"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 指定默认的拦截器 -->
<default-interceptor-ref name="bos"></default-interceptor-ref>
8. 修改密码功能(ajax,命名修改)
第一步:调整index.jsp页面中修改密码窗口,添加校验
<tr>
<td>新密码:</td>
<td><input id="txtNewPass" required="true"
data-options="validType:'length[4,6]'" type="Password" class="txt01 easyui-validatebox" /></td>
</tr>
<tr>
<td>确认密码:</td>
<td><input id="txtRePass" required="true"
data-options="validType:'length[4,6]'" type="Password" class="txt01 easyui-validatebox" /></td>
</tr>
第二步:为修改密码窗口中的确定按钮绑定事件
<script type="text/javascript">
// 修改密码
function editPassword() {
$('#editPwdWindow').window('open');
$("#txtNewPass").val("");
$("#txtRePass").val("");
}
$("#btnEp").click(function(){
//对表单中的元素进行校验
var v = $("#editForm").form("validate");
if(v){
//手动校验两次输入是否一致
var v1 = $("#txtNewPass").val();
var v2 = $("#txtRePass").val();
if(v1 == v2){
//发送ajax请求,修改密码
var url = "${pageContext.request.contextPath}/userAction_editPassword.action";
$.post(url,{"password":v1},function(data){
if(data == '1'){
//成功
$.messager.alert("提示信息","密码修改成功!","info");
}else{
//失败
$.messager.alert("提示信息","密码修改失败!","warning");
}
});
$("#editPwdWindow").window("close");
}
}
});
</script>
第三步:在UserAction中提供editPassword方法
/**
* 修改密码
* @throws IOException
*/
public String editPassword() throws IOException{
String password = model.getPassword();
User user = BOSContext.getLoginUser();
String id = user.getId();
String flag = "1";
try{
userService.editPassword(password,id);
}catch (Exception e) {
flag = "0";
}
ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
ServletActionContext.getResponse().getWriter().print(flag);
return NONE;
}
service
//修改密码
public void editPassword(String password, String id) {
password = MD5Utils.md5(password);
userDao.executeUpdate("editPassword", password,id);
}
第四步:在BaseDaoImpl中提供executeUpdate方法
//执行任意HQL
public void executeUpdate(String queryName, Object... args) {
Session session = this.getSession();
//命名查询
Query query = session.getNamedQuery(queryName);
int length = args.length;
int i = 0;
for (Object arg : args) {
//为?赋值
query.setParameter(i++, arg);
}
query.executeUpdate();
}
第五步:在User.hbm.xml中提供修改密码的HQL
<!-- 修改密码HQL -->
<query name="editPassword">
update User set password = ? where id = ?
</query>