1. 根据pdm导出sql文件生成表
1.1 导出sql文件
1.2 使用MySQL命令运行sql脚本
1.3 sourc空格+全路径.sql
1.4 使用反转工具生成实体类和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"
- onclick="javascript:document.getElementById('loginform:vCode')
- .src='${pageContext.request.contextPath }/validatecode.jsp?'+Math.random();" />
登陆:
第一步:修改login.jsp页面中action提交地址
- <a href="#" onclick="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 onclick="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;
- }
- //修改密码
- 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>