




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaEE 三层架构 环境搭建、架构思想、代码书写_指导手册 一、 前言 1.1 文档说明 文档以“中原工学院自然语言处理项目”中 “网络变异词”模块 为参考对象,重点阐述 JavaEE 三层架构思想及简要说明各层代码的意 义。 文档只包含了重要步骤及截图,具体配置时以实际操作为主。 1.2 MVC 思想 MVC 的全称是 Model-View-Controller,即“模式视图控制器” , 其思想是:首先用户通过视图层发出请求,接着控制器接受用户的请求, 并决定调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请 求并返回数据,最后控制器将处理后的数据传递给视图层,通过视图层 将结果展现给用户。 1.3 文档使用对象 具备 JavaSE 基础的 JavaEE 开发人员 二、 项目开发工具 2.1 开发平台 Microsoft Windows 7 专业版 /旗舰版 2.2 所需软件 操作系统位数 软件名称 32 位 64 位 下载 url 软件作用 Jdk、 Jre jdk-7u25- windows-i586.exe jdk-7u25- windows-x64.exe /technetwork/ java/javase/downloads/index.html Java 开发工具及 运行环境 eclispe eclipse-jee-kepler- R-win32.zip eclipse-jee-kepler- R-win32-x86_64.zip /downloads/ 开发 Java 项目的 IDE Tomcat apache-tomcat-7.0.42- windows-x86.zip apache-tomcat-7.0.42- windows-x64.zip /download- 70.cgi 开发 JavaEE 项 目的 Web 容器 Spket spket-1.6.23.zip /download.htm l 开发 ExtJS 的 eclipse 插件 ExtJS ext-4.2.1.zip /products/ extjs/download/ ExtJS 官方包 Server 端 VisualSVN-Server-2.6.4.msi /server/ download/ 项目版本管理软 件服务器端 Client 端 TortoiseSVN-40- win32-svn-1.8.1.msi TortoiseSVN- 4570-x64-svn- 1.8.1.msi /downloads.html 项目版本管理软 件客户端 SVN subclipse site-1.10.1.zip /archive/ SVN 的 eclipse 插件 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 3 / 44 三、 开发环境搭建 约定统一在 D 盘根目录下建立以 Java(首字母大写)命名的文件 夹,与课程相关的所有内容统一放在 D:Java 路径下,如下图所示 3.1 安装 jdk、jre 3.1.1 安装 jdk、jre 双击 jdk-7u25-windows-*.exe,设置 jdk 和 jre 的安装路径分别为 D:JavaJavajdk1.7.0_25 和 D:JavaJavajre1.7.0_25。出现下图,则说明 jdk、jre 安装成功。 3.1.2 配置 jdk、jre jdk、jre 安装成功后,需进行环境变量的配置。右键单击“我的电脑” “高级系统设置” “环境变量” “系统变量” 按如下表配置 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 5 / 44 环境变量名 环境变量值 JAVA_HOME D:JavaJavajdk1.7.0_25 CLASSPATH .;%JAVA_HOME%lib;%JAVA_HOME%jrelib PATH ;%JAVA_HOME%bin;%JAVA_HOME%jrebi n 备注: CLASSPATH 环境变量值中的 “.”勿遗漏,其代表当前路径 PATH 中的“”表示以前 path 中的值 3.1.3 验证 jdk 是否配置成功 方式一: 编写如下简单 java 代码,并将文件命名为 TestJdkJre.java,放置在 D:Java 路径下, 输入下图窗口中的命令,若输出“Jdk and jre were installed successfully”, 则说明 jdk 和 jre 配置成功。 方式二: 在命令行中执行如下两个命令,若出现如下窗口,则说明 jdk 配置成功 public class TestJdkJre public static void main(String args) System.out.println(“Jdk and jre were installed successfully“); 建议在 Linux 下安装一次 jdk、jre,以进一步体会 jdk、jre 的配置意义和作用。 3.2 安装 eclipse 3.2.1 运行 eclispe 将 eclipse-jee-kepler- R-*.zip 解压缩到 D:Java 目录下,并重命名为 eclipse_javaee,进入 eclipse_javaeeeclipse 目录中,eclipse 是免安装软件,双击 eclipse.exe 即可运行 eclipse 集成开发工具。 3.2.2 设置 eclispe 的工作空间 将 eclipse 的工作空间设置为 D:Java workspace,方便进行以后的团队开发。 3.3 安装 Tomcat 3.3.1 解压缩 Tomcat 将 apache-tomcat-7.0.42-windows-*.zip 解压缩到 D:Java 路径下, 并重命名为 apache-tomcat-7.0.42。 3.3.2 运行 Tomcat 进入 apache-tomcat-7.0.42bin 路径下,双击 startup.bat,启动 Tomcat 服务器。出现如下图窗口,窗口中无报错,则说明 Tomcat 启 动成功。 可通过 apache-tomcat-7.0.42bin 路径下的 shutdown.bat 关闭 tomcat 服务器 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 7 / 44 3.3.3 测试 tomcat 通过 http:/localhost:8080(8080 为 Tomcat 的默认端口,后续可通过配置 更改此访问端口) ,出现如下界面则说明 Tomcat 启动成功 3.3.4 配置 Tomcat 添加环境变量 参考 jdk、jre 环境变量的配置,配置 Tomcat 的环境变量 环境变量名 环境变量值 TOMCAT_HOME D:Javaapache-tomcat-7.0.42 PATH ;%TOMCAT_HOME%bin 更改访问 Tomcat 的端口 修改 TOMCAT_HOMEconf路径下的 文件 测试更改后的端口 出现上图,则说明端口更改成功。 为了让 Tomcat 列出 Web 应用根路径下的所有页面,修改 TOMCAT_HOMEconf路径下的 web.xml 文件,将参数 listings 的默认值 false 改为 true 添加管理 Tomcat 用户 修改 TOMCAT_HOMEconf路径下的 文件 测试添加的用户 点击下图页面中的 Manager App,提示输入刚才配置的用户名、密码。 登录成功后,可管理 Tomcat 中已部署的 Web 项目。 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 9 / 44 建议在 Linux 下安装一次 Tomcat,以进一步体会 Tomcat 的安装配置。 3.4 集成 Tomcat 到 eclispe 按如下步骤将 Tomcat 集成到 eclispe 中,以后可通过 eclispe 管理 Tomcat 服 务器。显示 Java EE 透视图下的 Servers 视图,按如下步骤操作 Step 1 Step 2 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 11 / 44 Step 3 点击 Finish,Tomcat 集成到 eclipse 操作完成。 可通过 http:/localhost:8080 验证。 3.5 搭建 ExtJS 开发环境 3.5.1 安装 Spket 此处推荐采用 link 法安装 eclispe 插件 spket,步骤如下: 1、 在 eclispe 安装目录 D:Javaeclipse_jeeeclipse 下,建立文件夹 addPlugins 2、在 addPlugins 目录下,建立文件夹 spket-1.6.23,将下载的 spket-1.6.23.zip 解 压缩,然后将其目录下的 eclipse 文件夹复制到addPluginsspket-1.6.23 路径 下 3、在 eclispe 安装目录 D:Javaeclipse_jeeeclipse 下,建立空文件夹 links,打开 记事本,在其中输入 “path=D:Javaeclipse_javaeeeclipseaddPluginsspket-1.6.23”,保存文件 并命名为 spket-1.6.23.link,保存 spket-1.6.23.link 至 eclipse_jeeeclipselinks 中 4、重启 eclispe 3.5.2 验证 Spket 是否安装成功 启动 eclispe 后,通过 Window Preferences,若出现如下界面,则说明 Spket 插件安装成功。 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 13 / 44 3.5.3 配置 Spket 打开 Spket,选择 JavaScript Profiles New,如下图操作 Step 1 add library,选择 ExtJS Step 2 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 15 / 44 add file,选择 D:Javaext-83 目录下的 ext-all-dev.js 文件(按照约定,ext- 4.2.1.zip 同样已解压到 D:Java路径下) Step 3 设置 ExtJS 为默认的 JavaScript Profiles Step 4 选择*.js ,选择 Spket JavaScript Editor,点 default,将*. js 文件的默认打开方 式设置为用 Spket 插件打开。 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 17 / 44 Step 5 重启 Eclipse,通过如下步骤建立测试项目 File New Dynamic Web Project,建立名为“extjs_env_test”的测试项目, 以测试 Spket 是否安装成功。 点击 Finish 在 WebRoot 下建立如下图结构 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 19 / 44 其中,extjs_env_test.js 文件的内容如下 Ext.onReady(function() Ext.MessageBox.alert(“提示信息 “, “ExtJS开发环境配置成功 余建新“); ); index.jsp 文件的内容如下 3.5.4 验证 Spket 是否配置成功 编写 js 代码时有自动提示,如下图所示,则说明 Spket 配置成功。 “ hadoop2013 hadoop云盘项目 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 21 / 44 3.5.5 验证 ExtJS 开发环境是否配置成功 将项目发布到 Tomcat 上,启动 Tomcat,按如截图方式访问,若出现 如下窗口,则说明 ExtJS 开发环境配置成功。 3.6 安装 SVN 说明: SVN 服务端和客户端的安装、配置及使用较简单,此文档没再 囊括,大家可参考网络资源。 3.7 集成 SVN 到 eclipse 3.7.1 安装 subclipse 插件 subclipse(SVN 的 eclispe 插件)的安装方法同样可采用 link 法,具体 安装步骤可参考 Spket 插件的安装。 安装完成后,通过 Window Show View Other 输入 svn,若出现下 图窗口,则说明 subclispse 插件安装成功。 3.7.2 使用 subclipse subclipse 的使用方法可参考网络资源。 JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 23 / 44 四、 项目命名规范 五、 项目后台开发步骤 5.1 src 源文件夹下 准备工作 在 src 源文件夹下,建立如图 3-1 所示的包层次结构。 图 3-1 3.1.1 model 层 表 3-1 variationword.xlsx 根据表 3-1 variationword.xlsx,建立对象模型,代码如下 Entity Table(name = “T_VARIATION_WORD“) public class VariationWord extends BaseEntityModel private static final long serialVersionUID = -404303562119301462L; private Long code; private String varwordId; private String netword; private String replaceWord; private String note; / 字段编码(数据库中每条记录的标识) Column(name = “CODE“) public Long getCode() return code; / 实体标识 Column(name=“VARWORD_Id“, nullable=false, length = 20) public String getVarwordId() return varwordId; / 网络词 Column(name=“NETWORD“, nullable=false, length = 40) public String getNetword() return netword; / 直接替换词 Column(name=“REPLACEWORD“, nullable=false, length = 40) public String getReplaceWord() return replaceWord; / 附注 Column(name=“NOTE“, length = 60) public String getNote() return note; public void setVarwordId(String varwordId) this.varwordId = varwordId; public void setNetword(String netword) word = netword; public void setReplaceWord(String replaceWord) this.replaceWord = replaceWord; public void setNote(String note) this.note = note; / 附注 Column(name=“NOTE“, length = 60) public String getNote() return note; public void setCode(Long code) this.code = code; public void setVarwordId(String varwordId) this.varwordId = varwordId; public void setNetword(String netword) word = netword; public void setReplaceWord(String replaceWord) this.replaceWord = replaceWord; public void setNote(String note) this.note = note; JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 25 / 44 注解说明: 以上* 均为 Spring的注解,各注解的具体意义见表3-2 表3-2 序号 注解名 注解具有的属性 注解(或属性)意义 备注 1 Entity 标志一个实体,对应数据库中 的一张表 2 Table 对应数据库中的表名 name 指定列名 nullable 是否允许列为空3 Column length 指定列长度 BaseEntityModel继承自基类BaseEntityModel ,下面是BaseEntityModel 的代码 MappedSuperclass public class BaseEntityModel extends BaseModel private static final long serialVersionUID = -6163675075289529459L; Column(name = “ENTITY_NAME“) String entityName; / 实体创建时间 Temporal(TemporalType.TIMESTAMP) Column(name = “DATECREATED“) protected Date dateCreated; / 实体修改时间 Temporal(TemporalType.TIMESTAMP) Column(name = “DATEMODIFED“) protected Date dateModified; / 实体是否被删除 Column(name = “DELETED“) protected Boolean deleted; / 实体主键 Id Column(name = “ID“) GeneratedValue(strategy = GenerationType.AUTO) Long id; / 重写父类BaseModel 的 equals方法,判断传入对象是否与当前对象相等 Override public boolean equals(Object obj) if (null != obj) if (obj instanceof BaseEntityModel) BaseEntityModel domain = (BaseEntityModel) obj; if (this.id = domain.id) return true; return false; JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 27 / 44 public Date getDateCreated() return dateCreated; public Date getDateModified() return dateModified; public Long getId() return id; / 因为重写了父类BaseModel的equals 方法, / 此处需要重写父类BaseModel的hashCode 方法 Override public int hashCode() if (this.id = null) this.id = Long.valueOf(0); return HashCodeBuilder.reflectionHashCode(this.id); public Boolean isDeleted() return deleted; public void setDateCreated(Date dateCreated) this.dateCreated = dateCreated; / 省略了其他setter方法 / 重写父类BaseModel 的toString 方法 Override public String toString() return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); BaseEntityModel 继承自基类BaseModel /* * Base class for Model objects. Child objects should implement toString(), * equals() and hashCode(). * * author Liu Xiaoming */ SuppressWarnings(“serial“) public abstract class BaseModel implements Serializable /* * Returns a multi-line String with key=value pairs. * * return a String representation of this class. */ public abstract String toString(); /* * Compares object equality. When using Hibernate, the primary key should * not be a part of this comparison. * * param o * object to compare to * return true/false based on equality tests */ public abstract boolean equals(Object o); /* * When you override equals, you should override hashCode. See “Why are * equals() and hashCode() importation“ for more information: * /109.html * * return hashCode */ public abstract int hashCode(); JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 29 / 44 序 号 注解名 注解(或属性)意义 备注 1 MappedSuperclass 用在实体的继承过程中的父 类上,子类多个继承,生成 多个表 2 Temporal(TemporalType. TIMESTAMP) 以TIMESTAMP的形式存储时 间 3 Id 主键标识 4 GeneratedValue(strategy = GenerationType.AUTO) 设置主键的生成规则, AUTO表示 主键由程序控制 3.1.2 dao 层 定义从 GenericDao 继承的接口 VariationwordDao,代码如下 父接口 GenericDao 代码如下,从对 GenericDao 接口的注释“Generic DAO (Data Access Object) with common methods to CRUD POJOs.” 可以看出 GenericDao 已经封装了对普通 JavaBeans 的 CRUD 操作。 其中 JpaRepository 和 JpaSpecificationExecutor 的 API 链接为 /spring-data/data-jpa/docs/current/api/,二者是 Spring Data Project 下的接口。 public interface VariationwordDao extends GenericDao /* * Generic DAO (Data Access Object) with common methods to CRUD POJOs. * Implemented with Spring-Data-JPA Repository * * Extend this interface if you want type safe (no casting necessary) DAOs for * your domain objects. * * author Liu Xiaoming * param * a type variable,实体类型 * param * the primary key for that type,实体类Id */ public interface GenericDao extends JpaRepository, JpaSpecificationExecutor JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 31 / 44 3.1.3 service 层 代码说明: 定义从 GenericManager 继承的接口 VariationwordManager。GenericManager 的代码如下 public interface VariationwordManager extends GenericManager List findByWord(String word); List findByWordList(List wordList); /* * Generic Manager that talks to GenericDao to CRUD POJOs. * * Extend this interface if you want typesafe (no casting necessary) managers * for your domain objects. * * author Liu Xiaoming * param * a type variable * param * the primary key for that type */ public interface GenericManager /* * param page * return */ public Page findAll(Pageable page); public List findAll(); public T findById(PK id); public T save(T entity); public List save(Iterable entities); 如图 3-2 所示,利用多态的思想,在 impl 包中写 VariationwordManager 的实现 VariationwordManagerImpl,代码如下 图 3-2 注解说明: 各注解的具体意义见表3-3 表3-3 序号 注解名 注解(或属性)意义 备注 1 Service 定义一个 Bean 2 Transactional 配置事务,每一个业务方法开 始时都会打开一个事务 3 Autowired 按 byType自动注入 Service(value=“variationwordManager“) Transactional public class VariationwordManagerImpl extends GenericManagerImpl implements VariationwordManager Autowired public void setVariationwordDao(VariationwordDao variationwordDao) this.dao = variationwordDao; Override public List findByWord(String word) return null; Override public List findByWordList(List wordList) return null; JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 33 / 44 3.1.4 controller 层 controller 层是与用户交互的一层,里面封装了具体的 crud(增删 改查)操作,代码如下 Controller RequestMapping(“/variationword“) public class VariationwordController extends MultiActionController Autowired VariationwordManager variationwordManager; /* * 查询所有网络变异词 * * param request * param response * return */ RequestMapping(method = RequestMethod.GET, value = “/findAll.json“) public Page findAll(HttpServletRequest request, HttpServletResponse response) / 获取url中的页面大小和页号 int pageNumber = Integer.parseInt(request.getParameter(“pageNumber“); int pageSize = Integer.parseInt(request.getParameter(“pageSize“); Pageable pageable = new PageRequest(pageNumber, pageSize, new Sort( Direction.ASC, “id“); Page result = this.variationwordManager .findAll(pageable); return result; /* * 查找指定id值 * param request * param response * return * throws IOException */ RequestMapping(method = RequestMethod.GET, value = “/findById.json“) public Variationword findById(HttpServletRequest request, HttpServletResponse response) / 获取url的传值 long id = Integer.parseInt(request.getParameter(“httpId“); Variationword result = this.variationwordManager.findById(id); return result; /* * 查找单个词 * param request * param response * return * throws IOException */ RequestMapping(method = RequestMethod.GET, value = “/findByWord.json“) public List findByWord(HttpServletRequest request, HttpServletResponse response) throws IOException / 获取url的传值 String word = new String(request.getParameter(“httpWord“).getBytes( “ISO8859-1“), “utf-8“); System.out.println(word); List result = this.variationwordManager.findByWord(word); return result; JavaEE 三层架构_环境搭建_架构思想_代码书写_指导手册 35 / 44 /* * 查找多个词 * param request * param response * return */ RequestMapping(method = RequestMethod.GET, value = “/findByWordList.json“) public List findByWordList(HttpServletRequest request, HttpServletResponse response) List wordList = new ArrayList(); List result = this.variationwordManager .findByWordList(wordList); return result; /* * 增加新词 * param request * param response * throws IOException */ RequestMapping(method = RequestMethod.GET, value = “/add.html“) public void add(HttpServletRequest request, HttpServletResponse response) throws IOException String varwordId = request.getParameter(“varwordId“); String netword = request.getParameter(“netword“); String replaceWord = request.getParameter(“replaceWord“); String note = request.getParameter(“note“); Variationword vw = new Variationword(); vw.setVarwordId(varwordId); vw.setNetword(netword); vw.setReplaceWord(replaceWord); vw.setNote(note); this.variationwordManager.save(vw); 注解说明: 各注解的具体意义见表3-4 表3-4 序号 注解名 注解(或属性)意义 备注 1 Controller 注册 Controller 2 RequestMapping 注册访问时的路径 /* * 删除单词 * param request * param response * throws IOException */ RequestMapping(method = RequestMethod.GET, value = “/delete.html“) public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException long id = Integer.parseInt(request.getParameter(“id“); Variationword vw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿园妇女节主题活动策划方案
- 2025-2030反刍动物甲烷抑制剂研发进展与碳交易市场衔接可能性分析报告
- 2025-2030医疗影像AI辅助诊断系统临床应用与市场准入研究报告
- 仓储管理信息化系统开发方案
- 2025-2030动力锂电池回收利用技术路线与环保标准研究报告
- 2025-2030动力电池隔膜材料技术壁垒与产能布局战略研究咨询报告
- 2025-2030动力电池负极材料技术路线选择与产能规划建议
- 2025-2030动力电池碳足迹核算标准对出口企业的合规挑战
- 2025-2030动力电池硅基负极材料产业化瓶颈突破与供应链本土化战略评估报告
- 2025-2030动力电池梯次利用标准体系完善与储能项目经济性评估报告
- 无人机公司飞手管理制度
- 房地产抵押贷款合同电子版预览
- 电池(组)装配工职业技能鉴定经典试题含答案
- 公路机电安全培训课件
- 质量策划与质量控制培训
- 泥水盾构培训课件
- 个体诊所药品管理制度
- 智联招聘公司管理制度
- 2025年学前教育专业课程考试试题及答案
- 25春国家开放大学《物流信息技术》形考任务1-4参考答案
- 中心医院“十五五”发展规划(2025-2030)
评论
0/150
提交评论