




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 SCM项目手把手开发文档作者:刘长炯日期:2008-9-16版本:1.01SCM项目手把手开发文档11编写目的32搭建基本开发环境32.1安装JDK和MyEclipse 5.5/6.0/6.532.2下载和安装Tomcat32.3安装MySQL 5.0/6.0 数据库42.4安装MySQL客户端管理软件Navicat Lite(可选)42.5安装和配置邮件服务器 (可选)52.6创建数据库和表62.6.1创建数据库62.6.2创建数据库表62.7准备必要的类库文件63开发项目73.1创建myscm2 Web项目73.2加入必要的JAR类库83.3导入JSP页面文件93.4修改web.xml加入Struts 2过滤器93.5设置Hibernate全局配置文件103.6创建项目包结构113.7开发通用工具类123.7.1util.MD5Bean123.7.2util.mail.MailSender123.7.3filters.TomcatFormFilter133.8开发实体类和HBM文件133.9开发DAO层153.9.1HibernateSessionFactory153.9.2BaseDAO163.9.3OpenSessionInViewFilter163.10开发用户模块173.10.1BaseActionSupport(可选)173.10.2UserAction类摘要设计193.10.3Struts 2通配符方式配置203.10.4用户列表功能203.10.5删除213.10.6表单AJAX验证功能213.10.7注册213.10.8激活233.10.9用户登录233.10.10用户注销233.10.11修改用户自己资料243.10.12取回密码243.10.13修改个人密码253.10.14根据ID查看用户信息253.11开发安全过滤器模块253.12开发后台管理模块(此模块建议作为练习)263.12.1前台设计263.12.2用户管理概要设计2用户搜索2添加新用户2浏览所有用户2删除用户283.13站点全局配置及加载2加载2修改283.14安全中心303.14.1页面设计303.14.2添加新角色303.14.3浏览所有角色303.14.4添加资源访问许可303.14.5浏览所有资源访问许可304供应商和商品模块304.1商店首页面304.2供应商模块324.2.1类设计324.2.2注册供应商用户324.2.3添加供应商(TODO 供应商审批,隶属于交易员模块)324.2.4查看我的供应商列表324.2.5查看所有供应商列表334.2.6查看分成总额334.3商品模块334.3.1类设计334.3.2页面设计344.3.3添加商品354.3.4浏览商品信息354.3.5浏览我的商品列表354.3.6浏览商品列表354.3.7修改商品信息354.3.8商品搜索355购物车模块355.1页面设计356程序开发调试交流366.1No result defined for action XXX and result success(input)的真正错误原因366.2排除法376.2.1排除浏览器及浏览器版本的因素376.2.2排除多余属性的干扰376.2.3JDK运行版本和开发工具编译器版本是否匹配?386.2.4重新发布Web应用或者复制新的JAR/Class文件了嘛?396.2.5Hibernate的包加完整了嘛?396.2.6别的类似项目是否能正常运行?406.2.7perties是我们的好朋友406.2.8人不如新,衣不如旧416.2.9把能正确运行的项目的jar包集中起来,分门别类放置416.3关联程序源码426.4JDK6和Struts 2冲突的问题真实原因及解决办法426.5使用UTF-8或者GBK编码的MySQL实例486.6另外一个HibernateSessionFactory事务的异常506.7MySQL安装版停止运行506.8MyEclipse不会自动删除项目里面已经去掉的JAR506.9MySQL导出完整的建表语句516.10Struts 2不要加所有的JAR文件,否则项目会报错511 编写目的本文档列出了本项目的基本开发步骤(只包含用户模块和后台管理模块),用于复习和开发时参考。开发时遵循的原则为尽量简单并提高代码复用,减少重复的代码。2 搭建基本开发环境2.1 安装JDK和MyEclipse 5.5/6.0/6.5本项目需要JDK 1.5(不要使用JDK 1.6,因为发现可能会导致BUG发生而无法载入Struts 2配置文件)。本项目使用MyEclipse 5.5或者更高版本开发,用其他工具例如Eclipse Java EE版本也可,主要用到JSP编辑器及Web项目发布功能。2.2 下载和安装Tomcat安装好Tomcat 6.0(或者5.5及更高版本)注意: 由于 Struts 2和 Tomcat 5.0 有冲突, 因此不能用Tomcat 5.Tomcat是一款开源免费的JSP服务器,可以在 / 下载并安装。建议下载压缩包版本(文件名是apache-tomcat-6.x.xx.zip),而不是Windows Service Installer的EXE安装文件。 解压缩到磁盘目录,记下安装路径例如c:apache-tomcat-6.0.14, 和JDK的安装一样,为了避免日后产生问题错误,解压缩的路径不要带有空格,如c:Program Files。2.3 安装MySQL 5.0/6.0 数据库可以访问 MySQL 官方网站下载原版安装程序和JDBC驱动,请访问:/downloads/mysql/6.0.html#win32,下载安装包(如文件mysql-essential-6.0.5-alpha-win32.msi)双击进行安装,在最后一个屏幕点击启动Configure the MySQL Server now启动实例配置工具即可,如下图所示。配置过程请参考视频mysql_server_config.exe。此向导也可以通过选择菜单 开始 所有程序 MySQL MySQL Server 6.0 MySQL Server Instance Config Wizard来打开。2.4 安装MySQL客户端管理软件Navicat Lite(可选)MySQL管理工具,导航猫免费版(Navicat Lite),可获得不低于SQL Server的易用度, 例如可视化建表, 修改表结构, 创建外键, 修改数据, 执行查询等功能,此软件的中文版可以在/download.html 下载*非商业 - 免费精简版。2.5 安装和配置邮件服务器 (可选)我们使用的本机测试邮件服务器为ForwardMail Server,启动后的邮箱登录页面是http:/localhost:1086/。在开始菜单中可启动邮件服务器配置工具,然后添加一个的域名,之后再点击左侧导航中的本地邮箱,添加必要的测试用邮箱地址。2.6 创建数据库和表2.6.1 创建数据库使用任意软件连接至MySQL服务器,然后创建数据库myscm。2.6.2 创建数据库表执行文件beanscm.sql来创建应用程序运行所需的表和基本数据。2.7 准备必要的类库文件系统基于Struts 2Hibernate+MySQL开发,并用到了一些前台技术。下面列出了用到的Java和Web层类库:Struts 2*Hibernate 3MySQL JDBC 驱动JavaMail + JAF(Java激活框架 Java Activation Framework, Java对象变成字符串形式来传播)*JSTL类库(可从apache-tomcat-6.0.14webappsexamplesWEB-INFlib下找到)jstl.jar standard.jarCommons-FileUpload(以及Commons-IO)注:加*的包可使用MyEclipse自带的类库。Web框架(跨浏览器)FckEditor 可视化编辑HTMLXLoadTree 动态加载XML生成JavaScript树组件jQuery AJAX框架查询DOM对象,简洁,现成控件较少ExtJS 比较全面的AJAX框架 树,菜单,表格编辑器(Grid)学习比较困难 -显示公告(页面内弹出窗口)1. 导入CSS和EXT的JS2. 写Ext.onRead3. 写入功能代码EasyValidation 表单验证框架3 开发项目3.1 创建myscm2 Web项目选择菜单 File New Web Project, 输入项目名 myscm2,选择J2EE 1.4。注意:不要选择Java EE 5,因为会导致JavaMail类库冲突。3.2 加入必要的JAR类库将必须的JAR包复制到WEB-INF/lib下。小提示:Hibernate的类库可以通过点击菜单 MyEclipse Add Hibernate Capabilities.来添加(此菜单位置可能略有出入),并同时指定数据库连接信息及创建Hibernate全局配置文件。struts2-blank-.war - 5个基本的Struts 2 JARstruts2-showcase-.war - fileupload 和 IOJSTL从tomcat下找 webappsexamplesWEB-INFlibMYSQL 驱动Hibernate的包3.3 导入JSP页面文件为了节约时间,JSP文件我们将不再一一从头开发。将项目所需的页面和相关资源从myscm项目中复制到本项目的WebRoot下即可(不要复制web.xml及源代码文件)。提示:如果文件显示为带?号的图标,如右图所示:,这不是文件错误,是因为原来的项目带了CVS版本控制信息,可在项目上选择上下文菜单Team Disconnect.来解决此问题。CVS版本控制,后面会介绍。3.4 修改web.xml加入Struts 2过滤器struts2org.apache.struts2.dispatcher.FilterDispatcherstruts2/*3.5 设置Hibernate全局配置文件创建文件srchibernate.cfg.xml,修改文件中的数据库连接信息:org.hibernate.dialect.MySQLDialectjdbc:mysql:/localhost:3306/beanscm?useUnicode=true&characterEncoding=GBKroot1234com.mysql.jdbc.Drivertrue请将代码中红色内容修改为您自己的数据库连接IP,用户名和密码。自动建表,INDEX不推荐。手工建表。3.6 创建项目包结构建议的包命名的规则是:公司域名.模块名.子模块名3.7 开发通用工具类这些类和具体的业务无关,因此我们要单独开发以下的几个类。3.7.1 util.MD5BeanMD5摘要计算难点:获取MD5算法和转16进制字符串显示。3.7.2 util.mail.MailSender 邮件发送难点:message.addRecipients(Message.RecipientType.TO, InternetAddress .parse(getTo();if(isHtmlFormat() message.setContent(getBody(), text/html;charset=GBK); else message.setText(getBody();发附件- 发一个动态的保单JPG过程:创建连接属性对象Properties props = new Properties();props.put(tocol, smtp );/ 协议,必须设置后边的属性是可选的/props.put(mail.smtp.host, localhost );/ 服务器地址props.put(mail.smtp.port, 25 );/ SMTP 服务器端口props.put(mail.debug, true );/ 是否为调试模式创建Session对象 Session.getInstance(props)创建MimeMessage对象 new MimeMessage(session)设置邮件相关信息使用Transport对象发送消息 session.getTransport();connect();send();3.7.3 filters.TomcatFormFilter用来解决Tomcat表单提交乱码问题(GET方法提交乱码)难点:HttpServletRequestWrapper和字符串编码转换加入到web.xml并编写一个JSP页面进行测试。3.8 开发实体类和HBM文件实体类和HBM文件可用MyEclipse生成,具体方法参考本人所著的免费电子书MyEclipse 6 Java 开发中文教程的7.4.5 使用反向工程快速生成 Java POJO 类,映射文件和 DAO一节。当然作为学习者来说,推荐尝试自己来手写HBM文件和Entity类,但是实际开发时一般都是用工具生成。难点(一对多和多对一):Role.hbm.xml Resource.hbm.xml 您应该了解下列内容:实体类都有什么限制?为什么?JavaBean:无参数的构造器。要有getter和setter,属性应为private。实体类 extends JavaBean: 必须实现java.io.Serializable,不能使用final修饰符,必须有ID属性和至少一个属性,推荐实现hashCode()和equals()方法。把HBM文件加入到hibernate.cfg.xml中。3.9 开发DAO层3.9.1 HibernateSessionFactory跨线程的对Session进行统一打开和关闭, 可配合Filter实现同一次访问实现自动管理Session和事务.DAO: load() - openSession() 读取数据 - closeSession() - JSP - user.address ThreadLocal + Filter解决Spring 提供了方案 OpenSessionInViewFilterlazy = false / 不推荐fetch=”join” / 不推荐Hibernate.initilizer(entity);query 有个关键字 fetch, from User fetch.?1. 创建SessionFactory2. 创建 static ThreadLocal 变量3. 编写获取Session和关闭Session的方法4. 编写事务处理的方法: 开始, 提交, 回滚3.9.2 BaseDAO小延伸: Hibernate中分页相关的对象和方法是哪些?一万条记录, 从第200条开始读到第20条.public Query setFirstResult(int firstResult); 设置开始读取的行数public Query setMaxResults(int maxResults); 设置最多读取的记录数Query q = s.createQuery(“from User”);return q.setFirstResult(200).setMaxResults(20).list();200 = 每页显示20条 * 当前页10, 每页显示几条练习: 写一个支持分页的查询方法List pagedQuery(String hql, int currentPage, int pageSize, Object. params)SQL: 列别名select sum(login_count) as 登录总次数 from scm_user3.9.3 OpenSessionInViewFilter实现的功能: 执行后续的Filter和Servlet/JSP时,首先打开事务,然后提交事务,如果出现异常则回滚事务, 还解决了JSP页面lazy载入数据时发现session被关闭的问题.注意:此Filter必须加在所有的Filter之前,包括Struts 2 Filter,否则可能出现无法正常提交事务的问题(已经有人遇到过此问题导致无法正常注册).try 1. 打开session并开始事务2. 向后执行ServletChain, 包括后续DAO和Action等 chain.doFilter(request, response);3. 提交事务 catch (Exception e) 4. 回滚事务5. 显示出错信息 finally 6. 关闭session注册到web.xml.3.10 开发用户模块3.10.1 BaseActionSupport(可选)此类提供一些通用的功能, 包括获取Request对象,获取参数,获取属性,DAO等,这个类完全是可选的.属性列表:baseDAO 基本的DAO对象; title,标题; message属性;resetMessages() - 重置title标题和message需要注意的方法:mergeParamsAsURI()/* * 将所有URL参数合并成一个URL字符串(page参数除外), 提供分页时显示.list.action?page=3¶1=11¶2=bb= list.action?page=3¶1=11¶2=bb&page=3+1 下一页 * return 字符串, 如: para1=11¶2=bb */public String mergeParamsAsURI() Map params = getRequest().getParameterMap();for(String value : values) System.out.println(value= + value);out.append(.URLEncoder.encode(key, UTF-8) + =);out.append(.URLEncoder.encode(value, UTF-8) + &);/ 删除末尾多余的 & 字符if(out.toString().endsWith(&) out.deleteCharAt(out.length() - 1);/* * 获取当前会话的登录用户信息 * return User */public User getSessionLoginedUser() User currentUser = (User) getSession(loginedUser);return currentUser;3.10.2 UserAction类摘要设计文件上传相关的属性: File photo, String photoFileName; photo是表单域的名字.1. JDK 版本 2. JAR 包冲突 XML解析器 Hibernate xmlapis.jar前台:头像: 如何预览头像?! (IE浏览器比较容易实现, 其他的没保证, 安全 IE6可以, IE7和其他浏览器可以通过降低安全级来实现) logo”img.src = file.value;3.10.3 Struts 2通配符方式配置采用此配置可以大大减少代码量, Struts 1中没有对等的内容./message.jsp/user/list.jsp.Struts.xml 的写法可以从 Struts2完整包/app/ struts2-blank-.wardelete list重定向到另一个Actionlist(Action的name)Result重定向到另一个地址/index.jsp3.10.4 用户列表功能user/list.action UserAction.list() /user/list.jsplist() 1. 查询记录得到数据集合 results2. setAttribute(属性名, results)3. return 结果名list.jsp$ 删除 user/delete.action?id=$user.id 修改user/editUI.action?id=$user.id3.10.5 删除user/delete.action?id=3 UserAction.delete() message.jsp/ list.action1. findById() - User user;2. dao.delete(user);3.10.6 表单AJAX验证功能前台写法:用户名: 后台写法:String ajaxValidate1. 用户名敏感词禁止注册BadWordsFilter2. 用户名唯一3. Email唯一4. 图片验证码合法Action配置:/ajax_response.jsp/ajax_response.jsp$message3.10.7 注册/reg.jsp + /regcode.jsp + EasyValidation reg() /message.jspregcode.jsp(可用Servlet代替) 生成验证码1. 设置页面内容类型为图片2. 清空以前缓冲区3. 创建彩色缓冲图4. 获取图形(画笔)对象5. 填充白色的背景6. 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到(可选)7. 绘制颜色为红色8. 生成随机数字验证码并存入session, 然后输出到图片中9. 设定字体10. 绘制验证码到图片上11. 关闭对象, 释放内存, 刷新到图形对象12. 使用ImageIO把内存的图片编码到输出流, 参数依次为: 图片对象, 格式(png,jpg), 输出流难点(可复制粘贴): 255)fc = 255;if (bc 255)bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);%/随机产生155条干扰线,使图象中的认证码不易被其它程序探测到g.setColor(getRandColor(160, 200);for (int i = 0; i 155; i+) int x = random.nextInt(100);int y = random.nextInt(20);int xl = random.nextInt(12);int yl = random.nextInt(12);g.drawLine(x, y, x + xl, y + yl);reg() 注册方法1. 检查session验证码和表单参数中是否一致2. 检查输入的验证码3. 用户名敏感词禁止注册4. 密码MD5保存5. 保存注册日期6. 设置激活状态为false7. 生成一个激活码 activeCode并存入数据库UUID8. 重命名文件并保存上传的图片到 /upload9. 获取/upload真实路径10. 重命名为 uuid.扩展名11. File.renameTo()快速复制文件12. 更新头像的存储路径到实体类13. 发送激活邮件String activeURL = http:/localhost:8080/myscm2/user/activation.action?code=+ activeCode;String message = 您注册了新用户, 激活码是: + activeCode+ , 可点击此地址激活账户: + + activeURL + + ;返回注册结果页面3.10.8 激活activation() message.jsp从表单参数读取激活码根据UUID激活码找到当前用户from User where tempcode = ?检查激活状态, 如果已经激活, 就提示他无需重复激活更新激活标志位(active)到数据库返回成功激活/失败信息3.10.9 用户登录login.jsp login() message.jsp1. 对密码进行MD5摘要计算2. 是否存在给定用户(根据用户名查找)检查是否激活!3. 如果用户存在, 比较用户名, 密码和用户类型4. 登录成功用户信息存入Session- loginedUser更新登录次数5. 显示登录结果6. 根据用户类型转向不同的功能页面1. 管理员转向 /admin/index.jsp2. 其他用户转向/welcome.jsp3.10.10 用户注销logout.jsp清空session或者invalidate session3.10.11 修改用户自己资料user/edit.jsp update() message.jsp如果是后台管理, 需要根据ID查出用户的信息修改的步骤:1. 从Action查出用户的信息editUI()1. findById() - User user;2. setAttribute(user, user)3. 返回到edit.jsp2. 显示修改表单页面user/edit.jsp - 根据ID修改用户(后台), 修改自己的就不需要.只修改了一部分字段3. 提交到Action来更新数据update()1. 数据库找findById() - User user; 老记录(根据ID改才需要)2. 先设置user部分字段的新信息, 再update()如果头像不为空, 需要先删掉老头像, 再保存新头像并更新到数据库3. 转向message/4. 显示修改结果(成功/失败)3.10.12 取回密码retrievePassword.htm UserAction.retrivePwd() + 发邮件给用户 message.jspEmail有效性检查根据Email找到用户信息生成一个随机的密码并MD5摘要后更新到数据库发送取回密码通知邮件 + 提示用户去检查邮箱3.10.13 修改个人密码user/changePassword.jsp UserAction.changePassword() message.jsp检查旧密码不能为空, 新旧密码必须一致, 长度限制1. 确保用户登录2. 取出已登录用户信息3. 检查用户输入的旧密码(MD5)是否正确4. 新密码MD5存入数据库5. 更新下session里面的loginedUser对象6. 提示更新成功 + 用户通知邮件(TODO)3.10.14 根据ID查看用户信息findById() user/viewInfoById.jspfrom User where id = ?用户信息存入 request的attribute: setUser(u);转向前台页面用EL显示3.11 开发安全过滤器模块自底而上的控制方式/目录/文件名ROLE, /目录/文件名ROLE, /目录/*四个路径变量, 四个HQL, 四个boolean值分别对应HQL的执行结果, 有记录就是true四个路径变量1. 请求上下文路径 contextPath /myscm22. 请求路径 requestPath/myscm2/admin/index.jsp3. 资源相对路径 resourceUri= requestPath.substring(contextPath.length() - /admin/index.jsp4. 目录通配符路径 folderUri - /admin/*取到RoleID四个HQLl 资源访问检查的顺序是(以访问/admin/index.jsp为例):1. 检查是否存在允许访问/admin/index.jsp的角色 条件1; trueselect count(*) from resource where uri= /admin/index.jsp l 2. 检查是否存在允许访问/admin/*的角色 条件2; trueselect count(*) from resource where uri= /admin/*3. 如果 条件1 和 条件2 都不存在, 则允许任何角色访问此URL;4. 如果 条件1 或 条件2 之一存在, 那么只有允许的角色才可访问此URL, 进入5;5. 检查 是否存在允许当前角色访问/admin/index.jsp的记录, 是则运行访问, 否则进入下一步; select count(*) from resource where uri= /admin/index.jsp and roleId = -1l 6. 检查是否存在允许当前角色访问/admin/*的记录, 是则允许访问, 否则禁止用户访问并显示出错信息. select count(*) from resource where uri= /admin/* and roleId = -13.12 开发后台管理模块(此模块建议作为练习)3.12.1 前台设计技术细节: XLoadTree实现树状组件tree.xml text 标签 src 指向另一个xml树定义 action 超链接地址 icon 目录/节点展开前的图片 openIcon 目录展开后的图片target 超链接的目标框架(文档中没有)l 可视化HTML编辑器:FckEditor window.onload = function()var sBasePath = fckeditor/ ;/ 指向 fckeditor的存放目录var oFCKeditor = new FCKeditor( 要替换的文本区表单域的名字 ) ;oFCKeditor.Height= 500px ;/ 高度, 可以用 100%/oFCKeditor.Width=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论