SpringMVC配置篇

Spring为Java开发带来了春天。 ——不知道谁说的,反正很有名
为什么我们要学习SpringMVC,而不是像往常一样开发web程序?

试想一下,Java Web开发是怎么样的?你要构建一系列的Servlet,一系列的Filter。

构建一个Servlet,用复杂的xml或者WebServlet注解,继承了HttpServlet,你要实现doPost或者doGet方法,在结束请求的时候你要重定向到另一个Servlet/jsp等。SpringMVC为你简化了很多操作。首先我们来用maven构建一个项目HelloSpringMVC(详细可以看4.14日的博客)。然后在pom.xml贴上如下代码:

<dependencies>
    <!--Spring-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.16.RELEASE</version>
    </dependency>
    <!--servlet-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!--SpringMVC-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!--apache-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.1</version>
    </dependency>
</dependencies>

这样我们的环境就配置好了。

一、我的Servlet呢?
要知道的是,SpringMVC基于Servlet的,但是你不用自己去实现HttpServlet的接口,SpringMVC里面有一个叫做DispatcherServlet的东西,所有的请求都会被DispatcherServlet截获,找到Controller,然后返回View。多说无益,我们实战。

二、配置启用SpringMVC:完全利用注解,最小但可用。(参考Spring In Action这本书,推荐)
1、我们在src/main/java中新建一个package mvc.config,在里面新建三个类:WebInitalizer、RootConfig和WebConfig。

package mvc.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

//对于AbstractAnnotationConfigDispatcherServletInitializer,我们目前只需要知道所有Spring应用的上下文
//都会基于它来帮助我们配置DispatcherServlet
public class WebInitalizer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
    @Override
//    RootConfig定义
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {RootConfig.class};
    }

    @Override
//    ServletConfig定义
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {WebConfig.class};
    }

    @Override
//    全部的"/"请求
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

}
package mvc.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


@Configuration
@EnableWebMvc
//       会扫描mvc.web包,里面是Controller
@ComponentScan("mvc.web")
public class WebConfig extends WebMvcConfigurerAdapter{
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
//        view存放在WEB-INF下的views里面,请在此目录创建views目录
        resolver.setPrefix("/WEB-INF/views");
//        返回view类型为jsp文件
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}
package mvc.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;


@Configuration
@ComponentScan(basePackages = {"mvc"}, excludeFilters = {@ComponentScan.Filter(type =
        FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
}

这样我们的SpringMVC环境就配好了,但是看到这里,你应该读一遍代码。虽然接下来你的操作是复制粘贴,但是你可以很明显的发现,我们现在目录结构还不行。
我没有WEB-INF,我没有web.xml……
……(我怕我讲的太详细你们都不好好学习🙃️)
别急。经过一番操作(右击你的项目名称,Add Frameworks Support,勾一下Web Application然后OK即可),你的目录文件结构应该是介样子滴:

2、我们在web包中新建一个类,叫HelloMVCController:

package mvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

//你是一个Controller,你要注册才行
@Controller
//请求你的服务器root/hellomvc时候被截获
@RequestMapping("/hellomvc")
public class HelloMVCController {
//    GET METHOD
    @RequestMapping(method = RequestMethod.GET)
//    为SpringMVC返回一个字符串,标志资源
    public String helloMVC() {
//        资源名字叫MVC,你也可以在这里写你的逻辑
        return "/mvc";
    }
}

3、我们在WEB-INF中新建目录views,新建jsp叫做mvc.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>MVC</title>
  </head>
  <body>
  <h1>Hello SpringMVC By HC</h1>
  </body>
</html>

4、大功告成,部署到Tomcat中吧!(我还是怕你们不会用Idea部署web项目,简单讲一下)
(1)界面右上角有个带三角的方框,点一下,然后Edit Configurations,点+号,配置你的Tomcat Server。(不知道什么是tomcat就去面壁吧)
(2)仔细看下面,有一个红色的提示说No artifacts marked for deployment,点一下右边的Fix,暂时点一下OK。
(3)IDE界面右上角有个Project Structure(找不到鼠标悬停找),然后在里面找到Artifacts,Output Layout中有AvaliableElements一栏,如果里面有东西,右键全选,然后选择put into WEB-INF/lib中(非常重要)!
(4)IDE点一下绿色的运行键,部署到Tomcat中。在你的浏览器访问:
http://localhost:8080/hellomvc/
或者你定义好到URL,如果出现了你定义好到JSP,那么大功告成。done。

总结一下:
1、为什么用SpringMVC,而不用Servlet?
你不觉得新建一个Servlet,那一堆doGet,doPost很复杂么。而且页面跳转就是返回一个字符串,不觉得很优雅嘛?

2、config包里面那么复杂一堆注解,什么意思啊?
代码中有注释的内容可以了解一下。没注释的,不懂可以先不管,等我之后更新了Spring的内容就可以很明白了。如果现在急切想知道,自学一下Spring也是很好的。

3、Idea好麻烦,Tomcat好麻烦……
撸猫吧,撸完再学。(Idea是很好的IDE)

4、还有问题,发邮件zhanghaozjk@outlook.com或者在下面评论🐶,今天就到这里

发表评论

电子邮件地址不会被公开。