j2ee实习报告
![j2ee实习报告](https://img.360docs.net/img27/0176jamogb5dwnfp9uco-71.webp)
![j2ee实习报告](https://img.360docs.net/img27/0176jamogb5dwnfp9uco-f2.webp)
《j2ee软件开发》课程设计报告
系部:信息工程系
班级:计网0931班
姓名:陈银生
指导老师:陆立松、陈晓华、田娟
学期:2011-2012-1
目录
一、对Struts2的理解 (3)
Struts2的模板和主题介绍 (3)
jsp:基于JSP的模板技术 (4)
理解Struts2拦截器 (4)
实现Struts2拦截器原理 (4)
displaytag问题 (4)
二、对各程序的分析 (5)
※对程序e_learning的分析 (5)
页面关系图 (5)
程序的调试 (5)
关键代码的分析 (6)
※对程序S2SH-Page的分析 (7)
页面关系图 (7)
关键代码的分析 (7)
※对程序s2shOaDemo的分析 (8)
页面实现的效果 (8)
重要代码分析 (10)
※对程序ckeditor的分析 (11)
※对程序display的分析 (11)
分页 (13)
对列排序 (13)
导出数据 (13)
Display Tag的属性设置 (13)
DisplayTag的不足 (13)
三、学习心得 (14)
在为期三个礼拜的j2ee课程设计中,我分别从e_learning、S2SH-Page、s2shOaDemo、ckeditor等程序中,再加上老师的讲解,让我受益匪浅啊,因此我将这三周老师的讲解做了做了初步总结工作。在总结之初我看到了两个问题。一个是要对J2EE认真总结,因为在以后的很长时间里我会离不开J2EE;另一个是要对学习过程和学习方法认真总结,因为这些将伴随我的一生。其实这两方面都很有指导意义,它们指引我未来一段时间要怎么度过,要学习哪些J2EE知识,要怎么学习这些知识。不过总结还有很大缺陷,J2EE组件间的联系和.NET之间的对比等都不是十分明朗。要在后续的课程学习和实践学习中再做完善与总结。J2EE有两个设计初衷,对生产厂商来说,它是一套开放标准,加入这个标准各厂商的产品就是一个成熟的企业运算体系中可以替换的部件了;对于开发者来讲,J2EE是一套现成的解决方案,采用这个解决方案,企业应用中的许多难题,如跨平台、事务处理、安全性等等,就会迎刃而解。所以,下面就是我对这些程序的一些分析。
一、对Struts2的理解
Struts2的模板和主题介绍
因为Struts2所有的UI标签都是基于主题和模板的,主题和模板是Struts2所有UI标签的核心。模板是一个UI标签的外在表示形式,例如:当我们使用
对于一个JSP页面里包含的UI标签而言,即可以直接设置该UI标签需要使用的模板,也可以设置该UI标签使用的主题。实际上对开发者而言,并不推荐直接设置模板属性,而是应该选择特定主题。设置主题的方法有以下几种:1,通过设定特定UI标签上的theme属性来指定主题。
2,通过设定特定UI标签外围的Form标签的theme属性来指定主题。
3,通过取得page会话范围内以theme为名称的属性来确定主题。
4,通过取得request会话范围内以theme为名称的属性来确定主题。
5,通过取得session会话范围内以theme为名称的属性来确定主题。
6,通过取得application会话范围内以theme为名称的属性来确定主题。
7,通过取得名为struts.ui.theme的常量(默认值是xhtml)来确定主题,该常量可以在struts.properties文件或者struts.xml文件中确定。
Struts2的模板目录是通过struts.ui.templateDir常量来指定的,该常量的默认值是template,即意味着Struts2会从Web应用的template目录,CLASSPATH(包括Web应用的WEB-INF\classes路径和WEB-INF\lib路径)的template目录来依次加载特定模板文件。如果我们只使用一个select标签,且指定主题为xhtml,则加载模板文件的顺序
1,搜索Web应用里/template/xhtml/select.ftl文件
2,搜索CLASSPATH路径下的template/xhtml/select.ftl文件
Struts2的模板文件是.ftl文件,它是FreeMarker的模板文件。用户也可以通过修改struts.ui.templateSuffix常量的值来改变Struts2默认的模板技术,该常量接受如下几个值:
ftl:基于FreeMarker的模板技术
vm:基于V elocity的模板技术
jsp:基于JSP的模板技术
虽然Struts2允许使用自己的模板技术,但如果用户选择了使用V elicoty或JSP 作为模板技术,就要实现所有的模板和主题,这个是工作量很大的事情。Struts2默认提供了4个主题:simple,xhtml,css_xhtml和ajax,这4个主题的模板文件放在Struts2的核心类库里(struts2-core.jar包)。
理解Struts2拦截器
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
实现Struts2拦截器原理
Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器
displaytag问题
用这个分页很简单.在displaytab1.1以前只能把所有记录全从数据库查出来,然后给个list给它,它就会自己自动分页,数据量大时影响性能,到1.1版本时,这个问题已经解决,官方文档上说有两种解决方法,下面是其中一种.
requestURI="Page" partialList="true" size="resultSize">: sortable="true" >
二、对各程序的分析
※对程序e_learning 的分析
页面关系图
息
程序的调试
(1)客户登陆
(2)客户注册
(3)注册完成
(4)详细信息
(5)显示用户
关键代码的分析
//因为Hibernate分页的性能问题,使用原生sql来解决
String querySql = "select * from users where 1=1 ";
//用jdbc查询总条数放在totalCount中
Long totalCount =
getDbUtil().getCountByQuerySql(querySql);
//调用父类BaseAction 的方法executePage()进行分页参数相关计算
Page page = executePage(querySql,totalCount," id desc ");
@Component(" ") //相当于一个bean
jsp 中@Override 的作用
之前就知道@Override 标记的功能,它的意思是类中的一个方法
覆盖了父类的方法。当编译类的时候,如果标记为覆盖的方法在父类中没有,编译器就会报错,使用ide 时在写代码的时候如果标记的方法父类中没有就会提示错误。所以这个标记的意义就在于把需要覆盖的方法标记出来,防止自己写错名字
@param querySql 查询SQL
@param beginIndex 开始下标
@param endinIndex 结束下标
※对程序S2SH-Page 的分析
页面关系图
息
关键代码的分析
取得排序名称+desc or asc
@param querySql 查询SQL
@return 返回查询语句 SELECT ... FROM TABLE ORDER BY ID DESC
中的 ID DESC
初始化分页类
* @param initPageSql 未分页的查询SQL
* @param totalCount 总行数
* @param index 分页状态
* @param value 只有在设置每页显示多少条时,值不会NULL,其它为NULL
/**对查询SQL进行分页计算*/
String querySql =
getPageQuerySql(initPageSql,page.getBeginIndex(),
page.getEndinIndex());
/**真正传递到后台执行获取分页数据的sql*/
page.setQuerySql(querySql);
/**保存到Session中*/
return page;
private String message; //使用json返回单个值
private UserInfo userInfo; //使用json返回对象
private List
private Map
※对程序s2shOaDemo的分析
页面实现的效果
(1)address_add.jsp
这个页面是一个个人通讯录,可以增加一个新的联系人,界面如下图:
(2)login.jsp
这个页面是登陆窗口,这里既可以登陆也可以实现注册,界面如下图:
(3)meeting_add.jsp
这个页面是一个会议管理页面,可以增加一个新的会议,界面如下图:
(3)notice_add.jsp
这个页面是一个公告管理页面,可以增加一个新的公告,界面如下图:
(4)register.jsp
这个页面是一个注册页面,可以注册一个新的用户,界面如下图:
重要代码分析
class="https://www.360docs.net/doc/239643977.html,mon.AuthorizationIntercepto r" /> // 请求addressList.do的处理函数 public String list() throws Exception { // 清除错误消息 clearErrorsAndMessages(); // 取得当前分页数据 super.pager = this.getAddressDAO().findPagerByUsername(super .getLoginUsername(), super.pageSize, super.pageNo); // 请求noticeInit.do的处理函数 public String init() throws Exception { // 清除错误消息 clearErrorsAndMessages(); // 重设分页参数 super.pageSize = Constants.pageSize; super.pageNo = Constants.pageNo; // 取得当前分页数据 super.pager = this.getNoticeDAO().findPager(super.pageSize, super.pageNo); // 保存分页数据 setSession(Constants.PAGER_NOTICE, super.pager); return Constants.LIST_KEY; } ※对程序ckeditor的分析 1、这个程序是一个视屏的加载程序,代码分析如下: objectjava Java代码 value="<%=request.getParameter("movie") == null ? "/vedio/canyou_town28s720X576.wmv" : request.getParameter("movie")%> "> struts2拦截器会拦截所有以"/"开头的URL,CKEd的servlet拦截器拦截所 有以"/ckfinder/core/connector/java/connector.java"开头的URL.当时CKEditor上传图片的时候,URL中包含有"/"(指网站根目录),优先被struts2的拦截器拦截,这样上传的URL请求就不会转发到CKEditor的 servlet中,所有上传图片也就不会成功. 另一种方法重写了struts2的过滤器FilterDispatcher中的doFilter方法,执行原理为:获得完整的http url的地址,然后判断URL地址中是否包含CKEditor的servlet拦截规则"/ckfinder/core/connector/java/*/",若包含,struts2就不拦截该URL请求,而直接转发,交友CKEditor的 servlet来处理;若不包含,ze拦截器拦截该URL请求,由struts2来处理 自定义的过滤器写完之后,要在web.xml中更改struts2的拦截器类,不能再使用struts2的默认拦截器类 FilterDispatcher 。但是请放心,自定义的过滤器FCKFilter继承了 FilterDispatcher 里的所有的方法,因此项目依然照常运行。 private static String baseDir;// CKEditor的根目录 private static boolean debug = false;// 是否debug模式 private static boolean enabled = false;// 是否开启CKEditor上传 private static Hashtable allowedExtensions;// 允许的上传文件扩展名 private static Hashtable deniedExtensions;// 阻止的上传文件扩展名 private static SimpleDateFormat dirFormatter;// 目录命名格式:yyyyMM private static SimpleDateFormat fileFormatter;// 文件命名格式:yyyyMMddHHmmssSSS ※对程序display的分析 分页 如果想对代码分页,只需在display:table标签中添加一项 pagesize="每页显示行数". 对列排序 display tag可对列进行排序,就是点击列名,对该列的数据进行排序。你只需对想要排序的列添加 sort="true" 就OK,如下面的代码可对前三列进行排序。在display:table中添加defaultsort="列数",可默认对指定的列排序。 如果table有分页,Display Tag默认只对当前页进行排序,如果想对 整个list排序,可以在display:table之间添加一段代码: 导出数据 在display:table中添加export="true",看看会出现什么! Display Tag默认会提供三种数据导出方式:CSV、Excel、XML 。Display Tag的属性设置 前面所说的display:setProperty 是一种改变Display Tag属性的方法,但是在每个jsp中都要写太麻烦了。 Display Tag中设置了很多默认的属性,它有一个专门的属性文件,是在它的jar包中的displaytag/properties/TableTag.properties 想要改变它的默认属性,我们可以在WEB-INF\classes下新建一个文件displaytag.properties,仿照TableTag.properties中属性的格式设置需要修改的属性。 TableTag.properties中的# messages中设置的是显示在页面上的提示信息。默认是英文的,我们可以把它改为中文的。不过这里只能使用unicode,就是说中文字符必须转换为unicode码,这个可以使用jdk自带的native2ascii.exe进行转换。 DisplayTag的不足 初次使用DisplayTag的人可能会觉得惊喜,但是用久了会发现很多问题,最大的问题是对中文的支持不好,比如如果查询条件中有中文,就无法翻页,无法对中文排序,将中文导出为指定文件时出现乱码等等。这些问题有时候会让人很郁 闷,有时候逼得你要去修改它的源代码。 三、学习心得 自从2009年9月到2011年8月以来,我一直在克拉玛依职业技术学院学习计算机网络。学习内容有:数据库课程、JAVA基础课程、网页设计课程、轻量级J2EE的课程、项目实训、课程考试和毕业考证。 学习数据库,我了解数据库的概念与Java开发之间的关系。学会SQL语言的工具与基本用法,数据库的安装与使用;学会创建数据表;对数据库字段和数据表设计视图查询、增加、修改、删除、存贮。 学习JAVA基础课程,我了解MyEclipse编程环境和计算机程序运行流程。会各种数据类型的表示方法, Java的各种语句概念、程序运行流程的安装与目录结构;各种类的定义和方法使用;JAVA常用工具的使用。 学习网页设计的课程,学会DREAMWARE开发工具的安装与使用;会手工编写简单的HTML的基本结构,会使用各种标签和设计网页框架集、布局设计、框架的控制方。 学习Hibernate的基本概念与环境配置,会手工编写Hibernat配置文件;会HQL各类参数查询和Hibernate各种复杂映射处理技术、复杂数据表查询、分页处理;学习Spring架构、环境配置、与基本实现,Spring的各模块原理与设计;学会STRUTS2.x基本概念、配置、开发流程;会国际化文字设计;熟悉Spring、hibernate集成与应用、Struts2.x与hibernate的集成、Struts、Spring、hibernate集成与应用。 进行项目实训,使我会综合运用专业技术的能力,使我通过项目开发之后,进一步加深对轻量级J2EE课程的理解,并熟悉软件工程各步骤的流程,可以独立设计、开发基本的软件功能模块,初步具有编写文档(数据库设计说明书、原型设计说明书等等)的能力。学会运用各种程序结构,并能熟练应用相关的客户端工具。