版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五篇
项目实践篇JavaWeb开发从入门到实践JavaWebDevelopmentFromIntroductiontoPractice项目案例Chap14企业新闻管理系统:提纲项目案例:企业新闻管理系统项目设计主要围绕系统的功能需求与架构进行规划,数据库设计包括数据库概念结构设计、逻辑结构设计和创建数据库,系统管理包括准备系统开发环境、JSP页面管理和组件与Servlet管理,组件设计确保各模块高效协作,后台管理子系统实现新闻相关功能,前台展示子系统提供新闻浏览功能。14.1项目设计14.2数据库设计14.3系统管理14.4组件设计14.5后台管理子系统的实现14.6前台展示子系统的实现14.7本章小结14.1项目设计14.1.1系统功能需求14.1.2功能结构14.1.1系统功能需求后台新闻管理子系统前台信息展示子系统14.1.2功能结构图
14-1
系统功能结构图14.2数据库设计14.2.1数据库概念结构设计14.2.2数据库逻辑结构设计14.2.3创建数据库14.2.1数据库概念结构设计在设计数据库之前,需要明确系统有哪些实体对象,根据实体对象间的关系设计数据库。E-R图能够直观地表示实体类型和属性之间的关联关系。下面根据新闻管理系统的需求为本项目的核心实体对象设计E-R图,具体如下。(1)用户实体(user)的E-R图图
14-2
用户实体的E-R图14.2.1数据库概念结构设计(2)新闻实体(news)的E-R图图
14-3
新闻实体的E-R图(3)公告实体(notice)的E-R图图
14-4
公告实体的E-R图14.2.2数据库逻辑结构设计将数据库概念结构设计中的E-R图转换为MySQL数据库所支持的实际数据模型,即数据库的逻辑结构。(1)用户信息表(user)表
14-1用户信息表字段名类型是否为空是否为主键描述useridint否是用户编号usernamevarchar(50)否否用户名passwordvarchar(50)否否密码emailvarchar(50)否否电子邮箱roletinyint是否角色(1管理员0普通用户)lastlogintimevarchar(50是否最后登录时间14.2.2数据库逻辑结构设计(2)新闻表(news)表
14-2新闻表字段名类型是否为空是否为主键描述newsidint否是新闻编号newstitlevarchar(50)否否新闻标题newscontentvarchar(500)否否新闻内容newstimevarchar(50)是否发布时间adminnamevarchar(50)是否发布人用户名14.2.2数据库逻辑结构设计(3)公告表(notice)表
14-3公告表字段名类型是否为空是否为主键描述noticeidint否是公告编号noticetitlevarchar(50)否否公告标题noticecontentlongtext是否公告内容noticetimevarchar(50)否否发布时间adminnametinyint否否发布人用户名14.2.3创建数据库根据14.2.2小节的逻辑结构,创建数据表。14.3系统管理14.3.1准备系统开发环境14.3.2JSP页面管理
14.3.3组件与Servlet管理14.3.1准备系统开发环境系统开发环境导入相关的jar包本系统的软件开发及运行环境如下。(1)操作系统:Windows10或更高的Windows版本(2)JDK环境:corretto-17javaversion"17.0.9"(3)开发工具:IntelliJIDEA2023(4)Web服务器:apache-tomcat-10.0.27(5)数据库:MySQL8.0.32(6)浏览器:推荐谷歌或火狐浏览器本系统采用纯Java数据库驱动程序连接MySQL8.0.32,使用Servlet作为控制器,页面使用EL表达式和JSTL标签库展示数据,所以需要将mysql-connector-java-8.0.16.jar、servlet-api.jar、jakarta.servlet.jsp.jstl-2.0.0.jar、jakarta.servlet.jsp.jstl-api-2.0.0.jar添加到项目中。14.3.2JSP页面管理本系统由后台管理和前台展示两个子系统组成前台展示子系统图
14-1
前台主界面14.3.2JSP页面管理首页index.jsp核心代码<divclass="bgStyle">
<divclass="header">
<divclass="logo">
<h2style="color:white;font:bold30px楷体">企业新闻管理系统</h2>
</div>
<divclass="cssmenu">
<ul>
<li><ahref="index.jsp">首页</a></li>
<li><ahref="about.jsp">企业简介</a></li>
<li><ahref="newsListFrontServlet">新闻</a></li>
<li><ahref="noticeListFrontServlet">公告</a></li>
<li><ahref="../admin/register.jsp">注册</a></li>
<li><ahref="../admin/login.jsp">进入后台</a></li>
</ul>
</div>
<divclass="clear"></div>
</div>
</div><divclass="second_banner"><imgsrc="img/img2.jpg"></div>14.3.2JSP页面管理后台管理子系统图
14-4
新闻列表页面14.3.2JSP页面管理后台管理新闻列表页面news.jsp的核心代码...
<linkrel="stylesheet"href="css/amazeui.min.css"/><linkrel="stylesheet"href="css/admin.css"/><scriptsrc="js/main.js"></script><scriptsrc="js/news.js"></script>
...<headerclass="am-topbaradmin-header"style="background-color:#2167A9;height:60px">
<divclass="am-topbar-brand"style="color:white;font-size:20px">
<strong>企业新闻管理系统</strong><small>后台管理</small>
</div>
<divclass="am-collapseam-topbar-collapse"id="topbar-collapse">
<ulclass="am-navam-nav-pillsam-topbar-navam-topbar-rightadmin-header-list">
<liclass="am-dropdown"> <aclass="am-dropdown-toggle"style="color:white"
href="LogoutServlet">退出
</a> </li>
</ul>
</div>
</header>...
14.3.2JSP页面管理<divclass="admin-sidebaram-offcanvas"style="background-color:#859FCD;margin:10px10px"id="admin-offcanvas">
<divclass="am-offcanvas-baradmin-offcanvas-bar"style="height:200px">
<ulclass="am-listadmin-sidebar-list">
<listyle="background-color:#859FCD;"> <ahref="newsListServlet"style="color:white"title="新闻管理"> <imgsrc="img/title1.png"width="25px"/>新闻管理</a></li>
<listyle="background-color:#859FCD;"> <ahref="noticeListServlet"style="color:white"title="公告管理">
<imgsrc="img/title2.png"width="25px"/>公告管理</a></li>
<li
style="background-color:#859FCD;"> <ahref="userListServlet"style="color:white"title="用户管理">
<imgsrc="img/title3.png"width="25px"/>用户管理</a></li>
</ul>
</div>
</div>...
14.3.3组件与Servlet管理本系统使用的组件与Servlet包层次结构如图14-5所示。图
14-5
包层次结构图(1)dao包。dao包中存放的Java程序是实现数据库的操作。BaseDao里面存放通用的方法,如获取数据库连接对象、释放资源、执行增删改操作和执行查询的方法,提高了代码的复用。有关新闻管理系统的数据访问在该类中。(2)filter包。filter包中包含中文乱码(EncodingFilter)和登录验证(LoginCheckFilter)二个过滤器。(3)pojo包。pojo包中的类是实现数据封装的实体bean。(4)servlet包。servlet包中存放的类用来接收客户端请求和响应数据。(5)utils包。utils包中存放的是系统的工具类,包括类型转换等。14.4组件设计14.4.1过滤器14.4.2验证码
14.4.3实体模型14.4.4数据库操作14.4.5工具类14.4.1过滤器本系统使用了字符编码和登录验证二个过滤器。设置字符编码过滤器publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
//转子接口
HttpServletRequestrequest=(HttpServletRequest)servletRequest;
HttpServletResponseresponse=(HttpServletResponse)servletResponse;
response.setContentType("text/html;charset=UTF-8");
//获取请求方式
Stringmethod=request.getMethod();
14.4.1过滤器
//处理请求乱码
if(method.equalsIgnoreCase("POST")){//POST方式
request.setCharacterEncoding("UTF-8");
}else{//GET方式
//取出key-value键值对
Mapmap=request.getParameterMap();
Set<String>keys=map.keySet();
for(Stringkey:keys){
//根据key取值
String[]values=(String[])map.get(key);
for(inti=0;i<values.length;i++){
values[i]=newString(values[i].getBytes("iso-8859-1"),"UTF-8");//转码
}
}
}
//放行
filterChain.doFilter(request,response);
}14.4.1过滤器登录验证过滤器publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)servletRequest;HttpServletResponseresponse=(HttpServletResponse)servletResponse;HttpSessionsession=request.getSession();Stringrequest_uri=request.getRequestURI();StringctxPath=request.getContextPath();Stringuri=request_uri.substring(ctxPath.length());Objectuser=session.getAttribute("user");if(user==null&&(uri.contains("news")||uri.contains("user")||uri.contains("notice"))){ PrintWriterout=response.getWriter(); out.println("<script>alert('请先登录!');location.href='login.jsp';</script>");}else{ filterChain.doFilter(request,response);}}14.4.1过滤器web.xml配置过滤器<!--处理乱码过滤器--><filter><filter-name>EncodingFilter</filter-name><filter-class>com.swxy.filter.EncodingFilter</filter-class></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--登录验证过滤器--><filter><filter-name>LoginCheckFilter</filter-name><filter-class>com.swxy.filter.LoginCheckFilter</filter-class></filter><filter-mapping><filter-name>LoginCheckFilter</filter-name><url-pattern>/admin/*</url-pattern></filter-mapping>14.4.2验证码编写ValidateCodeServlet.java生成验证码packagecom.swxy.servlet;
importjakarta.servlet.ServletException;
importjakarta.servlet.ServletOutputStream;
//省略导入包publicclassValidateCodeServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
doPost(req,resp);
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
Stringcode="";//存放验证码
//一、准备画板、画笔
intwidth=80;
intheight=30;
BufferedImagebi=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//画板
Graphicsgraphics=bi.getGraphics();//画笔
14.4.2验证码
//二、画图
//1、填充背景
graphics.setColor(Color.white);
graphics.fillRect(0,0,width,height);
//2、画矩形边框
graphics.setColor(Color.gray);
graphics.drawRect(0,0,width-1,height-1);
Randomrandom=newRandom();
//3、画噪音码
for(inti=1;i<=80;i++){
intr=random.nextInt(255);
intg=random.nextInt(255);
intb=random.nextInt(255);
graphics.setColor(newColor(r,g,b));
graphics.drawOval(random.nextInt(width),random.nextInt(height),2,1);
}
14.4.2验证码
//4、画干扰线
graphics.drawLine(0,0,random.nextInt(width),random.nextInt(height));
graphics.drawLine(random.nextInt(width),random.nextInt(height),random.nextInt(width),random.nextInt(height));
graphics.drawLine(random.nextInt(width),random.nextInt(height),random.nextInt(width),random.nextInt(height));
//5、画字母或数字
graphics.setFont(newFont("楷体",Font.ITALIC,30));//设置字体
intr=random.nextInt(125);
intg=random.nextInt(125);
intb=random.nextInt(125);
graphics.setColor(newColor(r,g,b));//颜色
char[]ch={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'};
14.4.2验证码 for(inti=1;i<=4;i++){
charc=ch[random.nextInt(ch.length)];
code+=c+"";
graphics.drawString(c+"",16*i,24);
}
HttpSessionsession=req.getSession();
session.setAttribute("code",code);//随机生成的验证码放入session作用域
resp.setCharacterEncoding("utf-8");
ServletOutputStreamsos=resp.getOutputStream();
ImageIO.write(bi,"jpg",sos);//参数1:画板
参数2:图形格式
参数3:输出流
sos.close();
}
}14.4.3实体模型在控制层(Servlet)使用实体模型封装JSP页面提交的信息,然后由控制层将实体模型传递给业务层(Service)、数据层(DAO)。14.4.4数据库操作本系统有关数据库操作的Java类位于包dao中,为了方便管理,复用代码,常用的数据库操作都由BaseDao实现。新闻管理代码由NewsDao实现,公告管理代码由NoticeDao实现,用户管理代码由UsersDao实现。14.4.5工具类工具类CommonUtils.java14.5后台管理子系统的实现14.5.1用户注册14.5.2用户登录
14.5.3新闻列表页面14.5.4添加新闻14.5.5修改新闻14.5.6删除新闻14.5.1用户注册视图图
14-6
用户注册界面14.5.1用户注册控制器该控制器Servlet对象的<url-pattern>是/admin/RegisterServlet,控制器获取视图的请求后,将视图中的信息封装在实体模型News中,传递给数据层。注册成功后跳到登录界面进行登录RegisterServlet.java核心代码...UsersDaousersDao=newUsersDao();HttpSessionsession=req.getSession();//验证码生成后放在session中,这里获取session中的验证码ObjectsessionCode=session.getAttribute("code");14.5.1用户注册if(sessionCode.toString().equals(code)){ booleanresult=usersDao.registerUser(user); if(result){ session.setAttribute("user",user);
out.println("<SCRIPTLANGUAGE='JavaScr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑监理基础施工协议
- 农业创新园区停车场改造合同
- 钻孔工程安全生产考核合同
- 环保工程木地板工程合同
- 医院管理团队聘用合同
- 租用合同样本:消防设备
- 护理科研项目管理与实施
- 药品采购绩效评估体系
- 电子产品招投标市场现状分析
- 陶瓷制品厂建设钢结构施工合同
- 锅炉控制器modbus协议支持说明
- 粉末涂料有限公司危废库安全风险分级管控清单
- 安全生产信息管理制度全
- 住宅物业危险源辨识评价表
- 世界主要国家洲别、名称、首都、代码、区号、时差汇总表
- 2023学年广东省广州市越秀区铁一中学九年级(上)物理期末试题及答案解析
- 《报告文学研究》(07562)自考考试复习题库(含答案)
- 安全操作规程
- 电源日常点检记录表
- 人教版小学三年级语文上册期末测试卷.及答题卡2
- 钢轨接头位置及接头联结形式
评论
0/150
提交评论