SSM水果商城
项目介绍
因为我先学过了ssm的基础知识,所以找了个ssm项目来练练手,加深对框架的理解。
由于我也是手敲所以暂时没有感觉到与javaweb比优势在哪,但是了解过之后,框架之所以是框架,个人觉得是因为它有它一套可以通用的结构,把许多功能解耦合放到一个文件夹下更加方便调用,大部分项目都可以直接使用base层,再加上代码生成器的使用,节省了我们许多工作,只需要写写controller层,把代码生成器生成的架构内容补充完整。
pom依赖的配置一开始也是不知道需要哪种,但是使用的多了,以后写项目也是可以拿来用的。
项目视频演示
水果商城演示视频
项目过程中新遇到的知识和问题
- Serializable接口的意义和用法
Serializable接口是启用其序列化功能的接口。实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。
这个介绍非常的不接地气,于是我与去看了几篇博客,有一个小姐姐的博客引起了我的注意,她是这样理解的:
序列化的过程,就是一个“freeze”的过程,它将一个对象freeze(冷冻)住,然后进行存储,等到再次需要的时候,再将这个对象de-freeze就可以立即使用。
我们以为的没有进行序列化,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。
存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本,便于数据传输,尤其是在远程调用的时候!
其实说了这么多,想表达的意思就是:
Serializable接口是一个里面什么都没有的接口
它的源代码是public interface Serializable{},即什么都没有。
如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错排了几天也没解决,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序列化,序列化就是变成二进制流,比如云计算、Hadoop,特别是Hadoop完全就是分布式环境,那么就要涉及到对象要在网络中传输,里面的全是二进制流,当然你来做这个序列化操作也可以,但是这个类里面可能还有一个类,如果你把外面的类对象Person变成二进制,那么里面也要序列化(这要用到深度遍历,很麻烦),干脆告诉JVM,让他来帮你做。
serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。
- redirect重定向流程
- response.sendRedirect重定向跳转
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })
public ModelAndView testredirect(HttpServletResponse response){
response.sendRedirect("/index");
return null;
}
- ViewResolver直接跳转
不带参数
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })
public String testredirect(HttpServletResponse response){
return "redirect:/index";
}
带参数
@RequestMapping("/testredirect")
public String testredirect(Model model, RedirectAttributes attr) {
attr.addAttribute("test", "51gjie");//跳转地址带上test参数
attr.addFlashAttribute("u2", "51gjie");//跳转地址不带上u2参数
return "redirect:/user/users";
}
使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面,如上代码即为http:/index.action?test=51gjie
使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。你会发现redirect后的jsp页面中b只会出现一次,刷新后b再也不会出现了,这验证了上面说的,b被访问后就会从session中移除。对于重复提交可以使用此来完成.
spring mvc设置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect=true,这样可以提高效率,避免不必要的检索。
-
ModelAndView重定向
不带参数
@RequestMapping(value="/restredirect",method = { RequestMethod.POST, RequestMethod.GET })
public ModelAndView restredirect(String userName){
ModelAndView model = new ModelAndView("redirect:/main/index");
return model;
}
带参数
@RequestMapping(value="/toredirect",method = { RequestMethod.POST, RequestMethod.GET })
public ModelAndView toredirect(String userName){
ModelAndView model = new ModelAndView("/main/index");
model.addObject("userName", userName); //把userName参数带入到controller的RedirectAttributes
return model;
}
- Servlet.init() for servlet springMVC threw exception
本地运行一点毛病没有
部署到服务器上就出现这个错误…
解决方案:
- 把hibernate-validator换成4版本的
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
- 把javax.validation更新到较高版本
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
完美解决!