您的位置:首页 > 其它

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

2016-06-20 14:12 459 查看
1. 根据pdm导出sql文件生成表

1.1 导出sql文件

1.2 使用MySQL命令运行sql脚本

1.3 sourc空格+全路径.sql

1.4 使用反转工具生成实体类和hbm文件

使用方法:day38

2. 抽取持久层代码(BaseDao&BaseDaoImpl)

 接口

[java] view
plain copy







/**

* 通用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)

[java] view
plain copy







/**

* 通用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)

[java] view
plain copy







/**

* 通用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

[plain] view
plain copy







<%@ 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();

%>

登陆页面接收验证码

[html] view
plain copy







<input id="loginform:codeInput" class="loginFormTdIpt" type="text"

name="checkcode" title="请输入验证码" />

<img id="loginform:vCode" src="${pageContext.request.contextPath }/validatecode.jsp"

onclick="javascript:document.getElementById('loginform:vCode')

.src='${pageContext.request.contextPath }/validatecode.jsp?'+Math.random();" />

登陆:

第一步:修改login.jsp页面中action提交地址

[html] view
plain copy







<a href="#" onclick="document.forms[0].submit();" id="loginform:j_id19" name="loginform:j_id19">

第二步:创建UserAction,提供login方法

[java] view
plain copy







@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

[java] view
plain copy







@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

[java] view
plain copy







@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

[html] view
plain copy







<!-- 用户管理Action -->

<action name="userAction_*" class="userAction" method="{1}">

<result name="home">/index.jsp</result>

</action>


5. 消息提示框messager

[html] view
plain copy







<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



[html] view
plain copy







<body>

<a class="easyui-menubutton" data-options="menu:'#mm'">控制面板</a>

<!-- 制作菜单 -->

<div id="mm">

<!-- 每个子div是一个菜单选项 -->

<div onclick="alert('111')" data-options="iconCls:'icon-edit'">修改密码</div>

<!--区域分隔线 -->

<div class="menu-sep"></div>

<div>退出系统</div>

<div>联系管理员</div>

</div>

</body>

7. 编写struts2拦截器实器实现未登录用户访问

第一步:编写拦截器

[html] view
plain copy







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中注册拦截器

[html] view
plain copy







<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页面中修改密码窗口,添加校验

[html] view
plain copy







<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>

第二步:为修改密码窗口中的确定按钮绑定事件

[html] view
plain copy







<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方法

[java] view
plain copy







/**

* 修改密码

* @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

[java] view
plain copy







//修改密码

public void editPassword(String password, String id) {

password = MD5Utils.md5(password);

userDao.executeUpdate("editPassword", password,id);

}

第四步:在BaseDaoImpl中提供executeUpdate方法

[html] view
plain copy







//执行任意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

[html] view
plain copy







<!-- 修改密码HQL -->

<query name="editPassword">

update User set password = ? where id = ?

</query>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: