一、从官网下载 spring jar包
http://repo.spring.io/release/org/springframework/
楼主选的是spring 4 版本,开发要用到的 基本jar包如下:
-javadoc 其实里面就是 html,用于介绍 api 的说明文档
-sources 里面是源代码,用于查看 框架的 设计和实现
二、 eclipse 新建 dynamic web 项目
记得勾选自动生成 web.xml文件啊。。。
三、编辑web.xml文件,创建springmvc文件
web.xml文件进行配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app 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_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- 配置 DispatcherServlet --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 --> <!-- 实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的. 默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml --> <!-- <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> --> <load-on-startup>1</load-on-startup> <!-- load on starup 大于、等于0代表随系统启动后加载 ,数字越小优先级越高 ; 数值为负数时,启动时不加载,调用时再加载 --> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- 第一种:*.action 或者 *.do,访问以.action或*.do结尾 由DispatcherServlet进行解析 第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析 使用此种方式可以实现 RESTful风格的url 第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时, 仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。 --> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 下面这个没有写不要紧,因为tomcat服务器默认 index为首页 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
可以参考一下:
j2ee标准-web.xml中load-on-startup源码解析
四、编辑 spring mvc 配置文件
根据 web.xml 中 已经配置好的 org.springframework.web.servlet.DispatcherServlet 的类,加载这个类时需要 转发配置文件。
转发配置文件–>【前面web.xml配置的是在src下, 取名springmvc.xml文件。如果是默认配置应该在WEB-INF下即和web.xml同目录,取名dispatcherServlet-servlet.xml文件】,其中 配置自定扫描的包 ,是为了扫描指定包文件中,有@Controller ,@Component等注解的类文件。
转发配置文件 的基本配置 如下:
<?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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!-- 对于注解的Handler可以单个配置 实际开发中建议使用组件扫描 --> <!-- <bean class="com.test.springmvc.handlers.HelloWorld" /> --> <!-- 可以扫描controller、service、...这里让扫描controller,指定controller的包,但是view的包下面的注解类就扫描不到了, 所以 com.test.springmvc.handlers 改成 com.test.springmvc就行啦,子目录都能扫描得到 --> <!--下面是 配置扫描 指定目录包 中的 java文件 --> <context:component-scan base-package="com.test.springmvc"></context:component-scan> <!-- 配置视图解析器【多个函数可选择】: 此解析器默认生成InternalResourceView,如果项目添加了jstl.jar包的话就会自动改为生成JstlView; 即如何把 handler 方法返回值解析为实际的物理视图,handler的返回值也可以具体是 /WEB-INF/XXXX/XXX.jsp,这样下面的试图解析器就不需要添加前缀和后缀了 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
1、自定义扫描目录范围表示 扫描指定文件,查看是否 存在 注解。
2、springmvc 配置文件的 视图解析器,告诉了 控制器 返回结果时,应该将页面跳转到 哪里。比如 控制器【第五节介绍】 返回结果 success ,那么跳转页面 应该到 /WEB-INF/views/success.jsp 文件中
四、配置 控制器
在包名 com.test.springmvc.handlers 下
创建 HelloWorld.java
[java]
package com.test.springmvc.handlers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller // spring里面 又名handler 处理器
public class HelloWorld {
/**
* 1、使用RequestMapping 注解来映射 请求的url
* 2、返回值会通过视图解析器解析为实际的物理视图,
* 对于org.springframework.web.servlet.view.InternalResourceViewResolver
* 会做如下解析,prefix + returnVal + suffix 得到实际的物理视图。然后做转发操作。
* 即 WEB-INF/views/success.jsp
*/
@RequestMapping("/helloworld")
public String hello(){
System.out.println("hello world");
return "success";
}
}
[/java]
上面的请求路径为:projectname/helloworld
也可以在类上面多加一个 @RequestMapping 注解,比如 xxx
那么请求路径为 projectname/xxx/helloworld
五、配置 返回结果 页
/WEB-INF/views/success.jsp 编辑如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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"> <title>Insert title here</title> </head> <body> <h4> Success page </h4> </body> </html>
六、启动服务器,输入地址
在配置控制器时,已经 在类HelloWorld 使用了@RequestMapping(“/helloworld”)注解
所以 浏览器 直接输入 ” http://localhost:端口号/工程名/helloworld” 就能看到结果啦
七、补充:配置注解映射器和注解适配器
在配置转发器中,需要添加的注解映射器和注解适配器:
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。
下面是在 配置转发器【即前面提到的dispatcherServlet-servlet.xml】 中,进行编辑的内容:
<!-- 注解映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!-- 注解的适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置 mvc:annotation-driven默认加载很多的参数绑定方法, 比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter 实际开发时使用mvc:annotation-driven --> <!-- <mvc:annotation-driven></mvc:annotation-driven> -->
在实际使用时,不配置注解映射器和注解适配器,也能正常运行。因为MVC有默认配置在核心中的/org/springframework/web/servlet/DispatcherServlet.properties中,有兴趣的同学可以自行查看。
八、非注解方式配置方法
九、国际化配置方法
1、新建i18n文件,存放于src文件夹下面:
i18n.username=Username i18n.password=Password
i18n.username=\u7528\u6237\u540D i18n.password=\u5BC6\u7801
i18n.username=Username i18n.password=Password
2、在转发配置文件中添加:
<!-- 配置国际化资源文件 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="i18n"></property> </bean>
3、在请求页面jsp中:添加
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<body> <fmt:message key="i18n.username" ></fmt:message> <fmt:message key="i18n.password" ></fmt:message> </body>
国际化问题特别注意点:<fmt:message>标签只能出现在转发页面中,不能出现在请求页面中【请求页面我测试了一下,出现乱码】原因是在转发配置页中,指定了国际化配置文件啊,必须在转发过程中才会生效啊 !!!
十、配置无控制器直接转发
一般情况下,请求页需要由控制器处理后,才能转发到目标页面。但是也可以编辑转发配置文件,实现不经过控制器而直接转发到目标页面。【本质上就是在这里配置了一个默认控制器,path代表控制器的@RequestMaping ,view-name代表 控制器的返回值】
<!-- 配置直接转发的页面 --> <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. --> <mvc:view-controller path="/success" view-name="success"/>
但是上面的配置会造成,那些所有需要经过控制器转发的url请求,全部失效无法访问。为了解决这个问题,需要在转发配置页 继续配置如下:
<mvc:annotation-driven></mvc:annotation-driven>
十一、请求静态资源问题
因为前面测试过了,如果请求路径是xxx.jsp是可以直接显示的。如果是XXX,就会交由handler处理。
为了能够在网页中,加载js和css,请求静态资源,所以需要 编辑 转发配置器。
<!-- default-servlet-handler 将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler, 它会对进入 DispatcherServlet 的请求进行筛查, 如果发现是没有经过映射的请求, 就将该请求交由 WEB 应用服务器默认的 Servlet 处理. 如果不是静态资源的请求,才由 DispatcherServlet 继续处理 一般 WEB 应用服务器默认的 Servlet 的名称都是 default. 若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定 --> <mvc:default-servlet-handler/> <!-- 前面的 mvc:default-servlet-handler 可以解决静态资源了,但是让其他经过handler的请求,又失效了,所以配置了下面的 mvc:annotation-driven 来解决问题 --> <mvc:annotation-driven></mvc:annotation-driven>
出现过的问题小结:之前在项目中添加了entity文件,里面有@NotEmpty注解等。这些注解用到了校验jar包,比如 hibernate-validator-5.0.0.CR2.jar
在没有添加这句话 <mvc:annotation-driven></mvc:annotation-driven> 前,一直没有报错,后来加了这句话后报错了。
Caused by: java.lang.NoClassDefFoundError: org/jboss/logging/BasicLogger at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2541) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:858) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1301) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166) at org.hibernate.validator.internal.util.logging.LoggerFactory.make(LoggerFactory.java:29) at org.hibernate.validator.internal.util.Version.<clinit>(Version.java:27) at org.hibernate.validator.internal.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:65) at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41) at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:250) at org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean.afterPropertiesSet(OptionalValidatorFactoryBean.java:40) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ... 28 more
发现是缺少了 jboss-logging的jar包,添加了就行。