SpringMVC相关知识点

一、什么是SpringMVC

1.什么是SpringMVC

        springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。

springmvc是一个基于mvc的web框架。

2.什么是MVC

        mvc是一个设计模式(设计模式就是总结了日常开发中很好的经验和编写代码的方法,进行了抽取)。

二、基于Servlet开发

注:创建maven项目时,选择构建webapp项目

Servlet基于”类“处理请求,一个请求对应的就是一个Servlet进行处理

1.准备工作

1.导入相关包

<?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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.igeek.ssm</groupId>
    <artifactId>testSpringMVC_MyBatis_Config</artifactId>
    <!-- SpringMVC  打包war,在Tomcat容器中运行 -->
    <!-- SpringBoot 打包jar,内置Tomcat容器 -->
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>testSpringMVC_MyBatis_Config Maven Webapp</name>

    <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>
        <spring.version>5.3.13</spring.version>
        <mybatis.version>3.4.6</mybatis.version>
        <mysql.version>8.0.16</mysql.version>
    </properties>

    <dependencies>
        <!-- thymeleaf -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>

        <!-- log4j日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <!-- aspectj -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>

        <!--spring相关包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</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-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--mysql驱动包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!--mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <!-- mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>

        <!--jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.5</version>
        </dependency>

        <!-- 文件上传 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- 引入MyBatis分页插件pagehelper依赖 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>

        <!-- 引入hibernate validator的校验框架依赖 -->
        <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.1.6.Final</version>
        </dependency>

    </dependencies>

<build>
<finalName>testSSM</finalName>

<plugins>
    <!-- maven启动项目,tomcat8 -->
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat8-maven-plugin</artifactId>
        <version>3.0-r1655215</version>
        <configuration>
            <port>8899</port>
            <path>/</path>
            <uriEncoding>UTF-8</uriEncoding>
        </configuration>
    </plugin>
</plugins>
</build>

<pluginRepositories>
<pluginRepository>
    <id>alfresco-public</id>
    <url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
</pluginRepository>
<pluginRepository>
    <id>alfresco-public-snapshots</id>
    <url>https://artifacts.alfresco.com/nexus/content/groups/public-snapshots</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>daily</updatePolicy>
    </snapshots>
</pluginRepository>
<pluginRepository>
    <id>beardedgeeks-releases</id>
    <url>http://beardedgeeks.googlecode.com/svn/repository/releases</url>
</pluginRepository>
</pluginRepositories>

</project>

2.新建log4j.properties日志属性文件

mybatis默认使用log4j作为输出日志信息。在资源包下添加

# Global logging configuration
# 在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3.创建db.properties属性文件

存放数据库相关属性

#mysql
db.user=root
db.password=root
db.url=jdbc:mysql://localhost:3306/lesson?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
db.driverClass=com.mysql.cj.jdbc.Driver
db.maxPoolSize=30
db.minPoolSize=3
db.initialPoolSize=5
db.acquireIncrement=5

2.配置类

1.MyBatisConfig配置类

//声明当前是一个配置类
@org.springframework.context.annotation.Configuration
//加载属性文件
@PropertySource("classpath:db.properties")
//开启注解事务管理  proxyTargetClass设置为true,使用CGLIB动态代理
@EnableTransactionManagement(proxyTargetClass = true)
//设置扫描包,为mapper接口生成代理对象
@MapperScan("com.igeek.ssm.mapper")
public class MyBatisConfig {

    //配置数据源
    @Bean
    public DataSource dataSource(
            @Value("${db.user}")String user,
            @Value("${db.password}")String password,
            @Value("${db.url}")String jdbcUrl,
            @Value("${db.driverClass}")String driverClass,
            @Value("${db.maxPoolSize}")int maxPoolSize
    ) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(password);
        dataSource.setJdbcUrl(jdbcUrl);
        dataSource.setDriverClass(driverClass);
        dataSource.setMaxPoolSize(maxPoolSize);
        return dataSource;
    }

    //配置会话工厂实例bean
    @Bean
    public SqlSessionFactoryBean factory(DataSource dataSource) throws IOException {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        //配置数据源
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.igeek.ssm.pojo");

        //全局参数
        Configuration configuration = new Configuration();
        //开启驼峰式命名
        configuration.setMapUnderscoreToCamelCase(true);
        //开启二级缓存
        //configuration.setCacheEnabled(true);
        factoryBean.setConfiguration(configuration);

        //加载Mapper映射文件
        factoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/*.xml"));

        //分页插件
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        //设置方言为mysql  select * from xxx limit 起始值,每页展示记录数;
        properties.put("helperDialect" , "mysql");
        //设置分页页码合理化
        properties.put("reasonable" , "true");
        pageInterceptor.setProperties(properties);
        //会话工厂设置分页插件
        factoryBean.setPlugins(new Interceptor[]{pageInterceptor});

        return factoryBean;
    }

    //配置事务管理器
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
        return transactionManager;
    }
}

2.SpringMVCConfig配置类

/**
 * SpringMVC配置类,做WebMVC定制化开发
 * 1.开启WebMVC功能 @EnableWebMvc
 * 2.@Configuration + @Bean 替换底层组件
 * 3.implements WebMvcConfigurer + @Override重写方法
 *
 * @author chemin
 * @since 2024/6/16
 */
//开启WebMVC功能
@EnableWebMvc
//设置扫描包,将其注册至IOC容器中
@ComponentScan({"com.igeek.ssm.controller","com.igeek.ssm.service"})
public class SpringMVCConfig implements WebMvcConfigurer {

    //方式一:@Configuration + @Bean 替换底层组件
    @Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setSupportedMethods("POST" , "PUT");
        multipartResolver.setMaxUploadSize(5242880);
        return multipartResolver;
    }

    //方式二:implements WebMvcConfigurer + @Override重写方法
    //RestFul风格 对静态资源放行
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    //本地图片服务器路径
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pic/*").addResourceLocations("file:/E:\\picture\\");
    }

    //自定义转换器  String -->  Date
    /*@Bean
    public CustomDateConverter customDateConverter(){
        return new CustomDateConverter();
    }

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(customDateConverter());
    }*/

    /************* 校验器配置 开始 ***************/
    //配置校验信息的配置文件
    @Bean
    public ReloadableResourceBundleMessageSource messageSource(){
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        //设置校验信息的配置文件
        messageSource.setBasename("classpath:CustomValidationMessages");
        //设置编码集
        messageSource.setDefaultEncoding("UTF-8");
        //设置缓存时间
        messageSource.setCacheSeconds(120);
        return messageSource;
    }

    //配置校验器
    @Bean
    public LocalValidatorFactoryBean validator(){
        LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
        //设置校验器的提供方
        factoryBean.setProviderClass(HibernateValidator.class);
        //设置加载的资源文件
        factoryBean.setValidationMessageSource(messageSource());
        return factoryBean;
    }

    //校验器注入到处理器适配器中
    @Override
    public Validator getValidator() {
        return validator();
    }
    /************* 校验器配置 结束 ***************/


    //全局异常处理器
    @Override
    public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(new MyHandlerExceptionResolver());
    }


    //拦截器

}

3.WebInitializer的web初始化配置类

/**
 * 替换 webapp/WEB-INF/web.xml文件
 * 一旦Tomcat容器启动,则加载WebApplicationInitializer接口中的onStartup方法
 *
 * @author chemin
 * @since 2024/6/16
 */
public class WebInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        //基于Web环境,创建IOC容器
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        ac.register(MyBatisConfig.class , SpringMVCConfig.class , ThymeleafTemplateConfig.class);

        //配置编码集过滤器
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("characterEncodingFilter", new CharacterEncodingFilter("UTF-8"));
        encodingFilter.addMappingForUrlPatterns(null , true , "/*");
        ac.setServletContext(servletContext);

        //配置前端控制器
        ServletRegistration.Dynamic dispatcherServlet = servletContext.addServlet("dispatcherServlet", new DispatcherServlet(ac));
        //针对于RESTFul风格 HTTP动词 POST、GET、PUT、DELETE
        dispatcherServlet.addMapping("/");
        dispatcherServlet.setLoadOnStartup(1);

    }
}

 4.结果jsp文件

fail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
fail.jsp
</body>
</html>

index.jsp
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

info.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    请求:${msg1}
    <br/>
    会话:${msg2}
    <br/>
    info.jsp
</body>
</html>


success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    欢迎 ${requestScope.username} 登陆
    <br/>
    请求:${msg1}
    <br/>
    会话:${msg2}
    <br/>
    <a href="/info.jsp">访问info.jsp</a>
    success.jsp
</body>
</html>

 3.相关代码

1.接受请求

* 1.自定义的Servlet,需要继承HttpServlet
* 2.通过注解@WebServlet,指定urlPatterns能够处理的请求
* 3.重写doGet()、doPost()方法

@WebServlet(name = "UserServlet" , urlPatterns = {"/userServlet","/first"})
public class UserServlet extends HttpServlet {
     @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet~");
    }

     @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost~");
        this.doGet(request, response);
    }
    
}

2.请求参数

1.String value = request.getParameter("username");

2.Map<String, String[]> parameterMap = request.getParameterMap(); 获取请求中所有的请求参数

3.String[] hobbies = request.getParameterValues("hobby"); 获取例如多选框一组的请求参数

3.页面跳转

1.请求转发

1.语法 request.getRequestDispatcher("success.jsp").forward(request,response);
2.不会产生新的请求,可以携带之前的数据
3.地址栏不会发生变化,会显示请求地址
4.跳转至本项目内的页面

2.响应重定向

1.语法 response.sendRedirect("success.jsp");
2.会产生新的请求,不可以携带之前的数据
3.地址栏会发生变化,会显示目标地址
4.跳转至项目外的链接

/获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username = "+username +" , password = "+password);
        if(StringUtils.hasLength(username) && StringUtils.hasLength(password)){
            //跳转至成功页面
            request.setAttribute("username" , username);

            //请求转发
            request.getRequestDispatcher("success.jsp").forward(request,response);

            //响应重定向
            response.sendRedirect("success.jsp");

        }else {
            //跳转至失败页面
            request.getRequestDispatcher("fail.jsp").forward(request,response);
        }

4.响应json数据  适用于前后分离项目

//谷歌的gson 、 阿里的fastjson 、 Spring官配jackson 、 hutool工具包等等
//响应json数据 {"isSuccess":"ok"}
PrintWriter out = response.getWriter();
out.println("{\"isSuccess\":\"ok\"}");
out.flush();
out.close();

5.从后台将数据传递给前端

request.setAttribute("username" , username); 请求作用域

session.setAttribute("user" , user); 会话作用域

6.doGet

请求方式GET:

1.地址栏访问 http://localhost:8899/userServlet?username=李四&password=123

2.超链接访问 <a href="/userServlet?username=李四&password=123"></a>

3.form表单action指定get <form action="/userServlet" method="get"></form>

4.axios请求指定请求方式get axios.get('url')

5.postman指定请求方式测试

特点:

1.地址栏会追加数据 url?k1=v1&k2=v2&...

2.不适合提交私密数据

3.不适合提交数据量过大的数据(因为浏览器URL长度有限)

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet~");

        //获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username = "+username +" , password = "+password);
        if(StringUtils.hasLength(username) && StringUtils.hasLength(password)){
            //跳转至成功页面
            request.setAttribute("username" , username);

            //请求转发
            //request.getRequestDispatcher("success.jsp").forward(request,response);

//            响应重定向
            response.sendRedirect("success.jsp");

            //谷歌的gson 、 阿里的fastjson 、 Spring官配jackson 、 hutool工具包等等
            //响应json数据 {"isSuccess":"ok"}
//            PrintWriter out = response.getWriter();
//            out.println("{\"isSuccess\":\"ok\"}");
//            out.flush();
//            out.close();

        }else {
            //跳转至失败页面
            request.getRequestDispatcher("fail.jsp").forward(request,response);
        }
    }

7.doPost

请求方式Post

1.form表单action指定post <form action="/userServlet" method="post"></form>

2.axios请求指定请求方式post axios.post('url')

3.postman指定请求方式测试 x-www-form-urlencoded

特点:

1.地址栏不会追加请求数据

2.可以提交私密的数据、数据量大的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值