赞
踩
目录
效果图:
在数据库创建一个名为BookStore的数据库,在BookStore数据库中添加一个BookInfo表用于存储图书信息表,再往表里面添加一些测试数据、前端页面以表格形式显示所有图书信息、并完成增加添加书籍、修改书籍、删除书籍的功能。
技术要求:
1.必须用JSP和SpringMVC
⒉数据库连接和请求必须要SpringJDBC
我的完整项目结构:
点击file,new一个module模板maven,联网加载好,在main文件夹中添加Java包,在Java包中添加一个package我这里叫com.c202001090145.oyh,继续在com.c202001090145.oyh中添加三个同级package,dao,service,controller,再加一个对象类包pojo,主要放置一些对象类。在resources中添加一个spring配置文件。在pop.xml中导入springMVC所需的坐标,因为我们是要开发一个web页面的需要用到servlet,所以先把我们需要的坐标导入。导入坐标后一层一层来,从dao层--->service---->controller.这就是mvc三层结构。
在resources中new一个XML Configuration File,选择里面的Spring Config类型。我给它取名叫做spring_servlet。
接下来直接把我的代码复制进去,我会讲每一个配置有什么用滴!
spring_servlet.xml代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
- <context:component-scan base-package="com.c202001090145.oyh"/>
- <!-- 用bean来创建一个类 视图解析器-->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!-- 为这个类注入两个属性,一个前缀值,一个后缀。以/WEB-INF/jsp/login.jsp为例-->
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
-
- <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/bookstore?characterEncoding=utf8&serverTimezone=UTC"/>
- <!-- 数据库用户名和密码-->
- <property name="username" value="root"/>
- <property name="password" value="1234"/>
- </bean>
- <bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate">
- <property name="dataSource" ref="dataSource"/>
- </bean>
-
-
- </beans>

第一个bean叫做视图解析器,用于简化Jsp请求路径,name=prefix是前缀的意思,就是你请求的路径前缀是什么,比如我的jsp文件在/WEB-INF/jsp/addbook.jsp,那么我们只需要写/WEB-INF/jsp/这个目录就行,后缀就是.jsp,那么你使用的时候就是直接给一个文件名就好了,后面具体应用会讲到。
第二个bean是与mysql数据库有关,你使用时只需要将3306端口号后面的bookstore改成你自己需要使用的数据库名字就好了
<property name="url" value="jdbc:mysql://localhost:3306/bookstore?characterEncoding=utf8&serverTimezone=UTC"/>
下面的两行就是你的数据库名和密码,改成你自己的就好了,其他的不用动
由于我们要使用mysql链接数据库,所以原来的2.几版本就太低了,我们需要换成4.+版本的 ,只需要复制就好了,其他不用动,这个文件会有完整代码的别急。就是告诉你给你看看~~
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app>因为我们是要进行网页请求的,所以我们必须先配好请求拦截器:不先配好的话,就会找不到路径。就像下面那个报错一样
遇到的第一个bug:
报这个错误是因为我的spring配置文件spring_servlet.xml还没有被加载,所以注解@RequestMapping("addbook")没有生效,自然就不会将addbook.jsp的内容映射到addbook的地址去,所以找不到,当然注解默认不生效,必须在spring容器配置文件中加上下面那段话才会生效。
<context:component-scan base-package="com.hnucm.springmvc"/>
所以我们为了让spring配置文件能够被加载,我们可以web.xml中进行请求的拦截,这里就相当于vue中的前置路由拦截器,拦截之后我们可以对其进行一些处理,拦截后我们将其交给servlet进行处理,它会生成一个实例化对象,实例化对象会加载它的参数,所以我们可以把spring容器的配置项地址作为参数进行加载。这样页面就可以被映射出来啦。
完整代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
- <!-- Tomcat启动时该文家会加载-->
-
- <servlet>
- <!-- 这个名字要和下面那个一致-->
- <servlet-name>springmvc</servlet-name>
- <!-- 这个类是springMVc框架提供的继承servlet的类-->
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <!-- 拦截之后,就会实例化一个对象,实例化时会加载它的它的参数,-->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <!-- 这个地址加载spring容器配置文件,又因为spring容器中开启了注解,所以注解也会生效 -->
- <param-value>classpath:spring_servlet.xml</param-value>
- </init-param>
- </servlet>
-
- <!-- 拦截下面的请求后交给上面的sevlet处理-->
- <servlet-mapping>
- <!-- 这里这个名字可以随便取-->
- <servlet-name>springmvc</servlet-name>
- <!-- 下面的/表示拦截所有的带/的请求-->
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- </web-app>

下面这句话真的超级重要:
mvc三层结构我们都是先从dao写起,之后在写service层,最后写controller层。但是代码执行时是先controller层转发请求调用service层,然后再service调用dao层。这个就是思路!!!!
我就带着写一个更新的例子哈,后面思路都是一样的,但是完整代码我会给出!!
先在dao层new一个接口类,名字叫做BookDao。在里面定义一个方法叫addBooks,他有两个参数,一个是price和name,注意这个是我在数据库中定义的字段名,我的数据库中还定义了一个id,它是主键并且我设置成了自增长我们不用管它。
继续在dao层中new一个接口实现类,就叫bookDaoImpl.在这个类里面继承BookDao这个接口,我们是在dao层中操作数据库的,所以需要使用spring封装好的一个类JdbcTemplate,他可以更加方便的我们操作数据库。
在这里需要注意的是因为我们操作数据库了,所以你们一定要将数据库改成你们自己的,并且这里你们也要将insert into bookinfo values......中的bookinfo改成你们自己数据库中的表名才可以。
写完dao层写service层,在service文件夹下new一个BookService接口类。在这个接口类中定义一个方法,调用该方法就可以调用dao层的数据库,所以这里建议这个方法名直接使用dao层接口中的方法名,我们一在service中调用这个方法就可以知道这方法将会调用dao接口中的哪个方法,所以我们直接将dao层中的BookDao接口类中的
public void addBooks(float price,String name);
直接复制到service层中的BookService接口类中去
我们可以上下对比两个类中的方法,一模一样吧
继续在service层中new一个接口实现类BookServiceImpl,在该类中继承BookService接口类,继承类自然也要继承类里面的方法,在这里定义一个BookDao 类,因为待会接口调用会用到,我们使用@Autowired实现自动注入对象,就不用new一个对象了,在这里面调用BookDao中的方法
写完service层就继续写controller层,在controller包中new一个bookInfoController类,在这个类中进行请求的转发和调用service 类。
定义一个BookService类,因为待会会调用该类里面的 方法,使用@Autowired实现自动注入,定义一个addbook方法实现地址的映射,可以将addbook.jsp页面的内容映射到带/addbook的地址中去。这个return“addbook”就是addbook.jsp。就是在这里使用了前面讲到的 ’第一个bean叫做视图解析器’ 因为这个页面的完整地址是webapp开始到addbook.jsp结束的文件地址,视图解析器就帮我们把前缀和后缀省略了。
addbook.jsp完整代码:
- <%--
- Created by IntelliJ IDEA.
- User: Admin
- Date: 2022/9/30
- Time: 23:38
- To change this template use File | Settings | File Templates.
- --%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- <h1>添加书籍数据</h1>
- <form action="http://localhost:8080/MyBookStore_war/addbookcommit" method="post">
- <div>书籍名字:<input name="name"></div>
- <div>书籍价格:<input name="price"></div>
- <input type="submit" value="提交">
- </form>
- </body>
- </html>

然后@RequestMapping的作用是;作用就是映射URL路径,将http的请求地址映射到控制器(controller)类的处理方法上。@RequestMapping("addbook")的作用就是将addbook的请求地址映射到addbook这个方法中的return到的文件地址去。
下面那个@RequestMapping("addbookcommit")中的addbookcommit是我们addbook.jsp页面中写了一个表单,这个表单提交的地址就是http://localhost:8080/MyBookStore_war/addbookcommit。因此可以将其进行拦截处理,然后在这个方法里面调用service层的方法。所以就行成了controller层->service层->dao层。又因为dao层操作数据库所以我们就操作了数据库。
dao层bookInfoController完整代码:
- package com.c202001090145.oyh.controller;
-
- import com.c202001090145.oyh.pojo.Book;
- import com.c202001090145.oyh.service.BookService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- @Controller
- public class bookInfoController {
- @Autowired
- BookService bookService;
-
- @RequestMapping("addbook")
- public String addbook(){
-
- return "addbook";
- }
-
- @RequestMapping("addbookcommit")
- public String addbookcommit(Model model, float price, String name){
- bookService.addBooks(price,name);
- return "forward:/booklist";
- }
- @RequestMapping("booklist")
- public String booklist(Model model){
- model.addAttribute("bookList",bookService.getAllBooks());
- return "booklist";
- }
- @RequestMapping("updatebook")
- public String updatebook(Model model,Book book){
- model.addAttribute(book);
- return "updatebook";
- }
- @RequestMapping("updatebookcommit")
- public String updatebookcommit(Model model,Book book){
- bookService.updatebook(book);
- return "forward:/booklist";
- }
- @RequestMapping("delete")
- public String delete(int id){
- bookService.delete(id);
- return "forward:/booklist";
- }
- }

成功后就将返回booklist.jsp页面。但是我们写到这里是还没有写booklist.jsp页面的,这个页面就是显示数据库所有的 书籍信息,我们没有写写个请求就会先报错,但是没关系,写到这里的我们的数据库添加已经完成了。你可以进入数据库进行查看。后面的查询,删除,更新也和这个差不多,都是一样的步骤,关键还是逻辑和思路。
也可以在我的csdn资源中下载
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。