Spring+SpringMVC+JdbcTemplate+jsp实现简单的用户CRUD
1.创建数据库表
2.创建maven工程
- 修改pom.xml添加依赖和tomcat、jetty插件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.ym</groupId> 8 <artifactId>UserCRUDspring+springmvc+jdbctemplate</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 <packaging>war</packaging> 11 12 <name>UserCRUDspring+springmvc+jdbctemplate Maven Webapp</name> 13 <!-- FIXME change it to the project's website --> 14 <url>http://www.example.com</url> 15 16 <properties> 17 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 18 <maven.compiler.source>1.7</maven.compiler.source> 19 <maven.compiler.target>1.7</maven.compiler.target> 20 </properties> 21 22 <dependencies> 23 <dependency> 24 <groupId>junit</groupId> 25 <artifactId>junit</artifactId> 26 <version>4.11</version> 27 <scope>test</scope> 28 </dependency> 29 <!-- spring依赖 --> 30 <dependency> 31 <groupId>org.springframework</groupId> 32 <artifactId>spring-context</artifactId> 33 <version>4.3.14.RELEASE</version> 34 </dependency> 35 <!-- springMVC依赖 --> 36 <dependency> 37 <groupId>org.springframework</groupId> 38 <artifactId>spring-web</artifactId> 39 <version>4.3.14.RELEASE</version> 40 </dependency> 41 <dependency> 42 <groupId>org.springframework</groupId> 43 <artifactId>spring-webmvc</artifactId> 44 <version>4.3.14.RELEASE</version> 45 </dependency> 46 <!-- springaop依赖 --> 47 <dependency> 48 <groupId>org.springframework</groupId> 49 <artifactId>spring-aop</artifactId> 50 <version>4.3.14.RELEASE</version> 51 </dependency> 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-tx</artifactId> 55 <version>4.3.14.RELEASE</version> 56 </dependency> 57 <dependency> 58 <groupId>org.springframework</groupId> 59 <artifactId>spring-context-support</artifactId> 60 <version>4.3.14.RELEASE</version> 61 </dependency> 62 <!-- springJdbcTemplate依赖 --> 63 <dependency> 64 <groupId>org.springframework</groupId> 65 <artifactId>spring-jdbc</artifactId> 66 <version>4.3.14.RELEASE</version> 67 </dependency> 68 <!-- 配置事务aspecj --> 69 <dependency> 70 <groupId>org.aspectj</groupId> 71 <artifactId>aspectjrt</artifactId> 72 <version>1.9.2</version> 73 </dependency> 74 <dependency> 75 <groupId>org.aspectj</groupId> 76 <artifactId>aspectjweaver</artifactId> 77 <version>1.9.2</version> 78 </dependency> 79 <!-- 德鲁伊连接池 --> 80 <dependency> 81 <groupId>com.alibaba</groupId> 82 <artifactId>druid</artifactId> 83 <version>1.0.26</version> 84 </dependency> 85 <!-- lombok --> 86 <dependency> 87 <groupId>org.projectlombok</groupId> 88 <artifactId>lombok</artifactId> 89 <version>1.16.2</version> 90 </dependency> 91 <!-- servlet-api --> 92 <dependency> 93 <groupId>javax.servlet</groupId> 94 <artifactId>javax.servlet-api</artifactId> 95 <version>3.1.0</version> 96 <scope>provided</scope> 97 </dependency> 98 <!-- jsp-api依赖 --> 99 <dependency> 100 <groupId>javax.servlet.jsp</groupId> 101 <artifactId>jsp-api</artifactId> 102 <version>2.1</version> 103 <scope>provided</scope> 104 </dependency> 105 <!-- jstl依赖 --> 106 <dependency> 107 <groupId>javax.servlet</groupId> 108 <artifactId>jstl</artifactId> 109 <version>1.2</version> 110 </dependency> 111 <!-- mysql依赖 --> 112 <dependency> 113 <groupId>mysql</groupId> 114 <artifactId>mysql-connector-java</artifactId> 115 <version>5.1.38</version> 116 </dependency> 117 </dependencies> 118 119 <build> 120 <finalName>UserCRUDspring+springmvc+jdbctemplate</finalName> 121 <plugins> 122 <plugin> 123 <groupId>org.apache.maven.plugins</groupId> 124 <artifactId>maven-compiler-plugin</artifactId> 125 <version>3.1</version> 126 <configuration> 127 <source>1.7</source> 128 <target>1.7</target> 129 <encoding>UTF-8</encoding> 130 </configuration> 131 </plugin> 132 <plugin> 133 <groupId>org.eclipse.jetty</groupId> 134 <artifactId>jetty-maven-plugin</artifactId> 135 <version>9.4.7.v20170914</version> 136 137 <configuration> 138 <webAppConfig> 139 <contextPath>/</contextPath> 140 <webInfIncludeJarPattern>.*/foo-[^/]*\.jar$|.*/classes/.*</webInfIncludeJarPattern> 141 </webAppConfig> 142 </configuration> 143 </plugin> 144 <plugin> 145 <groupId>org.apache.tomcat.maven</groupId> 146 <artifactId>tomcat7-maven-plugin</artifactId> 147 <version>2.1</version> 148 <configuration> 149 <port>8080</port> 150 <path>/</path> 151 <uriEncoding>UTF-8</uriEncoding> 152 <server>tomcat7</server> 153 </configuration> 154 </plugin> 155 </plugins> 156 </build> 157 </project>
完善项目结构
3.实体类 pojo.User
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.yunhe.pojo; 2 3 import lombok.*; 4 5 import java.io.Serializable; 6 7 /** 8 * @Author 9 * @CreateTime 2020/8/18-15:38 10 * @Description 用户信息实体类 11 */ 12 @Setter 13 @Getter 14 @AllArgsConstructor 15 @NoArgsConstructor 16 @ToString 17 public class User implements Serializable { 18 private Integer userId; 19 private String userName; 20 private String userPwd; 21 private Integer userAge; 22 23 public User(String userName, String userPwd, Integer userAge) { 24 this.userName = userName; 25 this.userPwd = userPwd; 26 this.userAge = userAge; 27 } 28 }
4.dao层接口及其实现类 UserDao UserDaoImpl
简单的增删改查四个方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface UserDao { /** * 增加用户 * * @param user 用户信息 * @return 结果 */ public int addUser(User user); /** * 删除用户 * * @param userId 用删除用户的id * @return 结果 */ public int delUser(int userId); /** * 修改用户 * * @param user 修改用户信息 * @return 结果 */ public int changeUser(User user); /** * 查询所有学生 * * @return 结果集 */ public List<User> getAllUser(); }
dao实现类使用JdbcTemplate技术
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.yunhe.dao.impl; 2 3 import com.yunhe.dao.UserDao; 4 import com.yunhe.pojo.User; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.jdbc.core.JdbcTemplate; 7 import org.springframework.jdbc.core.RowMapper; 8 import org.springframework.stereotype.Repository; 9 10 import java.sql.ResultSet; 11 import java.sql.SQLException; 12 import java.util.List; 13 14 /** 15 * @Author 书洋 16 * @CreateTime 2020/8/18-15:59 17 * @Description 18 */ 19 @Repository 20 public class UserDaoImpl implements UserDao { 21 //自动注入jdbcTemplate 22 @Autowired 23 private JdbcTemplate jdbcTemplate; 24 25 /** 26 * 增加 27 * @param user 用户信息 28 * @return 29 */ 30 @Override 31 public int addUser(User user) { 32 String sql = "INSERT INTO t_user (u_name,u_password,u_age) VALUES (?,?,?)"; 33 return jdbcTemplate.update(sql, user.getUserName(), user.getUserPwd(), user.getUserAge()); 34 } 35 36 /** 37 * 根据id删除用户 38 * @param userId 用删除用户的id 39 * @return 40 */ 41 @Override 42 public int delUser(int userId) { 43 String sql = "DELETE FROM t_user WHERE u_id = ?"; 44 return jdbcTemplate.update(sql, userId); 45 } 46 47 /** 48 * 修改用户信息 49 * @param user 修改用户信息 50 * @return 51 */ 52 @Override 53 public int changeUser(User user) { 54 String sql = "UPDATE t_user SET u_name = ?,u_password = ?,u_age = ? WHERE u_id = ?"; 55 return jdbcTemplate.update(sql, user.getUserName(), user.getUserPwd(), user.getUserAge(), user.getUserId()); 56 } 57 58 /** 59 * 查询所有用户信息 60 * @return user集合 61 */ 62 @Override 63 public List<User> getAllUser() { 64 String sql = "SELECT * FROM t_user"; 65 return jdbcTemplate.query(sql, new UserRowMapper()); 66 } 67 68 //内部类 用来将查询的结果映射成User对象 69 class UserRowMapper implements RowMapper<User>{ 70 71 @Override 72 public User mapRow(ResultSet resultSet, int i) throws SQLException { 73 User user = new User(resultSet.getInt("u_id"), 74 resultSet.getString("u_name"), 75 resultSet.getString("u_password"), 76 resultSet.getInt("u_age")); 77 return user; 78 } 79 } 80 }
5.service层接口及其实现类 UserService UserserviceImpl
服务类接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface UserService { /** * 增加用户 * * @param user 用户信息 * @return 结果 */ public Boolean addUser(User user); /** * 删除用户 * * @param userId 用删除用户的id * @return 结果 */ public Boolean delUser(int userId); /** * 修改用户 * * @param user 修改用户信息 * @return 结果 */ public Boolean changeUser(User user); /** * 查询所有学生 * * @return 结果集 */ public List<User> getAllUser(); }
接口实现类 简单的做一些逻辑处理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.yunhe.service.impl; 2 3 import com.yunhe.dao.UserDao; 4 import com.yunhe.pojo.User; 5 import com.yunhe.service.UserService; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.stereotype.Service; 8 9 import java.util.List; 10 11 /** 12 * @Author 书洋 13 * @CreateTime 2020/8/17-19:20 14 * @Description 服务类实现类 15 */ 16 @Service 17 public class UserServiceImpl implements UserService { 18 //自动注入UserDao 19 @Autowired 20 private UserDao userDao; 21 22 @Override 23 public Boolean addUser(User user) { 24 int result = userDao.addUser(user); 25 if (1 == result) { 26 return true; 27 } 28 return false; 29 } 30 31 @Override 32 public Boolean delUser(int userId) { 33 int result = userDao.delUser(userId); 34 if (1 == result) { 35 return true; 36 } 37 return false; 38 } 39 40 @Override 41 public Boolean changeUser(User user) { 42 int result = userDao.changeUser(user); 43 if (1 == result) { 44 return true; 45 } 46 return false; 47 } 48 49 @Override 50 public List<User> getAllUser() { 51 return userDao.getAllUser(); 52 } 53 }
6.spring配置文件applicatonContext.xml
- 开启注解扫描
- 配置数据源 druid
- 配置JdbcTemplate,注入数据源
- 声明式事务
- 配置事务管理器
- aop配置 配置切入点、配置通知者。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/aop 9 http://www.springframework.org/schema/aop/spring-aop.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 12 <!-- 注解扫描 --> 13 <context:component-scan base-package="com.yunhe"/> 14 <!-- 配置数据源 --> 15 <bean id="dateSource" class="com.alibaba.druid.pool.DruidDataSource"> 16 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 17 <property name="url" value="jdbc:mysql://localhost:3306/study"/> 18 <property name="username" value="root"/> 19 <property name="password" value="root"/> 20 </bean> 21 <!-- 配置jdbcTemplate 注入数据源 --> 22 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 23 <property name="dataSource" ref="dateSource"/> 24 </bean> 25 <!-- 声明式事务 --> 26 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 27 <!-- 注入数据源 --> 28 <property name="dataSource" ref="dateSource"/> 29 </bean> 30 <!-- 配置事务通知 --> 31 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 32 <tx:attributes> 33 <tx:method name="add*" propagation="REQUIRED"/> 34 <tx:method name="change*" propagation="REQUIRED"/> 35 <tx:method name="del*" propagation="REQUIRED"/> 36 <tx:method name="*" propagation="SUPPORTS"/> 37 </tx:attributes> 38 </tx:advice> 39 <aop:config> 40 <!-- 配置切入点 --> 41 <aop:pointcut id="serviceMethod" expression="execution(* com.yunhe.service.*.*(..))"/> 42 <!-- 配置通知者 --> 43 <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/> 44 </aop:config> 45 </beans>
7.springMVC配置
- 配置web.xml 前端控制器、监听器(用于初始化springIOC容器)、过滤器(解决乱码问题)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 4 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 version="3.0"> 6 <!-- 配置监听器 用于读取spring配置文件 --> 7 <listener> 8 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 9 </listener> 10 <context-param> 11 <param-name>contextConfigLocation</param-name> 12 <param-value>classpath:applicationContext.xml</param-value> 13 </context-param> 14 <!-- 配置前端控制器 --> 15 <servlet> 16 <servlet-name>springMvc</servlet-name> 17 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 18 <init-param> 19 <param-name>contextConfigLocation</param-name> 20 <param-value>classpath:springmvc.xml</param-value> 21 </init-param> 22 </servlet> 23 <servlet-mapping> 24 <servlet-name>springMvc</servlet-name> 25 <url-pattern>/</url-pattern> 26 </servlet-mapping> 27 <!-- 设置字符编码 --> 28 <filter> 29 <filter-name>encode</filter-name> 30 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 31 <init-param> 32 <param-name>encoding</param-name> 33 <param-value>UTF-8</param-value> 34 </init-param> 35 </filter> 36 <filter-mapping> 37 <filter-name>encode</filter-name> 38 <url-pattern>/*</url-pattern> 39 </filter-mapping> 40 </web-app>
- 配置springmvc.xml 开启注解扫描 配置视图解析器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/mvc 9 http://www.springframework.org/schema/mvc/spring-mvc.xsd 10 http://www.springframework.org/schema/context 11 http://www.springframework.org/schema/context/spring-context.xsd"> 12 <!-- 注解扫描 --> 13 <context:component-scan base-package="com.yunhe.controller"/> 14 <mvc:annotation-driven/> 15 <!-- 视图解析器 --> 16 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 17 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 18 <property name="prefix" value="/WEB-INF/view/"/> 19 <property name="suffix" value=".jsp"/> 20 </bean> 21 </beans>
8.controller层 UserController
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.yunhe.controller; 2 3 import com.yunhe.pojo.User; 4 import com.yunhe.service.UserService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Controller; 7 import org.springframework.ui.Model; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.RequestMethod; 10 11 import java.util.List; 12 13 /** 14 * @Author 书洋 15 * @CreateTime 2020/8/18-18:36 16 * @Description 用户控制器 17 */ 18 @Controller 19 @RequestMapping("/user") 20 public class UserController { 21 //注入userService 22 @Autowired 23 private UserService userService; 24 25 /** 26 * 查看所有用户信息 27 * 28 * @param model model对象 29 * @return 地址 30 */ 31 @RequestMapping("/list") 32 public String getAllUser(Model model) { 33 List<User> userList = userService.getAllUser(); 34 if (null != userList) { 35 model.addAttribute("userList", userList); 36 return "showUser"; 37 } 38 return "error"; 39 } 40 41 /** 42 * 添加用户 43 * 44 * @param user 要添加用户的信息 45 * @return 跳转地址 46 */ 47 @RequestMapping(value = "/add") 48 public String addUser(User user) { 49 Boolean aBoolean = userService.addUser(user); 50 if (aBoolean) { 51 //添加成功则冲定向到用户展示页面 52 return "redirect:/user/list"; 53 } 54 return "error"; 55 } 56 57 /** 58 * 根据id删除用户 59 * 60 * @param userId 61 * @return 62 */ 63 @RequestMapping("/del") 64 public String delUser(int userId) { 65 Boolean aBoolean = userService.delUser(userId); 66 if (aBoolean) { 67 //添加成功则冲定向到用户展示页面 68 return "redirect:/user/list"; 69 } 70 return "error"; 71 } 72 73 /** 74 * 修改用户信息 75 * @param user 76 * @return 77 */ 78 @RequestMapping("/change") 79 public String changeUser(User user) { 80 Boolean aBoolean = userService.changeUser(user); 81 if (aBoolean) { 82 //添加成功则冲定向到用户展示页面 83 return "redirect:/user/list"; 84 } 85 return "error"; 86 } 87 88 /** 89 * 用于跳转到增加用户的jsp页面 90 * @return 地址 91 */ 92 @RequestMapping(value = "/addAction",method = RequestMethod.GET) 93 public String add() { 94 return "addUser"; 95 } 96 }
9.前端页面
-
首页
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>Title</title> 5 </head> 6 <body> 7 <a href="/user/list">查看所有用户</a> 8 </body> 9 </html>
- 用户展示页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 、 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4 <html> 5 <head> 6 <title>Title</title> 7 </head> 8 <body> 9 <table border="1px" cellspacing="0" cellpadding="0" align="center" width="500px"> 10 <thead> 11 <tr align="center"> 12 <th>编号</th> 13 <th>姓名</th> 14 <th>密码</th> 15 <th>年龄</th> 16 <th>操作</th> 17 </tr> 18 </thead> 19 <tbody> 20 <c:if test="${empty userList}"> 21 <tr align="center"> 22 <td colspan="5">暂无用户数据!</td> 23 </tr> 24 </c:if> 25 <c:if test="${not empty userList}"> 26 <c:forEach items="${userList}" var="user"> 27 <tr align="center"> 28 <td>${user.userId}</td> 29 <td>${user.userName}</td> 30 <td>${user.userPwd}</td> 31 <td>${user.userAge}</td> 32 <td> 33 <button><a href="/user/del?userId=${user.userId}">删除</a></button> 34 <button><a href="/change.jsp?userId=${user.userId}">修改</a></button> 35 </td> 36 </tr> 37 </c:forEach> 38 </c:if> 39 </tbody> 40 <tfoot> 41 <tr align="center"> 42 <td colspan="5"> 43 <button><a href="/user/addAction">添加用户</a></button> 44 </td> 45 </tr> 46 </tfoot> 47 </table> 48 </body> 49 </html>
- 增加用户界面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>增加用户</title> </head> <body> <form action="/user/add"> <table align="center" width="300px"> <thead> <tr align="center"> <th colspan="2">添加用户</th> </tr> </thead> <tbody> <tr > <td align="right">用户名:</td> <td><input type="text" name="userName"/></td> </tr> <tr > <td align="right">密码:</td> <td><input type="text" name="userPwd"/></td> </tr> <tr > <td align="right">年龄:</td> <td><input type="text" name="userAge"/></td> </tr> </tbody> <tfoot> <tr align="center"> <td colspan="2"><input type="submit" value="提交"></td> </tr> </tfoot> </table> </form> </body> </html>
- 修改用户页面(未完善,后续会改动)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>修改用户信息</title> 5 </head> 6 <body> 7 <% 8 String userId = request.getParameter("userId"); 9 %> 10 <form action="/user/change" > 11 <table align="center" width="300px"> 12 <thead> 13 <tr align="center"> 14 <th colspan="2">修改用户信息</th> 15 </tr> 16 </thead> 17 <tbody> 18 <tr> 19 <td align="right">用户编号:</td> 20 <td><input type="text" name="userId" value="<%=userId%>" readonly/></td> 21 </tr> 22 <tr> 23 <td align="right">用户名:</td> 24 <td><input type="text" name="userName"/></td> 25 </tr> 26 <tr> 27 <td align="right">密码:</td> 28 <td><input type="text" name="userPwd"/></td> 29 </tr> 30 <tr> 31 <td align="right">年龄:</td> 32 <td><input type="text" name="userAge"/></td> 33 </tr> 34 </tbody> 35 <tfoot> 36 <tr align="center"> 37 <td colspan="2"><input type="submit" value="确认修改"></td> 38 </tr> 39 </tfoot> 40 </table> 41 </form> 42 </body> 43 </html>
10.整个项目目录