这是项目的包图
我只是想颠三倒四,然后把该记住的知识记住
环境:win7 MyEclipse10 jdk1.6 tomcat7 SpringMVC2.5
目标:CRUD
本文是根据这个小例子修改而来,感谢这位前辈
http://download.csdn.net/download/wxwzy738/5224307
总结的肯定有不对,不完整的地方,权当笔记。
首先是web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>hello</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/web-main.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping> </web-app>
org.springframework.web.servlet.DispatcherServlet
这是springmvc的前端控制器,也就是说所有请求都将在这里找到url
servlet-mapping中定义的是路径,熟悉servlet的都知道,这里表示以url结尾的请求将进入控制器
init-param大概是服务器初始化时会加载到内存的配置,contextConfigLocation这个应该是spring容器会去读的配置文件。
web-main.xml文件
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 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"> <mvc:annotation-driven/> <mvc:resources location="/resources/" mapping="/resources/**"/> <context:component-scan base-package="cn.zinue100.controller"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="5000000"></property> </bean> </beans>
<mvc:annotation-driven/>
大概是把spring默认配置成注解,而不是用xml
<mvc:resources location="/resources/" mapping="/resources/**"/>
这样根目录下面的resource的文件(.css,.js等)就不会被spring的DispatchServlet进行过滤
<context:component-scan base-package="cn.zinue100.controller"/>
配置注解扫描的包路径,也就是说,这个文件夹下注解中的路径,将起作用
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
配置action中返回的视图配置
这个配置是controller向jsp跳转的配置,在jsp中海油自定义标签,但我现在不太懂这个配置,姑且放在一边
来看实体类吧
package cn.zinue100.bean; import javax.validation.constraints.Size; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.NotEmpty; public class User { private String username; private String password; private String email; public User(){ } public User(String username, String password, String email) { this.username = username; this.password = password; this.email = email; } @NotEmpty(message = "用户名不能为空") public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @NotEmpty(message = "密码不能为空") @Size(min = 4, max = 8, message = "密码在4~8位之间") public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @NotEmpty(message = "email不能为空") @Email(message = "email格式不正确") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString(){ return username+"#"+password+"#"+email; } }
@RequestMapping(value = "/hello")
表示要访问这个action的时候都要加上这个/hello路径
HelloController
package cn.zinue100.controller; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller //@RequestMapping(value = "/hello") public class HelloController { @RequestMapping(value = "/hello.htm") public String hello(int id){ System.out.println("hello action:"+id); return "redirect:/index.jsp"; } @RequestMapping(value = "/hello1.htm") public String hello(int id,Map<String,Object> map){ System.out.println("hello1 action:"+id); map.put("name", "huangjie"); return "hello"; } @RequestMapping(value = "/hello2.htm") public String hello2(int id,Model model){ System.out.println("hello2 action:"+id); model.addAttribute("name", "huangjie"); model.addAttribute("ok"); return "hello"; } @RequestMapping(value = "/hello3.htm") public String hello3(HttpServletRequest request){ String id = request.getParameter("id"); System.out.println("hello3 action:"+id); return "hello"; } }
接收参数getParameter()的时候:
如果地址栏/springmvc/hello.htm上面没有传递参数,那么当id为int型的时候会报错,当id为Integer的时候值为null
当地址栏为/springmvc/hello.htm?id=10的时候,action中有三种接收方式
1、String hello(@RequestParam(value = "userid") int id),这样会把地址栏参数名为userid的值赋给参数id,如果用地址栏上的参数名为id,则接收不到
2、String hello(@RequestParam int id),这种情况下默认会把id作为参数名来进行接收赋值
3、String hello(int id),这种情况下也会默认把id作为参数名来进行接收赋值
注:如果参数前面加上@RequestParam注解,如果地址栏上面没有加上该注解的参数,例如:id,那么会报404错误,找不到该路径
其中
第一个方法不能重定向web-info里面的文件,而且需要写上绝对路径
第二个方法是返回页面参数的第一种方式,在形参中放入一个map
第三个方法是回页面参数的第二种方式,在形参中放入一个Model
到request,response,session等,只要在方法形参中声明参数即可
UserController.java
package cn.zinue100.controller; import java.io.File; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import org.apache.commons.io.FileUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import cn.zinue100.bean.User; @Controller @RequestMapping(value = "/user") @SessionAttributes(value = "loginUser") public class UserController { Map<String, User> users = new LinkedHashMap<String, User>(); public UserController() { System.out.println("初始化...."); users.put("zinue101", new User("zinue101", "123", "zinue101@qq.com")); users.put("zinue102", new User("zinue102", "123", "zinue102@qq.com")); users.put("zinue103", new User("zinue103", "123", "zinue103@qq.com")); users.put("zinue104", new User("zinue104", "123", "zinue104@qq.com")); } public void init(Model model, User user) { if (user != null) { users.put(user.getUsername(), user); } model.addAttribute("users", users); } @RequestMapping(value = "/list.htm") public String list(Model model) { init(model, null); return "user/userlist"; } @RequestMapping(value = "/add.htm", method = RequestMethod.GET) public String add(Model model) { model.addAttribute(new User()); return "user/adduser"; } @RequestMapping(value = "/add.htm", method = RequestMethod.POST) public String add(@Valid User user, BindingResult binding, Model model) { if (binding.hasErrors()) { return "user/adduser"; } init(model, user); return "redirect:/user/list.htm"; } @RequestMapping(value = "/{username}.htm", method = RequestMethod.GET) public String show(@PathVariable String username, Model model) { User user = users.get(username); model.addAttribute("user", user); return "user/show"; } @RequestMapping(value = "/delete/{username}.htm", method = RequestMethod.GET) public String delete(@PathVariable String username) { users.remove(username); return "redirect:/user/list.htm"; } @RequestMapping(value = "/update/{username}.htm", method = RequestMethod.GET) public String update(@PathVariable String username, Model model) { User user = users.get(username); model.addAttribute("user", user); return "user/adduser"; } @RequestMapping(value = "/update/{username}.htm", method = RequestMethod.POST) public String update(@PathVariable String username, @Valid User user, BindingResult br) { if (br.hasErrors()) { return "/user/adduser"; } users.put(user.getUsername(), user); return "redirect:/user/list.htm"; } @ResponseBody @RequestMapping(value = "/{username}.htm", params = "json") public User showJson(@PathVariable String username, Model model) { System.out.println("username:" + username); return users.get(username); } @RequestMapping(value = "/login.htm", method = RequestMethod.GET) public String login() { return "/user/login"; } @RequestMapping(value = "/login.htm", method = RequestMethod.POST) public String login(String username, String password, Model model) { if (!users.containsKey(username)) { throw new RuntimeException("用户名不存在!"); } if (!password.equals(users.get(username).getPassword())) { throw new RuntimeException("密码不正确"); } // 存放入session中,因为前面已经加了@SessionAttributes(value = "loginUser")注解 model.addAttribute("loginUser", users.get(username)); return "redirect:/user/list.htm"; } @ExceptionHandler(value = { RuntimeException.class }) public String handlerException(Exception ex, HttpServletRequest req) { req.setAttribute("ex", ex);// 把异常放入request请求中 return "error";// 转到error页面 } @RequestMapping(value = "/redir.htm") public String redir(Model model, RedirectAttributes ra) { // model.addAttribute("movie", "海贼王");//使用这种方式在重定向是传递不了的 ra.addFlashAttribute("movie", "海贼王");// 使用这种可以 return "redirect:/user/list.htm"; } @RequestMapping(value = "upload.htm", method = RequestMethod.GET) public String uploadPhoto() { return "user/upload"; } @RequestMapping(value = "upload.htm", method = RequestMethod.POST) public String uploadPhoto(MultipartFile photo, Model model, HttpServletRequest req) { System.out.println(photo.getContentType()); System.out.println(photo.getName()); System.out.println(photo.getOriginalFilename()); String realpath = req.getSession().getServletContext() .getRealPath("/upload/"); System.out.println(realpath); try { FileUtils.copyInputStreamToFile(photo.getInputStream(), new File( realpath + "/" + photo.getOriginalFilename())); } catch (IOException e) { e.printStackTrace(); } model.addAttribute("message", "上传成功"); return "user/upload"; } @RequestMapping(value = "uploads.htm", method = RequestMethod.POST) public String uploadPhoto( @RequestParam(required = false) MultipartFile[] photos, Model model, HttpServletRequest req) { String realpath = req.getSession().getServletContext() .getRealPath("/upload/"); try { for (MultipartFile photo : photos) { if (photo.isEmpty()) continue; FileUtils.copyInputStreamToFile(photo.getInputStream(), new File(realpath + "/" + photo.getOriginalFilename())); } } catch (IOException e) { e.printStackTrace(); } model.addAttribute("message", "上传成功"); return "user/upload"; } }
SessionAttributes(value = "loginUser")
写上这个注解的话那么在Model中进行添加key为loginUser的时候会默认添加到session中
我的初步理解Model这个对象就对应页面的dom树。如果页面有对象那么必须传,不然空指针
返回的字符串中
如果redirect打头就是重定向,如果没有就是转发
别的不贴了,放附件中吧
相关推荐
标题中的“【自虐】1.1加入JDBC完成增删改查”表明这是一个关于学习或实践JDBC(Java Database Connectivity)技术的教程,可能是通过一个具有挑战性的方式来讲解,作者可能以一种自嘲的方式表达了深入理解JDBC的...
0.0.3beta 1.开启了更新说明 2.开始自虐之前和之后有了提示 3.无法再调节窗口大小 4.对界面进行了细微修改
与jx自虐狂0.0.4beta相配套的源码
1.将.net框架更改为4.5.1,32位和64位系统通用 2.解决了按钮文本显示不全的问题 3.略微调整了某些界面的布局 4.软件在打开后不会初始选择提示文本了 5.现在自虐还会在桌面生成文本文件 6.一些其它的修改
【自虐1.2】Spring+MyBatis完成CRUD 在本文中,我们将深入探讨如何结合Spring框架和MyBatis轻量级持久层框架来实现数据库的基本操作,包括创建(Create)、读取(Read)、更新(Update)和删除(Delete),简称为...
本人菜鸟闲着没事,自己写的软件,功能完全是作死型
【标题】"jx自虐狂0.0.1beta源码" 提供的是一个名为 "jx自虐狂" 的软件项目的早期版本——0.0.1 beta的源代码。这个项目可能由一位独立开发者或小团队创建,因为它的标签被标记为“个人作品源码”,暗示它不是来自...
《jx自虐狂0.0.3beta源码》是一个个人作品的源代码包,主要包含用于开发和编译的项目解决方案文件以及相关的配置文件。这个源码包旨在为开发者提供一个参考或学习的平台,帮助他们理解项目的构建结构、编程逻辑以及...
分享在网友看到网友开源的一个自编LabVIEW版自虐的小鸟小游戏,记得这款游戏曾风靡一时,手残党的我从未玩过一分钟,实在是很惭愧啊!希望能借助这个多练练,哈哈! 游戏界面见下面截图: 具体的设计资料,放在附件...
- **难度系数**:自虐指数4,人文景观指数8。 ### 开化古田山原始森林—钱江源 - **地理位置**:位于浙江省开化县齐溪镇,为钱塘江源头。 - **生态环境**:植被丰富,山峦起伏,自然景观秀美。 - **自然保护**:...
通过识别并改变这种思维模式,建立健康的自我评价,可以帮助个体建立自信,摆脱自虐心理。 综上所述,该文档提供了丰富的心里调适和自我成长策略,旨在帮助读者更好地应对心理压力,提升自我认知,以及克服可能导致...
在C语言中,指针是其强大特性的核心之一,它可以用来间接访问和操作内存中的数据。本篇文章将深入探讨C指针的用法,包括指针与数组的关系、指针的不同层次以及复杂的多维指针表达式。 首先,我们要明白指针与数组在...
来源: github/The-Red-Button-S Licence: MIT 作者: Liiiiin 按钮颜色会不停变换,按到蓝色加分,按到红色游戏结束。 灵感来自美国App Store上受欢迎游戏Don't tap the red button 标签: 游戏
算法导论你没看过你好意思说你是搞CS的?...4、过于自信的时候用于自虐(看看红黑树的代码什么的) 以上4种状态,如能持续一年以上,好了,计算机的算法类面试,闭着眼睛就能过了。 (可惜俺还没看到半年呢~)
自虐标签的开发是为了使用更强力的方式来帮助教授更好的标签管理。 自虐标签的开发是为了使用更强力的方式来帮助教授更好的标签管理。 如果选项卡太多,它会通过删除窗口来做到这一点! 设置所需的选项卡数量作为...
本源码是一个简单的C#版美女贪吃蛇小游戏源码,基于Winform技术制作。控制方向键即可。右侧有记分板,每走一步都记加分。...自虐 6)背景:样式1-5种图案 7)退出:退出游戏 2、[帮助] 1)游戏帮助:游戏的操作说明