初衷
带新人学java web时,发现网上99%的文章都是基于某个IDE来教学,此方式会让新人极易被IDE庞杂的功能给干扰,导致注意力被分散,而非专注于java web应用的目录格式、配置文件的作用、及其内部配置项对应web体系、springmvc体系的哪一部分。因此写一篇白手构建java web应用的文章,争取新人在重要知识点的注意力最大化。
前提
1.已安装maven和Tomcat并能正常使用。如果您通过代理上网或者链接到Apache的中央仓库很慢,请搜索相关教材,汗牛充栋。
2.初步了解java web和spring mvc的基本概念。不熟可先看看这里:1,2
创建java Web应用框架
通过Maven的原型maven-archetype-webapp创建一个java web的标准框架。
运行:mvn archetype:generate -DgroupId=com.cmxx -DartifactId=mvc_demo -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
如果发现很慢,请看上面的前提。
建完后,目录结构如下:
各子目录的基本分工:
读者可以瞄一眼pom.xml、index.jsp和web.xml,看最基本的架构包含啥内容。
构建java web应用
1.运行mvn clean package
,build success说明项目没有出错
2.修改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.cmxx</groupId>
<artifactId>mvc_demo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>simpleWeb Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>mvc_demo</finalName>
</build>
</project>
3.在src/main下新建java文件,运行mkdir java
或者手动新建文件夹
4.在src/main/java下新建包,包路径自定义,此处为com.cmxx
5.在src/mian/java/com/cmxx包下新建SimpleController.java文件,代码如下:
package com.cmxx;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/myc/")
public class SimpleController {
@RequestMapping(method = RequestMethod.GET)
public String sayMvc(ModelMap model) {
model.addAttribute("modelValue", "Simple Spring 4 MVC");
return "output"; //WEB-INF/views/output.jsp
}
@RequestMapping(value = "/simpleAgain", method = RequestMethod.GET)
public String sayHelloAgain(ModelMap model) {
model.addAttribute("modelValue", "Simple again from Spring 4 MVC");
return "output"; //WEB-INF/views/output.jsp
}
}
6.在src/main/webapp/WEB-INF下新建views文件夹,运行mkdir views
或者手动新建文件夹
7.src/main/webapp/WEB-INF/views文件夹下新建output.jsp文件,其中的代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Simple page</title>
</head>
<body>
Output: ${modelValue}
</body>
</html>
8.src/main/webapp/WEB-INF文件夹下新建applicationContext.xml文件,其中的代码如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.cmxx" />
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
9.修改src/main/webapp/WEB-INF下的web.xml文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Simple Spring MVC web app</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/entry/*</url-pattern>
</servlet-mapping>
</web-app>
10.运行mvn clean package
,build success说明项目可以进行发布
发布java web应用
1.查看项目的target文件夹,可以发现有打包好的mav_demo.war包,把war包复制到tomcat安装目录下的webapps文件下:
2.运行tomcat的bin目录下的startup.bat
3.在浏览器中输入网址http://localhost:8080/mvc_demo/entry/myc/,运行结果如下:
4.在浏览器中输入网址http://localhost:8080/mvc_demo/entry/myc/simpleAgain,运行结果如下:
温习Spring MVC Flow
读者请将以上练习的内容,对应到底下Java web+Spring MVC体系,加深理解。请先忽略Model和Database部分
- web.xml是java web的标准配置文件,配置servlet基本信息及url根映射路径(/entry/*)。这里配置的servlet为Spring MVC的前置控制器:DispatcherServlet
- applicationContext.xml用于配置Spring MVC的基本信息,包括包扫描路径、基于注解的controller与url映射配置、创建视图解析器(InternalResourceViewResolver)
- SimpleController用于处理url为/entry/myc/的请求。其中均设置了一个model并返回output(等于告诉视图解析器,寻找一个output开头的视图来呈现model的内容)
- output.jsp:视图。视图解析器根据applicationContext.xml里面的配置,找到output.jsp作为内容呈现者。output.jsp里面的
${modelValue}
是告诉视图解析器,将model里面key为modelValue的内容放到这里来 - Tomcat将解析好的output.jsp通过HTTP返回给浏览器