目录
springMVC: Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。
一、实现浏览器展示hello world
1.1 添加pom依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ideamaven</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ssm</artifactId>
<packaging>war</packaging>
<name>ssm Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
<!--添加jar包依赖-->
<!--1.spring 5.0.2.RELEASE相关-->
<spring.version>5.0.2.RELEASE</spring.version>
<!--2.mybatis相关-->
<mybatis.version>3.4.5</mybatis.version>
<!--mysql-->
<mysql.version>5.1.44</mysql.version>
<!--pagehelper分页jar依赖-->
<pagehelper.version>5.1.2</pagehelper.version>
<!--mybatis与spring集成jar依赖-->
<mybatis.spring.version>1.3.1</mybatis.spring.version>
<!--3.dbcp2连接池相关 druid-->
<commons.dbcp2.version>2.1.1</commons.dbcp2.version>
<commons.pool2.version>2.4.3</commons.pool2.version>
<!--4.log日志相关-->
<log4j2.version>2.9.1</log4j2.version>
<!--5.其他-->
<!-- <junit.version>4.12</junit.version>-->
<servlet.version>4.0.0</servlet.version>
<lombok.version>1.18.2</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--1.spring相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--2.mybatis相关-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--pagehelper分页插件jar包依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!--mybatis与spring集成jar包依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!--3.dbcp2连接池相关-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${commons.dbcp2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons.pool2.version}</version>
</dependency>
<!--4.log日志相关依赖-->
<!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<finalName>ssm</finalName>
<resources>
<!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
<include>*.xml</include>
</includes>
</resource>
</resources>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
因为版本一样,所以之前的相同依赖不需要删除,若不同则要删除,否则会版本冲突
添加jstl依赖
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- 缺少这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
<!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包-->
1.2 添加springmvc-servlet.xml
1.扫描base-package
定义base-package
开启注释扫描
开启动态代理
2.配置视图解析器
本地资源视图解析器:InternalResourceViewResolver
多功能视图解析器
3.做静态资源映射
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 通过context:component-scan元素扫描指定包下的控制器-->
<!--1) 扫描com.cdl.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.cdl.ssm"/>
<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
<!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--3) ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4) 单独处理图片、样式、js等资源 -->
<!--<mvc:resources location="/css/" mapping="/css/**"/>-->
<!--<mvc:resources location="/images/" mapping="/images/**"/>-->
<!--<mvc:resources location="/js/" mapping="/js/**"/>-->
</beans>
1.3 web.xml
spring与web容器的集成:监听器
springMVC和web容器的集成:servlet (DispatcherServlet)
<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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 读取Spring上下文的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--web.xml 3.0的新特性,是否支持异步-->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--随着后续:框架越来越多 不能将所有的框架配置放到同一个配置文件 否则不便于管理-->
<!--注入其他配置文件-->
<import resource="applicationContext-mybatis.xml"></import>
</beans>
1.4 配置Tomcat
1.5 代码 HelloController
package com.cdl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author cdl
* @site www.cdl.com
* @create 2022-08-16 22:33
*
* @Controller 被其标记的类 会交给 spring进行管理
*/
@Controller
public class HelloController {
//自定义mvc:浏览器发送请求 http://localhost:8080/hello.ation?mthodName=hello
//springmvc:浏览器发送请求 http://localhost:8080/helloReq
@RequestMapping("/helloReq")
public String hello(){
System.out.println("hello springmvc...");
return "hello";
}
}
报错:
翻译得:
解决:扫描有问题
springmvc-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"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 通过context:component-scan元素扫描指定包下的控制器-->
<!--1) 扫描com.cdl.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.cdl"/>
<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
<!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--3) ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4) 单独处理图片、样式、js等资源 -->
<!--<mvc:resources location="/css/" mapping="/css/**"/>-->
<!--<mvc:resources location="/images/" mapping="/images/**"/>-->
<!--<mvc:resources location="/js/" mapping="/js/**"/>-->
</beans>
结果:
二、springMVC的工作原理
1.浏览器发送请求到中央控制器(DispatcherServlet)
2.中央控制器通过处理器映射器(HandlerMapping)找到处理适配器(HandlerAdapter)
3.执行HandlerAdapter,返回值ModelAndView回传给中央控制器
4.视图解析器(ViewResolve)会对返回值ModelAndView进行渲染,得到view视图对象
5.最后中央控制器会将view视图对象返回给用户
HelloController
package com.cdl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @author cdl
* @site www.cdl.com
* @create 2022-08-16 22:33
*
* @Controller 被其标记的类 会交给 spring进行管理
*/
@Controller
public class HelloController {
//自定义mvc:浏览器发送请求 http://localhost:8080/hello.ation?mthodName=hello
//springmvc:浏览器发送请求 http://localhost:8080/helloReq
//此处是hello2的间写版本
@RequestMapping("/helloReq")
public String hello(){
System.out.println("hello springmvc...");
return "hello";
}
@RequestMapping("/hello2")
public ModelAndView hello2(HttpServletRequest req){
ModelAndView mv = new ModelAndView();
mv.setViewName("hello");
mv.addObject("msg","success...");
return mv;
}
}
hello.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2022/8/16
Time: 22:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
spring mvc 你好
${msg}
</body>
</html>
结果:
三、crud之常用注释以及返回值
BookMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.cdl.ssm.mapper.BookMapper" >
<resultMap id="BaseResultMap" type="com.cdl.ssm.model.Book" >
<constructor >
<idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
</constructor>
</resultMap>
<sql id="Base_Column_List" >
bid, bname, price
</sql>
<select id="selectByPrimaryKey" resultType="com.cdl.ssm.model.Book" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid = #{bid,jdbcType=INTEGER}
</select>
<!--bookIds:1,2,3,4,5,6-->
<select id="selectByIn" resultType="com.cdl.ssm.model.Book" parameterType="java.util.List" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from t_mvc_book
where bid = #{bid,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.cdl.ssm.model.Book" >
insert into t_mvc_book (bid, bname, price
)
values (#{bid,jdbcType=INTEGER}, #{bname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
)
</insert>
<insert id="insertSelective" parameterType="com.cdl.ssm.model.Book" >
insert into t_mvc_book
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="bid != null" >
bid,
</if>
<if test="bname != null" >
bname,
</if>
<if test="price != null" >
price,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="bid != null" >
#{bid,jdbcType=INTEGER},
</if>
<if test="bname != null" >
#{bname,jdbcType=VARCHAR},
</if>
<if test="price != null" >
#{price,jdbcType=REAL},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.cdl.ssm.model.Book" >
update t_mvc_book
<set >
<if test="bname != null" >
bname = #{bname,jdbcType=VARCHAR},
</if>
<if test="price != null" >
price = #{price,jdbcType=REAL},
</if>
</set>
where bid = #{bid,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.cdl.ssm.model.Book" >
update t_mvc_book
set bname = #{bname,jdbcType=VARCHAR},
price = #{price,jdbcType=REAL}
where bid = #{bid,jdbcType=INTEGER}
</update>
<select id="selectBooksLike1" resultType="com.cdl.ssm.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like #{bname}
</select>
<select id="selectBooksLike2" resultType="com.cdl.ssm.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like '${bname}'
</select>
<select id="selectBooksLike3" resultType="com.cdl.ssm.model.Book" parameterType="java.lang.String">
select * from t_mvc_book where bname like concat('%',#{bname},'%')
</select>
<select id="list1" resultMap="BaseResultMap">
select * from t_mvc_book
</select>
<select id="list2" resultType="com.cdl.ssm.model.Book">
select * from t_mvc_book
</select>
<select id="list3" resultType="com.cdl.ssm.model.Book" parameterType="com.cdl.ssm.model.vo.BookVo">
select * from t_mvc_book where bid in
<foreach collection="bookIds" open="(" close=")" separator="," item="bid">
#{bid}
</foreach>
</select>
<select id="list4" resultType="java.util.Map">
select * from t_mvc_book
</select>
<select id="list5" resultType="java.util.Map" parameterType="java.util.Map">
select * from t_mvc_book where bid = #{bid}
</select>
<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>
<select id="list6" resultType="com.cdl.ssm.model.Book" parameterType="com.cdl.ssm.model.vo.BookVo">
select * from t_mvc_book
<where>
<if test="null != min and min != ''">
<![CDATA[ and #{min} < price ]]>
</if>
<if test="null != max and max != ''">
<![CDATA[ and #{max} > price ]]>
</if>
</where>
</select>
<select id="list7" resultType="com.cdl.ssm.model.Book" parameterType="com.cdl.ssm.model.vo.BookVo">
select * from t_mvc_book
<where>
<if test="null != min and min != ''">
and #{min} < price
</if>
<if test="null != max and max != ''">
and #{max} > price
</if>
</where>
</select>
</mapper>
BookMapper
package com.cdl.ssm.mapper;
import com.cdl.ssm.model.Book;
import com.cdl.ssm.model.vo.BookVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface BookMapper {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
// 通过in关键字进行查询,讲解foreach标签的使用
// 如果说参数是非实体类(book,Order,....),那么记得加上注解 @param,bookIds是对应collection属性的
List<Book> selectByIn(@Param("bookIds") List bookIds);
List<Book> selectBooksLike1(@Param("bname") String bname);
List<Book> selectBooksLike2(@Param("bname") String bname);
List<Book> selectBooksLike3(@Param("bname") String bname);
// list1 list2的结论是对于单表查询而言,可以用它resultType/resultMap接收,但是多表必须用resultMap接收
List<Book> list1();
List<Book> list2();
// 如果要传入多个查询参数,必须以对象的方式进行传递
List<Book> list3(BookVo vo);
// 如果是返回一条数据,那么返回值Map
// 如果是多条数据,那么返回值List<Map>
List<Map> list4();
Map list5(Map map);
// 利用第三方插件进行分页
List<Map> listPager(Map map);
List<Book> list6(BookVo bookVo);
List<Book> list7(BookVo bookVo);
}
BookBiz
package com.cdl.biz;
import com.cdl.ssm.model.Book;
import com.cdl.ssm.model.vo.BookVo;
import com.cdl.util.PageBean;
import java.util.List;
import java.util.Map;
/**
* @author cdl
* @site www.cdl.com
* @create 2022-08-10 22:00
* ctrl + t 跳到接口的实现类
*/
public interface BookBiz {
int deleteByPrimaryKey(Integer bid);
int insert(Book record);
int insertSelective(Book record);
Book selectByPrimaryKey(Integer bid);
int updateByPrimaryKeySelective(Book record);
int updateByPrimaryKey(Book record);
List<Book> selectByIn(List bookIds);
public List<Book> selectBooksLike1(String bname);
public List<Book> selectBooksLike2(String bname);
public List<Book> selectBooksLike3(String bname);
List<Book> list1();
List<Book> list2();
List<Book> list3(BookVo vo);
List<Map> list4();
Map list5(Map map);
List<Map> listPager(PageBean pageBean, Map map);
List<Book> list6(BookVo vo);
List<Book> list7(BookVo vo);
}
BookBizImpl
package com.cdl.biz.impl;
import com.cdl.biz.BookBiz;
import com.cdl.ssm.mapper.BookMapper;
import com.cdl.ssm.model.Book;
import com.cdl.ssm.model.vo.BookVo;
import com.cdl.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @author cdl
* @site www.cdl.com
* @create 2022-08-10 22:49
*/
@Service
public class BookBizImpl implements BookBiz {
@Autowired
private BookMapper bookMapper;
//alt+insert 快速提供set/get/toString/构造方法
//alt+enter 快速构建实现类,填充代码的前半部分 Ctrl+1
// public BookMapper getBookMapper() {
// return bookMapper;
// }
//
// public void setBookMapper(BookMapper bookMapper) {
// this.bookMapper = bookMapper;
// }
@Override
public int deleteByPrimaryKey(Integer bid) {
return bookMapper.deleteByPrimaryKey(bid);
}
@Override
public int insert(Book record) {
return bookMapper.insert(record);
}
@Override
public int insertSelective(Book record) {
return bookMapper.insertSelective(record);
}
@Override
public Book selectByPrimaryKey(Integer bid) {
return bookMapper.selectByPrimaryKey(bid);
}
@Override
public int updateByPrimaryKeySelective(Book record) {
return bookMapper.updateByPrimaryKeySelective(record);
}
@Override
public int updateByPrimaryKey(Book record) {
return bookMapper.updateByPrimaryKey(record);
}
@Override
public List<Book> selectByIn(List bookIds) {
return bookMapper.selectByIn(bookIds);
}
@Override
public List<Map> listPager(PageBean pageBean, Map map){
return bookMapper.listPager(map);
}
// public List<Map> listPager(Map map, PageBean pageBean) {
// pageHelper分页插件相关代码
// if(pageBean != null && pageBean.isPagination()){
// PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
// }
//
// List<Map> maps=bookMapper.listPager(map);
//
// if(pageBean != null && pageBean.isPagination()){
处理查询结果的前提,是需要分页的
// PageInfo info=new PageInfo(maps);
// pageBean.setTotal(info.getTotal()+"");
// }
//
// return maps;
// }
@Override
public List<Book> list6(BookVo vo) {
return bookMapper.list6(vo);
}
@Override
public List<Book> list7(BookVo vo) {
return bookMapper.list7(vo);
}
@Override
public List<Book> selectBooksLike1(String bname) {
return bookMapper.selectBooksLike1(bname);
}
@Override
public List<Book> selectBooksLike2(String bname) {
return bookMapper.selectBooksLike2(bname);
}
@Override
public List<Book> selectBooksLike3(String bname) {
return bookMapper.selectBooksLike3(bname);
}
@Override
public List<Book> list1() {
return bookMapper.list1();
}
@Override
public List<Book> list2() {
return bookMapper.list2();
}
@Override
public List<Book> list3(BookVo vo) {
return bookMapper.list3(vo);
}
@Override
public List<Map> list4() {
return bookMapper.list4();
}
@Override
public Map list5(Map map) {
return bookMapper.list5(map);
}
public BookBizImpl() {
super();
}
}
BookController
package com.cdl.controller;
import com.cdl.biz.BookBiz;
import com.cdl.ssm.model.Book;
import com.cdl.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author cdl
* @site www.cdl.com
* @create 2022-08-17 1:04
*
* @RequestMapping 加在类上面 称窄化路径 相当于包的概念
*/
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookBiz bookBiz;
// http://localhost:8080/book/list
@RequestMapping("/list")
public String hello(HttpServletRequest req){
System.out.println("hello springmvc...");
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
Map map = new HashMap();
String bname = req.getParameter("bname");
map.put("bname",bname);
List<Map> maps = this.bookBiz.listPager(pageBean, map);
req.setAttribute("lst",maps);
return "hello";
}
@RequestMapping("/add")
public String add(Book book){
this.bookBiz.insertSelective(book);
return "hello";
}
@RequestMapping("/edit")
public String edit(Book book){
this.bookBiz.insertSelective(book);
return "hello";
}
@RequestMapping("/del/{bid}")
public String del(@PathVariable("bid") Integer bid){
this.bookBiz.deleteByPrimaryKey(bid);
return "hello";
}
}
index.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2022/8/17
Time: 1:35
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>
<a href="${pageContext.request.contextPath}/book/list">查询所有</a>
<a href="${pageContext.request.contextPath}/book/add?bid=2&bname=sb&bprice=9.9">新增</a>
<a href="${pageContext.request.contextPath}/book/edit?bid=2&bname=suibian&bprice=9.8">修改</a>
<a href="${pageContext.request.contextPath}/book/del/2">删除</a>
</body>
</html>
index.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2022/8/17
Time: 1:35
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>
<a href="${pageContext.request.contextPath}/book/list?bname=圣墟">查询所有</a>
<a href="${pageContext.request.contextPath}/book/add?bid=2&bname=sb&bprice=9.9">新增</a>
<a href="${pageContext.request.contextPath}/book/edit?bid=2&bname=suibian&bprice=9.8">修改</a>
<a href="${pageContext.request.contextPath}/book/del/2">删除</a>
</body>
</html>
hello.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2022/8/16
Time: 22:45
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>hello</title>
</head>
<body>
spring mvc 你好
${msg}
<hr>
${lst}
<c:forEach items="${lst}" var="l">
${l.bid} : ${l.bname}
</c:forEach>
</body>
</html>
点击新增
注意:但是在刷新页面的时候就会报错
理由:因为a标签默认转发
解决:改成重定向
修改BookController
package com.cdl.controller;
import com.cdl.biz.BookBiz;
import com.cdl.ssm.model.Book;
import com.cdl.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author cdl
* @site www.cdl.com
* @create 2022-08-17 1:04
*
* @RequestMapping 加在类上面 称窄化路径 相当于包的概念
*/
@Controller
@RequestMapping("/book")
public class BookController {
@Autowired
private BookBiz bookBiz;
// http://localhost:8080/book/list
@RequestMapping("/list")
public String hello(HttpServletRequest req){
System.out.println("hello springmvc...");
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
Map map = new HashMap();
String bname = req.getParameter("bname");
map.put("bname",bname);
List<Map> maps = this.bookBiz.listPager(pageBean, map);
req.setAttribute("lst",maps);
return "hello";
}
@RequestMapping("/add")
public String add(Book book){
this.bookBiz.insertSelective(book);
return "redirect:/book/hello";
}
@RequestMapping("/edit")
public String edit(Book book){
this.bookBiz.insertSelective(book);
return "redirect:/book/hello";
}
@RequestMapping("/del/{bid}")
public String del(@PathVariable("bid") Integer bid){
this.bookBiz.deleteByPrimaryKey(bid);
return "redirect:/book/hello";
}
}
可见可以用了
常用注解
@Controller :被其标记的类会交给spring管理
@PathVariable:路径传参
@RequestMapping(@getMapping【查询】 @PostMapping【修改】 @DeleMapping【删除】 @PutMapping 【新增】的总称) 加在类上称窄化路径相当于包的概念
返回值得处理
"hello" 转发到hello.jsp
"redirect:/hello"重定向到../hello
静态资源
<img src="${pageContext.request.contextPath}/static/images/1.jpeg">