发表于: 2017-12-31 14:58:23
1 583
今天完成的事
跑了个json的demo。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// write your code here
User user = new User();
user.setName("小高");
user.setAge(13);
user.setBirthday(new Date(20l * 366 * 24 * 3600 * 1000));
Car car = new Car();
car.setColor("黄色");
car.setCarname("保时捷");
user.setCar(car);
Map map = new HashMap();
map.put("aa", "this is aa");
map.put("bb", "this is bb");
map.put("cc", "this is cc");
user.setMap(map);
List list = new ArrayList() {
};
list.add("普洱");
list.add("大红袍");
user.setList(list);
Set set = new HashSet();
set.add("篮球");
set.add("足球");
set.add("乒乓球");
user.setSet(set);
ObjectMapper mapper=new ObjectMapper();
String json=mapper.writeValueAsString(user);
System.out.println(json);
Map m=mapper.readValue(json,Map.class);
System.out.println("name:"+m.get("name").getClass().getName());
System.out.println("age:"+m.get("age").getClass().getName());
System.out.println("birthday:"+m.get("birthday").getClass().getName());
System.out.println("cat:"+m.get("car").getClass().getName());
System.out.println("map:"+m.get("map").getClass().getName());
System.out.println("list:"+m.get("list").getClass().getName());
System.out.println("set:"+m.get("set").getClass().getName());
json=mapper.writeValueAsString(m);
System.out.println(json);
User u=mapper.readValue(json,User.class);
System.out.println(u);
byte[] data=mapper.writeValueAsBytes(u);
System.out.println(data);
}
}
遇到的问题
在刚接触spring mvc的时候,没有仔细研究过url-pattern,在使用下属配置的时候,出现了问题
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 1
- 2
- 3
- 4
具体的问题是jsp页面的资源访问不到,原来上述的配置会拦截以*.jsp等结尾的url连接,并交给dispather处理,如果controller没有配置相应的方法,就会出现资源访问不到的错误,于是,我在网上查到了下述的方法,来解决这个问题,即在spring mvc的spring-servlet.xml文件中添加如下的代码
<!-- 由于web.xml中设置是:由SpringMVC拦截所有请求,于是在读取静态资源文件的时候就会受到影响(说白了就是读不到) -->
<!-- 经过下面的配置,该标签的作用就是:所有页面中引用"/js/**"的资源,都会从"/resources/js/"里面进行查找 -->
<!-- 我们可以访问http://IP:8080/xxx/js/my.css和http://IP:8080/xxx/resources/js/my.css对比出来 -->
<mvc:resources mapping="/js/**" location="/resources/js/"/>
<mvc:resources mapping="/css/**" location="/resources/css/"/>
<mvc:resources mapping="/WEB-INF/**" location="/WEB-INF/"/>
- 1
- 2
- 3
- 4
- 5
- 6
自认为解决了问题的我,则发现,当我使用一个form表单,通过POST方法来提交数据,会出现问题,后台相应的controller方法如下:
@RequestMapping(value="/dologin", method=RequestMethod.POST) public String login(String userNm, String userPwd)
{
System.out.println(userNm); return "login";
}
- 1
- 2
- 3
- 4
- 5
- 6
视图解析器配置如下:
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
- 1
- 2
- 3
- 4
- 5
按照我对spring mvc的理解,返回的“login”应该会被解析为login.jsp页面,并返回给前台,但是,这里就出现了一个错误:
Request method ‘POST’ not supported
经过我实验发现,这里返回的“login”会以url链接的形式交给dispatcher来处理,所以出现了这个问题。但是如果将@RequestMapping(value="/dologin", method=RequestMethod.POST)
中的method设置为GET方法,表单提交数据的形式也改为get,则不会出现这个错误,即“login”不会被交给dispatcher,而是会被解析为login.jsp。
解决方法
由于配置<url-pattern>/*</url-pattern>
这种格式是为了防止用户能够直接访问jsp资源,所以我将所有的jsp页面都放在WEB-INF路径 下,这样用户就不能直接访问jsp页面资源,同时,将<url-pattern>/*</url-pattern>
改为<url-pattern>/</url-pattern>
,这两种格式的区别是前者拦截所有的url链接,后者则不拦截*.jsp这种形式的链接,这样当我使用一个form表单,通过POST方法来提交数据的时候,后台方法返回的“login”会被正确解析为login.jsp页面,返给前台。
收获
颇丰
明天的计划
设计表
评论