一个简单的Web网站搭建:
开发工具:eclipse
运行环境:jetty
依赖管理工具:maven
首先创建一个maven项目:
选择webapp。
填写好之后finish即可。
打开pom文件。加入spring-mvc的依赖。我们使用spring mvc当然要加入相应的依赖了
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
并加入jetty插件,这是一款轻量级的web容器,提供我们的运行环境
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.7.v20160115</version>
</plugin>
pom文件就配置好了。
打开web.xml文件。
在这里我们需要配置前端控制器,也就是DispacherServlet。加入servlet标签。
<!-- 加载DispatcherServlet应用上下文 -->
<servlet>
<servlet-name>webDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 可选的初始化,指定你加载的上下文文件的位置,如果不写,则默认使用/WEB-INF/[servlet-name]-servlet.xml的文件
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:webDispatcherServlet-servlet.xml</param-value>
</init-param>
-->
<!-- 设置servlet的优先级,正数数时越小优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
这个前端控制器操作什么样的映射呢?所以我们要加入对应的映射关系。
<!-- url拦截到对应的前端控制器 -->
<servlet-mapping>
<servlet-name>webDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
根路径下的url全都会交给这个前端控制器去处理。
那么前端控制器处理什么东西呢?
在前面一章里面讲过,前端控制器需要和HandlerMapping,HandlerAdapter,ViewResolver打交道。所以我们需要在前端控制器加载的上下文的文件中,告诉他这些东西。
<!-- HandlerMapping -->
<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!-- ViewResolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
这里为了便于理解,所以将他们显示的写出来,在实际开发中,除了ViewResolver之外,其他两个都可以被一个xml标签所代替:
<annotaion-driven/>
但为了更加方便的说明,这里我们还是采用这种方法。
上面的配置中,关于viewResolver,prefix是前缀,表明路径,suffix是后缀,表明view的格式。
为了便于我们在业务逻辑开发中可以使用注解的形式,我们还需要在前端控制器配置文件中加入
<context:component-scan base-package="" />
在上篇的说明中,前端控制器只控制业务逻辑中的Controller部分,所以我们应当加入相应的include标签。
这样,我们的简单的配置就基本结束了。
最后就是编写我们的业务逻辑:
这里举一个简单的例子:
@Controller
@RequestMapping("/hello")
public class HelloWorldController {
@RequestMapping("/helloworld")
public String hello(Map<String, String> model) {
model.put("message", "Hello World!");
return "index";
}
}
在业务逻辑中,我们只需要使用@RequestMapping注解,就可以轻松的将映射对应到某个方法当中。
这里的意思很容易明白:/hello目录下的访问会映射到这个类中进行执行。而/hello/helloworld的访问则会对应到hello()这个方法中执行。
在上一篇中讲过,Controller需要返回一个ModelAndView对象,这里的ModelAndView就是方法中的model对象,一般有两种形式1.Model类 2.Map类。
这两种类都可以使用,在传递的过程中,都会将这两个转换成ModelAndView类再交给ViewResolver进行处理。
那么他的返回值是什么意思呢?
它的返回值指的就是对应的view。我们前面对ViewResolver进行了配置对吧。prefix + 返回值 + suffix得到的就是需要渲染的文件的位置。
在返回值这里,我们可以使用redirect:{url路径}或者forward:{url路径}的方式进行重定向和跳转。
例如:redirect:/hello可以跳转到localhost:8080/hello。
这样,我们上一节讲的所有接口都在例子中得到了诠释。
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>${message}</body>
</html>
最后简单的使用jetty:run就可以运行了。
显示效果如下:
如果要获取url上的参数呢?如何进行获取?例如localhost:8080/hello/helloworld?name=123。
@RequestMapping("/helloworld")
public String hello(@RequestParam("name")String name, Map<String, String> model) {
model.put("message", "Hello World! " + name);
return "index";
}
只需要简单的使用@RequestParam注解就可以了。
Restful风格的参数也是支持的。
@RequestMapping("/helloworld/{name}")
public String hello(@PathVariable("name")String name, Map<String, String> model) {
model.put("message", "Hello World! " + name);
return "index";
}
我们只需要简单的配置,就可以把我们的注意力全部集中在业务逻辑的开发上,是不是非常的简单便捷呢?