Java Spring MVC

IntelliJ IDEA开发Spring MVC (一)

2017-05-21  本文已影响194人  喝粥蛋

一、Maven自动导入jar包

打开你的 pom.xml 文件,你会发现它是这个样子:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ali</groupId>
  <artifactId>webstore</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>webstore Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

  </dependencies>
  <build>
    <finalName>webstore</finalName>
  </build>
</project>

你现在需要做的是在<dependencies> </dependencies>之间加入你的依赖,如下所示:

     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

junit这个自动生成的依赖我们用不上,删除它。
完成后的 pom.xml 文件如下(以后我只是列出需要的依赖,不会再有完整是展示,因为都差不多)

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ali</groupId>
  <artifactId>webstore</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>webstore Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>webstore</finalName>
  </build>
</project>

因为这是一个Spring MVC web项目,所以我们需要spring-webmvc的依赖;添加 jstl 是为了让我们编写 jsp 页面的时候轻松点;同理添加 javax.servlet-api 也是为了使用和 servlet 相关的代码。

打开你的 Exrernal Libraries,你会发现它长这个样子:



这就是Maven的好处,它不仅能够将你需要的 jar 包下载下来,而且还能够将你需要 jar 包所依赖的 jar 包也下载下来。

二、建立java文件夹


建好后如下图所示:



将建立的 java 文件夹设置为 sources 文件夹,如下图所示:



此时 java 文件夹会变为蓝色。
最后在 java 文件夹(请注意你 java 文件夹的颜色)下面新建几个子文件夹,效果如下:

三、建立 jsp 文件

在WEB-INF文件夹下面,建立 jsp 文件夹,然后在 jsp 文件夹下面创建 welcome.jsp 文件(请删除 WEB-INF 文件下面的 web-xml和index.jsp)如下图所示:


ok,现在我们来编写 welcome. jsp (终于到写代码的时候了)

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Welcome</title>

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">

</head>

<body>
<div class="jumbotron">
    <h1> ${greeting} </h1>
    <p> ${tagline} </p>
</div>
</body>
</html>

我知道你现在可能对这个jsp代码不太熟悉,先别着急。我们先在controller文件夹下面创建 HomeController,代码如下:

package com.packt.webstore.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

    @RequestMapping("/")
    public String welcome(Model model) {
        model.addAttribute("greeting", "Welcome to Web Store!");
        model.addAttribute("tagline", "The one and only amazing web store");

        return "welcome";
    }
}

分析:
在 welcome. jsp 中,我们需要关注的是这两行代码:

<h1> ${greeting} </h1>
<p> ${tagline} </p>

其中 greeting 和 tagline 是变量,在浏览器展示 jsp 页面的时候,这两个变量存储的值会以 h1 和 p 的格式展示。
那么问题来了,这两个变量中的值是从哪里来的呢??我们建立的HomeController 里面的 welcome 方法里面的代码如下:

model.addAttribute("greeting", "Welcome to Web Store!");
model.addAttribute("tagline", "The one and only amazing web store");

在这里,我们暂时简单的将 model 当作是一种数据结构model.addAttribute就像map一样,给 key 赋值(key-value)。所以我们现在明白了,${greeting}和${tagline} 取得值就是"Welcome to Web Store!"和"The one and only amazing web store",重点在于前台和后台的变量名一样(也就是greeting 和 tagline)

四、创建Servlet mapping

我们现在已经有了前台页面 welcome.jsp和从后台获得的数据,那么现在可以直接运行程序吗?显然是不可以的。因为我们从浏览器中输入的地址:http://localhost:8080 程序不知道怎么处理这个请求,所以我们需要配置Spring MVC 提供的 Dispatcher servlet。

在 config 文件夹下面建立 WebApplicationContextConfig 和 DispatcherServletInitializer 目录结构如图所示:


其中 WebApplicationContextConfig 的代码如下:

package com.packt.webstore.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
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;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan("com.packt.webstore")
public class WebApplicationContextConfig extends WebMvcConfigurerAdapter {

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

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setViewClass(JstlView.class);
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");

        return resolver;
    }
}

DispatcherServletInitializer 的代码如下:

package com.packt.webstore.config;

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


public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebApplicationContextConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

在前面的疑问当中,我们的问题是浏览器发出的 HTTP 请求,不能够被后台所识别,所以才需要配置Spring MVC 提供的 Dispatcher servlet。

在 DispatcherServletInitializer 中,我们需要拦截浏览器发出的HTTP请求,所以我们需要重写这个方法:

@Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

这个 "/" 表示拦截到所有的请求。
现在我们已经将浏览器的请求给拦截到了,然后该怎么办呢?我们得告诉DispatcherServlet到哪里去找静态文件和控制器,这就是我们重写getServletConfigClasses()的原因:

@Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebApplicationContextConfig.class };
    }

它将告诉 DispatcherServlet 在WebApplicationContextConfig.class里面找静态文件,相应的控制器就是我们很早就写了的 HomeController 。

我知道,你现在也许还是不太清楚各个代码的实现细节,不用怕,我在后面会有相关的介绍。这个阶段只是简单的将整个流程走一遍。

五、配置Tomcat

现在我们要将整个工程发布到Tomcat上面,IDEA的Tomcat配置如下图所示:



然后如下:


如下:


选择 Deployment (仔细看下,在Name的下面)


点击 + 后,选择 Atifact,然后选择 webstore:war exploded,然后点击ok,如下图所示:


配置好了的界面如下:


点击上图红色方框中的 绿色 三角形,启动 Tomcat,跳转到浏览器,出现如下界面,则测试成功。

web 界面

六、结语

我知道你现在也许还有很多细节没弄清楚,不用担心,我会在后面的章节,给你娓娓道来。现在你需要弄清楚的是,Spring MVC 的整个运行流程是怎样的。从宏观上面把握。

Good luck!!

上一篇下一篇

猜你喜欢

热点阅读