一个基于注解的简单spring程序
在“HzhJava框架搭建三”中简单的介绍了基于配置的spring程序,是为了了解spring演变过程,更了的理解spring的原理和使用方式。注解是为了简化配置而产生的一种简单的写法,我们可以简单的把注解理解成是一种“更为方便的配置”。从原理上将,注解和配置其实并没有什么不同,都是向spring的IOC容器中注入依赖,也就是把我们需要spring帮助管理的类和方法注入到IOC中,配置和注解就是spring提供了依赖注入的两种方式,我们用spring提供的方式来告诉那些依赖是要注入的即可。
先让我们来看一下程序的整个目录结构,红色方框里的内容是我们这次添加的,其它的是在“HzhJava框架搭建二”中准备的内容。
Food.java文件
<span style="font-size:12px;">package com.sprmvc.bean;
public class Food {
private String favoriteFruit;
public String getFavoriteFruit() {
return favoriteFruit;
}
public void setFavoriteFruit(String favoriteFruit) {
this.favoriteFruit = favoriteFruit;
}
}
</span>
FoodController.java文件
<span style="font-size:12px;">package com.sprmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.sprmvc.bean.Food;
@Controller
public class FoodController {
@RequestMapping(value="/food-page")
public ModelAndView foodPage() {
return new ModelAndView("food-form", "food", new Food());
}
@RequestMapping(value="/food-result")
public ModelAndView processFuits(Food food) {
ModelAndView modelAndView = new ModelAndView("food-result");
modelAndView.addObject("food", food);
return modelAndView;
}
}
</span>
food-from.jsp文件
<span style="font-size:12px;"><%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!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=ISO-8859-1">
<title>Fruit page</title>
</head>
<body>
<h1>Fruit page</h1>
<form:form method="POST" commandName="food" action="food-result.html">
<table>
<tr>
<td>Apple </td>
<td><form:checkbox path="favoriteFruit" value="apple" /></td>
</tr>
<tr>
<td>Orange </td>
<td><form:checkbox path="favoriteFruit" value="orange" /></td>
</tr>
<tr>
<td>Banana </td>
<td><form:checkbox path="favoriteFruit" value="banana" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Submit"/>
</td>
</tr>
</table>
</form:form>
<br/>
<a href="${pageContext.request.contextPath}/">Main page</a>
</body>
</html></span>
food-result.jsp文件
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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=ISO-8859-1">
<title>Food result page</title>
</head>
<body>
<h1>Food result page</h1>
You prefer:
<br/>
<c:forEach var="fruit" items="${food.favoriteFruit}">
${fruit}<br/>
</c:forEach>
<a href="${pageContext.request.contextPath}/">Main page</a>
</body>
</html>
index.jsp文件
<span style="font-size:12px;"><%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
<title>第一个JSP程序</title>
</head>
<body>
<h1>Home page</h1>
<p>This is Home page.</p>
<p>
<a href="food-page">Food page</a> <br />
</p>
</body>
</html></span>
以上是程序运行相关代码,大部分代码相信都很容易看懂,这里我就简单的介绍下spring注解用到的三个关键字
@Controller:类级别上的注解,标注了@Controller后,借助<context:component-scan>,框架能自动识别到这是一个Controller,并注入到IOC中;
@RequestMapping:可以出现在类级别上,也可以出现在方法体上,用来实现方法体和Url请求的绑定;
下面是运行程序的配置文件(基于注解也是需要有基础配置的,只是不在需要配置具体的每个类和方法,而是指定使用spring的<context:component-scan>方法),每个文件的功能和“HzhJava框架配置三”中一样,就不在重复说明来了。
1、web.xml文本配置
<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<!-- SpringMVC的前端控制器 -->
<!-- 当DispatcherServlet载入后,它将从一个XML文件中载入Spring的应用上下文,该XML文件的名字取决于<servlet-name> -->
<!-- 这里DispatcherServlet将试图从一个叫做springmvc-servlet.xml的文件中载入应用上下文,其默认位于WEB-INF目录下 -->
<!-- 所以ContextLoaderListener参数值也可写成<param-value>classpath:applicationContext-*.xml</param-value> -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 使用ContextLoaderListener配置时,需要告诉它Spring配置文件的位置 -->
<!-- 如果没有指定,上下文载入器会在/WEB-INF/applicationContext.xml中找Spring配置文件 -->
<!-- 我们可以通过在Servlet上下文中设置contextConfigLocation参数,来为上下文载入器指定一个或多个Spring配置文件 -->
<!-- 注意:contextConfigLocation参数是一个用逗号分隔的路径列表,其路径是相对于Web系统的根路径的 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- <param-value>/WEB-INF/springmvc-servlet.xml</param-value> -->
<param-value>/WEB-INF/springmvc-servlet.xml, /WEB-INF/applicationContext-*.xml</param-value>
</context-param>
<!-- 配置上下文载入器 -->
<!-- 上下文载入器载入除DispatcherServlet载入的配置文件之外的其它上下文配置文件 -->
<!-- 最常用的上下文载入器是一个Servlet监听器,其名称为ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app></span>
2、springmvc-servlet.xml配置
<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
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-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
">
<!-- 把标记了@Controller注解的类转换为bean -->
<mvc:annotation-driven />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<context:component-scan base-package="com.sprmvc.controller" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
</beans></span>
3、applicationContent-view.xml配置
<span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 【配置视图解析器】 -->
<!-- InternalResourceViewResolver会在ModelAndView返回的视图名前加上prefix指定的前缀,再在最后加上suffix指定的后缀 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans></span>
配置好上述文件后,启动服务器,在浏览器的地址栏里输入localhost:8080/HzhJava/