在使用spring-mvc过程中遇到很多问题,记录下来方便查看
开发环境如下:
eclipse Oxygen Release (4.7.0)
java1.8
spring 4.3.3
freemarker 2.3.26(这个不是必须的)
maven依赖包如下:
<!-- spring mvc返回json所需依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
<!-- freemarker 引擎,有了这个就不需要使用jstl了,只需要使用freemarker表达式就行了 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.26-incubating</version>
</dependency>
<!-- spring 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<!-- springmvc 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<!-- spring bean 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
web.xml 配置:
<servlet>
<servlet-name>DispatcherServlet</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随Servletp容器一起启动。 -->
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> <!--会拦截URL中带“/”的请求。 -->
</servlet-mapping>
spring-mvc配置:
<mvc:annotation-driven />
<context:component-scan base-package="canxing.web" />
spring-mvc配置freemarker:
<!-- freemarker 配置文件 -->
<!-- freemarker config -->
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
</bean>
<!-- View resolvers can also be configured with ResourceBundles or XML files.
If you need different view resolving based on Locale, you have to use the
resource bundle resolver. -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
</bean>
JSONController.java:
@Controller
public class JSONController {
@RequestMapping(path="/json",produces="application/json")
public @ResponseBody User index() {//使用@RespnseBody将返回的对象转化为JSON数据
System.out.println("index start");
User user = new User();
user.setUsername("canxing");
user.setPassword("123");
System.out.println("index end");
return user;
}
@RequestMapping(path="/")
public String test() {
return "test";
}
}
User.java:
//类不需要进行处理,只是一个普通的pojo类
public class User{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
test.flt:
1 | <html> |
寻找答案中遇到的问题
- 依赖问题,spring 默认的对象转化为 json 的 jar 包依赖,网上多是直接使用并没有说明依赖
- 还是依赖问题,spring 和 jackson 之间版本的兼容性太差,稍微更改以下 jackson 或者 spring 的版本就会导致 NoSuchMethodError 错误,据说这里可以看见版本支持,但是看不懂