一、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!!
网友评论