Java Web开发技术 课件 7.6 项目的实现_第1页
Java Web开发技术 课件 7.6 项目的实现_第2页
Java Web开发技术 课件 7.6 项目的实现_第3页
Java Web开发技术 课件 7.6 项目的实现_第4页
Java Web开发技术 课件 7.6 项目的实现_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb开发技术7.6项目的实现1

本讲讲解学生信息管理系统的实现:通过Maven配置项目依赖(Servlet、MySQL驱动、C3P0连接池等),创建数据库连接工具类与数据实体,设计DAO层(数据库操作)、Service层(业务逻辑)、Controller层(请求处理),前端用HTML+JS实现登录、角色管理等页面,前后端通过JSON交互。主要内容7.6.1项目依赖包1.项目依赖包的信息管理pom.xml是项目管理中的重要文件,有关项目依赖包可在该文件添加对应的信息。为方便学习,此处给出文件内容并做简要说明。019<dependencies>020<dependency>021<groupId>javax.servlet</groupId>022<artifactId>javax.servlet-api</artifactId>023<version>4.0.1</version>024<scope>provided</scope>025</dependency>026<dependency>027<groupId>org.junit.jupiter</groupId>028<artifactId>junit-jupiter-api</artifactId>029<version>${junit.version}</version>030<scope>test</scope>031</dependency>032<dependency>033<groupId>org.junit.jupiter</groupId>034<artifactId>junit-jupiter-engine</artifactId>035<version>${junit.version}</version>001<?xmlversion="1.0"encoding="UTF-8"?>002<projectxmlns="/POM/4.0.0"003xmlns:xsi="/2001/XMLSchema-instance"004xsi:schemaLocation="/POM/4.0.0/xsd/maven-4.0.0.xsd">005<modelVersion>4.0.0</modelVersion>006007<groupId>com.example</groupId>008<artifactId>sims</artifactId>009<version>1.0-SNAPSHOT</version>010<name>sims</name>011<packaging>war</packaging>012013<properties>014<piler.target>1.8</piler.target>015<piler.source>1.8</piler.source>016<junit.version>5.7.1</junit.version>017</properties>0187.6.1项目依赖包1.项目依赖包的信息管理056<version></version>057</dependency>058<dependency>059<groupId>com.google.code.gson</groupId>060<artifactId>gson</artifactId>061<version>2.8.5</version>062</dependency>063</dependencies>064065<build>066<plugins>067<plugin>068<groupId>org.apache.maven.plugins</groupId>069<artifactId>maven-war-plugin</artifactId>070<version>3.3.1</version>071</plugin>072</plugins>073</build>074</project>036<scope>test</scope>037</dependency>038<dependency>039<groupId>mysql</groupId>040<artifactId>mysql-connector-java</artifactId>041<version>8.0.28</version>042</dependency>043<dependency>044<groupId>com.fasterxml.jackson.core</groupId>045<artifactId>jackson-databind</artifactId>046<version>2.13.5</version>047</dependency>048<dependency>049<groupId>javax.servlet</groupId>050<artifactId>jstl</artifactId>051<version>1.2</version>052</dependency>053<dependency>054<groupId>com.mchange</groupId>055<artifactId>c3p0</artifactId>7.6.1项目依赖包1.项目依赖包的信息管理要点说明:第1行声明了文件的类型(xml)与字符编码(utf-8);第2-4行对项目命名空间、架构实例、架构信息进行了定义(此部分无需用户干预,直接引用即可),第5行为项目模型版本。第7-11行对项目公司名、项目标识、版本、名称及打包后的生成类型进行了定义。第13-17行定义了三个项目成员变量及对应的值。第19-63行对项目依赖包进行了定义。第20-25行定义了Servlet的组织名、id、版本,作用范围(provided表示必须随项目一起发布,test表仅用于测试)。第26-37行是测试依赖包的信息;第38-42行是mysql数据库的驱动信息;第43-47行用于处理josn数据转换,第48-52行用于提供对jsp页面中的taglib支持,第53-57行的c3p0则为项目提供数据连接池支持。第58-62行用于json数据解析。第65-73行定义了项目创建时所需的插件。7.6.1项目依赖包2.更新项目信息参考图7-17,在maven中更新项目依赖信息。图7-15项目结构图7-18更新maven项目后的依赖包更新后的结果如图7-18所示。7.6.2创建数据连接公用类为方便实现数据库连接,这里创建一个dbutils/DbUtils.java类,负责提供数据连接。其代码如下。019static{020try{021Class.forName(DRIVER);022connection=DriverManager.getConnection(URL,USER,PASSWORD);023}catch(ClassNotFoundException|SQLExceptione){024e.printStackTrace();025}026}027028publicstaticConnectiongetConnection(){029returnconnection;030}031032publicstaticvoidcloseConnection(){033if(connection!=null){034try{035connection.close();036}catch(SQLExceptione){037e.printStackTrace();038}039}040}041001packagecom.example.sims.dbutils;002003importjava.beans.PropertyVetoException;004importjava.sql.Connection;005importjava.sql.DriverManager;006importjava.sql.SQLException;007importcom.mchange.v2.c3p0.ComboPooledDataSource;008009importjavax.sql.DataSource;010011publicclassDbUtils{012privatestaticfinalStringDRIVER="com.mysql.cj.jdbc.Driver";013privatestaticfinalStringURL="jdbc:mysql://localhost:3306/sims?autoReconnect=true";014privatestaticfinalStringUSER="root";015privatestaticfinalStringPASSWORD="root";016017privatestaticConnectionconnection=null;0187.6.2创建数据连接公用类要点说明:第12-15行分别定义的连接数据库的关键信息:数据库驱动程序、目标数据库地址、连接名称与密码。第17-30行实现的是获取一个连接对象。第21行是注册驱动,第22行则由驱动管理程序创建连接对象。第32-40行是一个简单的关闭连接的方法。第42-62行实现的是一个数据访问池对象的获取,返回的是一个数据源对象。042privatestaticDataSourcedataSource;043044static{045ComboPooledDataSourcecpds=newComboPooledDataSource();046try{047cpds.setDriverClass(DRIVER);048}catch(PropertyVetoExceptione){049e.printStackTrace();050}051cpds.setJdbcUrl(URL);052cpds.setUser(USER);053cpds.setPassword(PASSWORD);054cpds.setInitialPoolSize(5);055cpds.setMinPoolSize(5);056cpds.setMaxPoolSize(20);057dataSource=cpds;058}059060publicstaticDataSourcegetDataSource(){061returndataSource;062}063}7.6.3数据实体的创建结合数据表的结构以及后端设计需求,分别在entity包下创建Role.java、User.java等实体类。下面是Role.java中的主要内容。其它实体类及具体内容请参看项目源码001packagecom.example.sims.entity;002003publicclassRole{004privateintroleId;005privateStringroleName;006privateStringroleDescription;007008//GettersandSetters032}简要说明:结合数据表结构重点写出第4-7行,其它部分可由集成环境自动生成(getter|setter)。7.6.4数据访问层dao的设计这是数据库学习与应用的重点部分,若干与数据库的相关操作均在进行处理。本项目中以Roles表的操作为例进行代码编写,其它数据表的操作代码与此类似。在dao包下创建RoleDao.java类。这里只涉及到单表操作,代码相对简单。主要代码如下。029try(PreparedStatementstmt=connection.prepareStatement(sql)){030stmt.setInt(1,roleId);031stmt.executeUpdate();032}033}034035//更新角色036publicvoidupdateRole(Rolerole)throwsSQLException{037Stringsql="UPDATErolesSETroleName=?,roleDescription=?WHEREroleId=?";038try(PreparedStatementstmt=connection.prepareStatement(sql)){039stmt.setString(1,role.getRoleName());040stmt.setString(2,role.getRoleDescription());041stmt.setInt(3,role.getRoleId());042stmt.executeUpdate();043}044}045013publicclassRoleDao{014finalConnectionconnection=DbUtils.getConnection();015016//创建角色017publicvoidinsertRole(Rolerole)throwsSQLException{018Stringsql="INSERTINTOroles(roleName,roleDescription)VALUES(?,?)";019try(PreparedStatementstmt=connection.prepareStatement(sql)){020stmt.setString(1,role.getRoleName());021stmt.setString(2,role.getRoleDescription());022stmt.executeUpdate();023}024}025026//删除角色027publicvoiddeleteRole(introleId)throwsSQLException{028Stringsql="DELETEFROMrolesWHEREroleId=?";7.6.4数据访问层dao的设计067//获取所有角色数据068publicList<Role>selectAllRoles()throwsSQLException{069List<Role>roles=newArrayList<>();070Stringsql="SELECT*FROMroles";071try(PreparedStatementstatement=connection.prepareStatement(sql);072ResultSetresultSet=statement.executeQuery()){073while(resultSet.next()){074Rolerole=newRole();075role.setRoleId(resultSet.getInt("roleId"));076role.setRoleName(resultSet.getString("roleName"));077role.setRoleDescription(resultSet.getString("roleDescription"));078roles.add(role);079}080}081returnroles;082}083}046//根据id获取角色数据047publicRoleselectRoleById(introleId)throwsException{048Stringsql="SELECT*FROMrolesWHEREroleId=?";049PreparedStatementps=connection.prepareStatement(sql);050ps.setInt(1,roleId);051ResultSetrs=ps.executeQuery();052053if(rs.next()){054Rolerole=newRole();055role.setRoleId(rs.getInt("roleId"));056role.setRoleName(rs.getString("roleName"));057role.setRoleDescription(rs.getString("roleDescription"));058returnrole;059}060061rs.close();062ps.close();063connection.close();064returnnull;065}0667.6.4数据访问层dao的设计前期学习的数据表操作主要体现在代码中的第18行(insert)、第28行(delete)、第37行(update)、第48行(select)、第70行(select)。为避免注入攻击等数据安全问题,这里采用了连接对象中的预处理语句方法(prepareStatement)来实现参数的传递与处理,另一方面,这里也使用了预处理语句对象的executeUpdate方法来实现增、删、改的操作;在需要返回数据行(select查询)时,则调用executeQuery方法来实现。要点说明7.6.5服务层service的设计这一部分主要解决对dao层各种业务的调用与处理。作为演示,这里在service包下创建了RoleService.java类来进行说明。020publicvoidupdateRole(Rolerole)throwsSQLException{021roleDao.updateRole(role);022}023024publicRoleselectRoleById(introleId)throwsException{025returnroleDao.selectRoleById(roleId);026}027028publicList<Role>selectAllRoles()throwsSQLException{029returnroleDao.selectAllRoles();030}031}009publicclassRoleService{010privateRoleDaoroleDao=newRoleDao();011012publicvoidinsertRole(Rolerole)throwsSQLException{013roleDao.insertRole(role);014}015016publicvoiddeleteRole(introleId)throwsSQLException{017roleDao.deleteRole(roleId);018}019要点说明:代码中的第10行创建了dao层的RoleDao实例,从而可以调用其中的方法对Roles表进行数据操作。7.6.6控制层controller的设计这一层是前端与后端连接的主要部分。前端发来的各种请求,在这一层收到后,会根据具体任务去调用service中的相关服务,然后将结果返回到前端页面。这里需要强调的是,在进行同步开发时,项目开发说明中需要对相关接口进行约定。如数据传送的名称、格式等。本项目均采用json格式来进行处理,相关依赖包已在创建时项目时已导入。下面先实现一个登录功能。控制层controller的设计7.6.6控制层controller的设计1.LoginController.java这一部分主要处理前端(login.html)传递过来的登录信息,在处理完成后将结果返回给调用页面。在controller包中创建LoginController.java类,主要内容如下。036redirectUrl="admin/admin_home.html";037break;038case"manager":039redirectUrl="admin/userManagement.html";040break;041case"teacher":042redirectUrl="teacher/teacher_home.html";043break;044case"student":045redirectUrl="student/student_home.html";046break;047}048049Map<String,Object>result=newHashMap<>();050result.put("success",true);051result.put("redirectUrl",redirectUrl);052result.put("username",user.getUserName());053response.setContentType("application/json");054response.getWriter().write(newGson().toJson(result));019@WebServlet("/login")020publicclassLoginControllerextendsHttpServlet{021privateUserServiceuserService=newUserService();022privateRoleServiceroleService=newRoleService();023024protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{025026Stringusername=request.getParameter("username");027Stringpassword=request.getParameter("password");028029try{030Useruser=userService.selectUserByNameAndPassword(username,password);031if(user!=null){032Rolerole=roleService.selectRoleById(user.getRoleId());033StringredirectUrl="";034switch(role.getRoleName()){035case"admin":7.6.6控制层controller的设计1.LoginController.java要点说明:第19行定义了前端登录时提交数据的地址,第20-21行创建了调用服务层中用户操作和角色操作的两个对象。第30行是根据前端提交回来的用户名与密码在库中进行查询,当匹配到用户数据行时,则根据用户角色设置不同的目标页面(第34-47行),然后向前端页面传递登录成功的有关信息(第49-52行),格式为json(第53-54行)。若无登录信息,则返回登录失败信息(第55-61行)。第62-68行是向前端传输登录失败的错误消息。055}else{056Map<String,Object>result=newHashMap<>();057result.put("success",false);058result.put("message","用户名或密码错误");059response.setContentType("application/json");060response.getWriter().write(newGson().toJson(result));061}062}catch(Exceptione){063e.printStackTrace();064response.setContentType("application/json");065PrintWriterout=response.getWriter();066out.print("{\"success\":false}");067out.flush();068}069}070}7.6.6控制层controller的设计2.RoleController.java这一部分主要处理前端以管理员身份登录以后,可以进行角色管理的各种操作。具体由RoleController.java实现,前端部分由roleManagement.html提供操作界面。在controller包中创建RoleController.java类,主要内容如下。040try{041Rolerole=roleService.selectRoleById(roleId);042if(role!=null){043result.clear();044result.put("role",role);045response.setContentType("application/json");046PrintWriterout=response.getWriter();047out.print(newGson().toJson(result));048}else{049response.sendError(HttpServletResponse.SC_NOT_FOUND);050}051}catch(Exceptione){052e.printStackTrace();053}054}055}056020@WebServlet("/roles/*")021publicclassRoleControllerextendsHttpServlet{022privateRoleServiceroleService=newRoleService();023Map<String,Object>result=newHashMap<>();024025protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{026if(request.getPathInfo()==null){027try{028List<Role>roles=roleService.selectAllRoles();029Map<String,Object>result=newHashMap<>();030result.put("roles",roles);031response.setContentType("application/json");032response.getWriter().write(newGson().toJson(result));033}catch(Exceptione){034e.printStackTrace();035}036}else{037StringpathInfo=request.getPathInfo();038introleId=Integer.parseInt(pathInfo.substring(1));0397.6.6控制层controller的设计2.RoleController.java057protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{058ObjectMapperobjectMapper=newObjectMapper();059Rolerole=objectMapper.readValue(request.getInputStream(),Role.class);060try{061roleService.insertRole(role);062response.setStatus(HttpServletResponse.SC_CREATED);063doGet(request,response);064}catch(SQLException|ServletExceptione){065e.printStackTrace();066response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"DatabaseError");067}068}069070protectedvoiddoPut(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{071ObjectMapperobjectMapper=newObjectMapper();072Rolerole=objectMapper.readValue(request.getInputStream(),Role.class);073try{074roleService.updateRole(role);075response.setStatus(HttpServletResponse.SC_OK);076}catch(SQLExceptione){077e.printStackTrace();078response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"DatabaseError");079}080}0817.6.6控制层controller的设计2.RoleController.java要点说明:第20行定义了前端访问角色管理功能的地址;第25-55行返回所有角色信息;第57-68行实现角色的插入操作;第70-80行实现角色的更新操作;第82-92行实现角色的删除操作。082protectedvoiddoDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{083StringpathInfo=request.getPathInfo();084introleId=Integer.parseInt(pathInfo.substring(1));085086try{087roleService.deleteRole(roleId);088response.setStatus(HttpServletResponse.SC_OK);089}catch(SQLExceptione){090e.printStackTrace();091}092}093}7.6.6控制层controller的设计3.UserController.java这一部分主要处理前端以管理员身份登录以后,可以进行用户管理的各种操作。具体由UserController.java实现,前端部分由userManagement.html提供操作界面。在controller包中创建UserController.java类,主要内容如下。037result.clear();038result.put("users",users);039result.put("roles",roles);040PrintWriterout=response.getWriter();041out.write(newGson().toJson(result));042out.flush();043044}catch(Exceptione){045e.printStackTrace();046response.setContentType("application/json");047PrintWriterout=response.getWriter();048out.print("{\"success\":false}");049}050}else{051intuserId=Integer.parseInt(request.getPathInfo().substring(1));052try{053Useruser=userService.selectUserById(userId);054List<Role>roles=roleService.selectAllRoles();055022@WebServlet("/users/*")023publicclassUserControllerextendsHttpServlet{024privatestaticfinallongserialVersionUID=1L;025privatefinalUserServiceuserService=newUserService();026privatefinalRoleServiceroleService=newRoleService();027Map<String,Object>result=newHashMap<>();028029@Override030protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{031if(request.getPathInfo()==null){032try{033List<User>users=userService.selectAllUsers();034List<Role>roles=roleService.selectAllRoles();035response.setContentType("application/json");0367.6.6控制层controller的设计3.UserController.java075}catch(SQLException|ServletExceptione){076e.printStackTrace();077response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"DatabaseError");078}079}080081@Override082protectedvoiddoPut(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{083ObjectMapperobjectMapper=newObjectMapper();084Useruser=objectMapper.readValue(request.getInputStream(),User.class);085try{086userService.updateUser(user);087response.setStatus(HttpServletResponse.SC_OK);088}catch(SQLExceptione){089e.printStackTrace();090response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,"DatabaseError");091}092}093056result.clear();057result.put("user",user);058result.put("roles",roles);059PrintWriterout=response.getWriter();060out.write(newGson().toJson(result));061}catch(Exceptione){062e.printStackTrace();063}064}065}066067@Override068protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{069ObjectMapperobjectMapper=newObjectMapper();070Useruser=objectMapper.readValue(request.getInputStream(),User.class);071try{072userService.insertUser(user);073response.setStatus(HttpServletResponse.SC_CREATED);074doGet(request,response);7.6.6控制层controller的设计3.UserController.java要点说明:第22行定义了前端访问用户管理功能的地址;第30-65行返回用户信息,这里需要注意的是,如果有没有传入用户id,则返回所有用户信息,否则返回指定id的用户信息(第50-64行);第68-79行实现用户的插入操作;第82-92行实现用户的更新操作;第95-105行实现用户的删除操作。094@Override095protectedvoiddoDelete(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{096//intuserId=Integer.parseInt(request.getPara

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论