框架 day48 BOS项目练习2(base dao/action,登陆,消息提示框,菜单按钮,修改密码,登陆拦截器)

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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值