`
零度弥合
  • 浏览: 20629 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

【自虐】1.1加入JDBC完成增删改查

 
阅读更多

写的很差,有兴趣就跑跑项目吧,在附件中,文章可看性很低。

环境:win7 MyEclipse10 jdk1.6 tomcat7 SpringMVC2.5 MySQL

目标:CRUD

 

从前文http://340413629-qq-com.iteye.com/blog/2032793修改而来,目的是使用增加数据库的操作

 

加入jdbcUtil类封装取得连接和释放资源的操作

package cn.zinue100.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class JdbcUtils {
	private static final String url = "jdbc:mysql://localhost:3306/test";
	private static final String username = "root";
	private static final String password = "root";

	private JdbcUtils() {
	}

	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	public static Connection getConnection() throws SQLException {
		return DriverManager.getConnection(url, username, password);
	}

	public static void free(ResultSet resultSet, Statement statement,
			Connection connection) {
		try {
			if (resultSet != null)
				resultSet.close();
		} catch (SQLException e) {
			throw new ExceptionInInitializerError(e);
		} finally {
			try {
				if (statement != null)
					statement.close();
			} catch (SQLException e) {
				throw new ExceptionInInitializerError(e);
			} finally {
				try {
					if (connection != null)
						connection.close();
				} catch (SQLException e) {
					throw new ExceptionInInitializerError(e);
				}
			}
		}
	}
}

 这个类指使用了释放资源free方法,取得链接是通过配置连接池实现的在web-main.xml中多了如下配置,连接池是什么就不赘述了,这里没有配置最大连接数等等,只是做个样子

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost:3306/test"/>

<property name="username" value="root"/>

<property name="password" value="root"/>

 

</bean>

 

另外还多了<bean id="userDaoImpl" class="cn.zinue100.dao.jdbcImpl.UserDaoImpl" />这一配置

这是spring ioc 控制翻转,也叫依赖注入的体现,配置好这个bean之后在userConrol中加入变量

@Resource
private UserDao userDao;

 生成getter setter方法之后容器自动new dao

 

多加了三个jar包,在附件中有:

mysql-connector-java-5.1.27-bin.jar

commons-dbcp.jar

commons-pool.jar

 

其他的就不赘述了

主要是想学springmvc的跳转,我自己来总结一下:

贴出UserControl代买

 

package cn.zinue100.controller;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.annotation.Resource;
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.dao.UserDao;
import cn.zinue100.vo.User;

@Controller
@RequestMapping(value = "/user")
@SessionAttributes(value = "loginUser")
public class UserController {

	@Resource
	private UserDao userDao;
	private User user;
	Map<String, User> users = new LinkedHashMap<String, User>();

	@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";
		userDao.addUser(user);
		init(model, user);
		return "redirect:/user/list.htm";
	}

	@RequestMapping(value = "/delete/{username}.htm", method = RequestMethod.GET)
	public String delete(@PathVariable String username) {
		user=new User();
		user.setUsername(username);
		userDao.deleteUser(user);
		return "redirect:/user/list.htm";
	}

	@RequestMapping(value = "/update/{username}.htm", method = RequestMethod.GET)
	public String update(@PathVariable String username, Model model) {
		User user = userDao.getUserByName(username);
		model.addAttribute("user", user);
		return "user/updateuser";
	}

	@RequestMapping(value = "/update/{username}.htm", method = RequestMethod.POST)
	public String update(@PathVariable String username, @Valid User user,BindingResult br) {
		if (br.hasErrors()) 
			return "/update/{username}.htm";
		userDao.updateUser(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 null;
	}

	@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) {
		User user = userDao.getUserByName(username);
		if (user == null || user.getUsername() == null)
			throw new RuntimeException("用户名不存在!");
		if (user.getPassword() == null || !user.getPassword().equals(password))
			throw new RuntimeException("密码不正确");
		model.addAttribute("loginUser", user);
		return "redirect:/user/list.htm";
	}

	@ExceptionHandler(value = { RuntimeException.class })
	public String handlerException(Exception ex, HttpServletRequest req) {
		System.out.println("UserController.handlerException invok...");
		req.setAttribute("ex", ex);// 把异常放入request请求中
		return "error";// 转到error页面
	}

	@RequestMapping(value = "/redir.htm")
	public String redir(Model model, RedirectAttributes ra) {
		System.out.println("UserController.redir invok...");
		// model.addAttribute("movie", "海贼王");//使用这种方式在重定向是传递不了的
		ra.addFlashAttribute("movie", "海贼王");// 使用这种可以
		return "redirect:/user/list.htm";
	}

	@RequestMapping(value = "upload.htm", method = RequestMethod.GET)
	public String uploadPhoto() {
		System.out.println("UserController.uploadPhoto invok...");
		return "user/upload";
	}

	@RequestMapping(value = "upload.htm", method = RequestMethod.POST)
	public String uploadPhoto(MultipartFile photo, Model model,
			HttpServletRequest req) {
		System.out.println("UserController.init invok...");
		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) {
		System.out.println("UserController.init invok...");
		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";
	}

	public UserDao getUserDao() {
		return userDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
	private void init(Model model, User user) {
		System.out.println("UserController.init invok...");
		Map<String, User> users = userDao.getUsers();
		model.addAttribute("users", users);
	}
}
 

 

 @RequestMapping(value = "/user")

就是说这个Control所有action都用user前缀

也就是说在一个静态页面href="user/login.htm就可以进这个action

 

@RequestMapping(value = "/login.htm", method = RequestMethod.GET)
public String login() {
	return "/user/login";
}
 

 

这个方法是从静态页面跳转的login页面的,我的jsp在user包下,名字叫login.jsp。很显然springmvc把jsp页面映射成别的了,只要名字匹配就可以跳转

在jsp页面有action="login.htm"于是跳转到了以下方法

 

@RequestMapping(value = "/login.htm", method = RequestMethod.POST)
public String login(String username, String password, Model model) {
	User user = userDao.getUserByName(username);
	if (user == null || user.getUsername() == null)
		throw new RuntimeException("用户名不存在!");
	if (user.getPassword() == null || !user.getPassword().equals(password))
		throw new RuntimeException("密码不正确");
	model.addAttribute("loginUser", user);
	return "redirect:/user/list.htm";
}
 

 

 单这个方法和前一个名字一样只是参数不同,那springmvc是怎么找过来对的呢??我觉得是根据参数和jsp文档中input的name去匹配

 

	 	username:<input type="text" name="username"/><sf:errors path="username"/><br/>
	 	password:<input type="password" name="password"/><sf:errors path="password"/><br/>
 

 

 第三个参数model是什么呢,model在org.springframework.ui.Model;包中,所以我觉得model就是封装了页面信息,model放在哪里??我觉得应该在session中

 

model.addAttribute("loginUser", user);
return "redirect:/user/list.htm";
 

 

 第二句代码转发到以htm结尾的url去了,很显然验证完用户名密码之后,要去初始化一览页面的信息,将跳转到control类的另一个方法

第一句往session中放了一个值,这个值在一览页面时这样显示的${loginUser.username}也就是说直接变量名key值,然后取属性,真是方便,目前不知道实现机制是什么,jstl还是ognl???

刚才说到跳转到list.htm,那贴出这个方法

 

	@RequestMapping(value = "/list.htm")
	public String list(Model model) {
		init(model, null);
		return "user/userlist";
	}
 初始化一览页面在很多地方用到,所以封装起来

 

 

private void init(Model model, User user) {
	Map<String, User> users = userDao.getUsers();
	model.addAttribute("users", users);
}
 我本来getUsers返回的是List,可是spring不允许我往model中放进list,必须放map。从这里可以看出model的实现机制
看一下我写的userlist页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="cn.zinue100.vo.User"%>
<%@page import="java.util.Map.Entry"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>userlist</title>
</head>

<body>
	<a href="add.htm">Add</a>&nbsp;&nbsp;${loginUser.username
	}&nbsp;${movie }
	<br />
	<table border="1">
		<%
			Map<String, User> users = (Map<String, User>) request
					.getAttribute("users");
			if (users != null) {
				for (User user : users.values()) {
		%>
		<tr>
			<td><%=user%></td>
			<td>&nbsp;<a href="update/<%=user.getUsername()%>.htm">修改</a>
			</td>
			<td>&nbsp;<a href="delete/<%=user.getUsername()%>.htm">删除</a>
			</td>
		</tr>
		<%
			}
			}
		%>
	</table>
	<a href="login.htm">退出</a>
	<br />
</body>
</html>
 

 

另起一个话头

码农首先关心的是,怎么从control跳转到jsp,怎么从jsp跳转到control,怎么传值

从control跳转到jsp刚才说过了,在control中返回值是个字符串,把jsp文件名去掉后缀.jsp,前面加路径,放进这个字符串就行

jsp跳转到control,在action中配置,如果没配置,那就是跟自己文件名相同的action

 

那怎么传值呢??

来看从一览页面去更新页面这个方法

@RequestMapping(value = "/update/{username}.htm", method = RequestMethod.GET)
public String update(@PathVariable String username, Model model) {
	User user = userDao.getUserByName(username);
	model.addAttribute("user", user);
	return "user/updateuser";
}

 

这是get方法的传值,直接在url上拼,因为注解了@PathVariable,所以取得时候直接用名称取,那post方法呢???

	@RequestMapping(value = "/update/{username}.htm", method = RequestMethod.POST)
	public String update(@PathVariable String username, @Valid User user,BindingResult br) {
		if (br.hasErrors()) 
			return "/update/{username}.htm";
		userDao.updateUser(user);
		return "redirect:/user/list.htm";
	}

 

 我没有把user这个对象传递过来,那spring怎么知道的??因为这是我在类中定义的user变量,不知道这种方法是不是正确的。

 

结论是从control往页面传递值是放进model中,页面根据属性名取值,jsp往control传值是直接映射进方法参数中的

 

 其他代码在附件中,lib包太大,我只把新加的放进lib包单独放上来

其他包去前一篇博文中找吧

 

 

 

  • lib.zip (978.3 KB)
  • 下载次数: 0
分享到:
评论

相关推荐

    【自虐1.0】Spring MVC增删改查

    标题中的“【自虐1.0】Spring MVC增删改查”表明这是一篇关于Spring MVC框架基础操作的教程,作者可能以一种幽默的方式介绍了如何使用Spring MVC进行基本的CRUD(创建、读取、更新、删除)操作。Spring MVC是Spring...

    【自虐1.2】Srping+MyBatis完成CRUD

    【自虐1.2】Spring+MyBatis完成CRUD 在现代Web开发中,Spring框架和MyBatis作为两大核心组件,常被用来构建高效、灵活的数据访问层。本篇将详细介绍如何利用Spring和MyBatis实现基本的CRUD(创建Create、读取Read、...

    jx自虐狂0.0.3beta

    0.0.3beta 1.开启了更新说明 2.开始自虐之前和之后有了提示 3.无法再调节窗口大小 4.对界面进行了细微修改

    jx自虐狂0.0.4beta源码

    与jx自虐狂0.0.4beta相配套的源码

    jx自虐狂0.0.4beta

    1.将.net框架更改为4.5.1,32位和64位系统通用 2.解决了按钮文本显示不全的问题 3.略微调整了某些界面的布局 4.软件在打开后不会初始选择提示文本了 5.现在自虐还会在桌面生成文本文件 6.一些其它的修改

    jx自虐狂0.0.1beta

    本人菜鸟闲着没事,自己写的软件,功能完全是作死型

    jx自虐狂0.0.1beta源码

    【标题】"jx自虐狂0.0.1beta源码" 提供的是一个名为 "jx自虐狂" 的软件项目的早期版本——0.0.1 beta的源代码。这个项目可能由一位独立开发者或小团队创建,因为它的标签被标记为“个人作品源码”,暗示它不是来自...

    jx自虐狂0.0.3beta源码

    《jx自虐狂0.0.3beta源码》是一个个人作品的源代码包,主要包含用于开发和编译的项目解决方案文件以及相关的配置文件。这个源码包旨在为开发者提供一个参考或学习的平台,帮助他们理解项目的构建结构、编程逻辑以及...

    原创小游戏,爱自虐的小鸟,请振翅高飞!-电路方案

    分享在网友看到网友开源的一个自编LabVIEW版自虐的小鸟小游戏,记得这款游戏曾风靡一时,手残党的我从未玩过一分钟,实在是很惭愧啊!希望能借助这个多练练,哈哈! 游戏界面见下面截图: 具体的设计资料,放在附件...

    上海周边徒步旅行十条经典路线.docx

    - **难度系数**:自虐指数4,人文景观指数8。 ### 开化古田山原始森林—钱江源 - **地理位置**:位于浙江省开化县齐溪镇,为钱塘江源头。 - **生态环境**:植被丰富,山峦起伏,自然景观秀美。 - **自然保护**:...

    心理疏导谈心内容准备.doc

    通过识别并改变这种思维模式,建立健康的自我评价,可以帮助个体建立自信,摆脱自虐心理。 综上所述,该文档提供了丰富的心里调适和自我成长策略,旨在帮助读者更好地应对心理压力,提升自我认知,以及克服可能导致...

    c指针用法总结

    在C语言中,指针是其强大特性的核心之一,它可以用来间接访问和操作内存中的数据。本篇文章将深入探讨C指针的用法,包括指针与数组的关系、指针的不同层次以及复杂的多维指针表达式。 首先,我们要明白指针与数组在...

    Swift代码实现的自虐小游戏 The-Red-Button-Swift(iOS源代码)

    来源: github/The-Red-Button-S Licence: MIT 作者: Liiiiin 按钮颜色会不停变换,按到蓝色加分,按到红色游戏结束。 灵感来自美国App Store上受欢迎游戏Don't tap the red button 标签: 游戏

    算法导论 Introduction to Algorithm 3rd edtion

    算法导论你没看过你好意思说你是搞CS的?...4、过于自信的时候用于自虐(看看红黑树的代码什么的) 以上4种状态,如能持续一年以上,好了,计算机的算法类面试,闭着眼睛就能过了。 (可惜俺还没看到半年呢~)

    妙招平息顾客怒气2版.pptx

    例如,软件崩溃可能会导致用户无法完成任务,而技术支持的延迟回应则可能增加用户的挫败感。 2. **脆弱自虐型** 这类客户可能因为自身的技术不熟练或对产品不熟悉而感到无助。IT专业人员需要展现出耐心和理解,用...

    Masochist Tabs-crx插件

    自虐标签的开发是为了使用更强力的方式来帮助教授更好的标签管理。 自虐标签的开发是为了使用更强力的方式来帮助教授更好的标签管理。 如果选项卡太多,它会通过删除窗口来做到这一点! 设置所需的选项卡数量作为...

Global site tag (gtag.js) - Google Analytics