一.项目环境
IDE:Eclipse Java EE IDE for Web Developers.
Version: Oxygen.3 Release (4.7.3)
Build id: 20180308-1800
数据库:Oracle11G
easyUI:jQuery EasyUI 1.3.2
其他:见maven pom.xml配置文件
二.创建一个maven web项目
具体步骤见https://blog.csdn.net/ptsx0607/article/details/78749738
三.代码结构:
四. maven方式引入jar包依赖,编写pom.xml文件,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lee</groupId>
<artifactId>MSSMDemo001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- spring版本号 -->
<spring.version>4.0.2.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.2.6</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<scope>test</scope>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- oracle数据库驱动包 ,首次添加会报错,是因为oracle的ojdbc.jar是收费的,
所以maven的中央仓库中没有这个资源,只能通过配置本地库才能加载到项目中去。
具体操作是将下载好的ojdbc6.jar(本项目根目录放了一个)复制到系统默认的用户目录下,我的用户目录是H:\programsetup2018\apache-maven-3.5.3\bin,然后在该目录下打开命令窗口,
然后输入如下命令:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=ojdbc6.jar
回车后出现build success即为成功。
-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSTL标签类 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- 映入JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<!-- 上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<!-- json解析包 ,必须要指定jdk版本,不然会报错-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier><!--指定jdk版本-->
</dependency>
</dependencies>
</project>
保存后,联网状态下自动下载jar包到本地私服,其中几个关键包引入时会报错,此处加入了注释,可以看一下。
五. 后台代码
控制器类:
注:此处写了两个控制器类,UserController.java主要是初次接触springMVC,测试前后台传递值得方式,和后面的增删改查没关系,可以不看,但是此处还是贴一下,用户管理功能主要是UserController02.java:
UserController.java:
package com.lee.user.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.el.PropertyNotWritableException;
import javax.print.attribute.standard.RequestingUserName;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.lee.user.pojo.User;
@Controller
@RequestMapping(value="userController")
public class UserController{
private static Logger log=LoggerFactory.getLogger(UserController.class);
/**
* @Description: 返回 ModelAndView
* @param
* @return: void
* @author: ls 2018年4月16日 上午9:31:13
*/
@RequestMapping(value="userShow01")
public ModelAndView userShow01(HttpServletRequest request,
HttpServletResponse response,ModelAndView mav) {
mav.setViewName("user/usershow");
mav.addObject("username", "lee");
return mav;
}
/**
* @Description: ajax传值
* @param
* @return: void
* @author: ls 2018年4月16日 上午9:31:13
*/
@RequestMapping(value="userShow02")
public void userShow02(String username,HttpServletResponse response) {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
try {
PrintWriter pw = response.getWriter();
pw.println(username);
pw.flush();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @Description: ajax传值 对象
* @param
* @return: void
* @author: ls 2018年4月16日 上午9:31:13
*/
@RequestMapping(value="userShow03")
public void userShow03(User user,HttpServletResponse response) {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
try {
PrintWriter pw = response.getWriter();
System.out.println(user);
System.out.println(user.getUserName());
pw.println(user.getUserName());
pw.flush();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @Description: ajax传值 对象
* @param
* @return: void
* @author: ls 2018年4月16日 上午9:31:13
*/
@RequestMapping(value="userShow04")
@ResponseBody
public User userShow04(User user,HttpServletResponse response) {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println(user.getUserName());
user.setUserName("1234567");
return user;
}
@RequestMapping(value="addUser")
@ResponseBody
public ModelAndView addUser(ModelAndView mav) {
mav.setViewName("user/user_add");
return mav;
}
}
UserController02.java:
package com.lee.user.controller;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.multipart.MultipartFile;
import com.lee.user.pojo.User;
import com.lee.user.service.UserService;
import com.lee.util.PageBean;
import com.lee.util.ResponseUtil;
import com.lee.util.StringUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("/user")
public class UserController02 {
private static Logger log=LoggerFactory.getLogger(UserController02.class);
@Autowired
private UserService userService;
//文件上传页面
@RequestMapping(value="/upload.do")
public String showUploadPage(){
return "file/file";
}
//文件上传
@RequestMapping(value="/doUpload.do",method=RequestMethod.POST)
public String doUploadFile(@RequestParam("file")MultipartFile file) throws IOException{
if (!file.isEmpty()) {
log.info("Process file:{}",file.getOriginalFilename());
}
FileUtils.copyInputStreamToFile(file.getInputStream(), new File("D:\\",file.getOriginalFilename()));
return "file/success";
}
/**
* 用户管理页面
* @return
*/
@RequestMapping(value="/userManage.do")
public String userManagePage(){
return "userManage";
}
/**
* 添加或者修改
* @param user
* @param res
* @return
* @throws Exception
*/
@RequestMapping("/save.do")
public String save(User user,HttpServletResponse res) throws Exception{
//操作记录条数,初始化为0
int resultTotal = 0;
if (user.getId() == null) {
resultTotal = userService.add(user);
}else{
resultTotal = userService.update(user);
}
JSONObject jsonObject = new JSONObject();
if(resultTotal > 0){ //说明修改或添加成功
jsonObject.put("success", true);
}else{
jsonObject.put("success", false);
}
ResponseUtil.write(res, jsonObject);
return null;
}
/**
* 用户分页查询
* @param page
* @param rows
* @param s_user
* @param res
* @return
* @throws Exception
*/
@RequestMapping("/list.do")
public String list(@RequestParam(value="page",required=false) String page,@RequestParam(value="rows",required=false) String rows,User s_user,HttpServletResponse res) throws Exception{
/*
* easyui分页控件 通过在datagrid中设置pagination:true 就会显示分页
* 当请求时, datagrid会向后台传递两个参数:
* rows(每一页展示多少条数据) page(第几页)
*/
log.info(page);
log.info(rows);
PageBean pageBean=new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
Map<String,Object> map=new HashMap<String,Object>();
map.put("userName", StringUtil.formatLike(s_user.getUserName()));
map.put("start", pageBean.getStart());
map.put("end", pageBean.getEnd());
List<User> userList=userService.find(map);
Long total=userService.getTotal(map);
JSONObject result=new JSONObject();
JSONArray jsonArray=JSONArray.fromObject(userList);
/*
* 后台传json数据时也要按照datagrid的数据格式,传递两个数据:
* total键 存放总记录数
* rows键 存放每页记录
*/
result.put("rows", jsonArray);
result.put("total", total);
ResponseUtil.write(res, result);
return null;
}
/**
* 删除用户
* @param ids
* @param res
* @return
* @throws Exception
*/
@RequestMapping("/delete.do")
public String delete(@RequestParam(value="ids") String ids,HttpServletResponse res) throws Exception{
String[] idStr = ids.split(",");
JSONObject jsonObject = new JSONObject();
for (String id : idStr) {
userService.delete(Integer.parseInt(id));
}
jsonObject.put("success", true);
ResponseUtil.write(res, jsonObject);
return null;
}
}
实体类:
User.java:
package com.lee.user.pojo;
import java.io.Serializable;
public class User implements Serializable{
/**
* 用户实体
* @author ls
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String userName;
private String password;
private Integer age;
private String trueName;
private String email;
private String phone;
private String roleName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getTrueName() {
return trueName;
}
public void setTrueName(String trueName) {
this.trueName = trueName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
dao接口及mapper.xml:
UserDao.java:
package com.lee.user.dao;
import java.util.List;
import java.util.Map;
import com.lee.user.pojo.User;
public interface UserDao {
/**
* @Description: 删除用户
* @param
* @return: int
* @author: ls 2018年4月23日 上午10:44:11
*/
public int delete(int id);
/**
* @Description: 更新用户
* @param
* @return: int
* @author: ls 2018年4月23日 上午10:44:48
*/
public int update(User user);
/**
* @Description: 添加用户
* @param
* @return: int
* @author: ls 2018年4月23日 上午10:45:12
*/
public int add(User user);
/**
* @Description: 用户查询
* @param
* @return: List<User>
* @author: ls 2018年4月23日 上午10:46:38
*/
public List<User> find(Map<String,Object> map);
/**
* @Description: 获取总记录数
* @param
* @return: long
* @author: ls 2018年4月23日 上午10:47:28
*/
public long getTotal(Map<String,Object> map);
}
userMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lee.user.dao.UserDao">
<!-- 定义缓存 一般是一级缓存,如果用同一个sqlsession 那么相同查询直接会从缓存中查找 -->
<cache size="1024" flushInterval="60000" eviction="LRU" readOnly="false"></cache>
<!-- 增加 -->
<!-- MyBatis 插入空值时,需要指定JdbcType
mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换,
两种方式:
1. 在sql里的参数里加,如:#{fee,jdbcType=NUMERIC},
2. 在resultMap中加,如下:
<result property="userName" column="userName" jdbcType="VARCHAR" />
-->
<insert id="add" parameterType="com.lee.user.pojo.User">
insert into users(id,username,password,age,truename,email,phone,rolename)
values
(users_s.nextval,#{userName},#{password},#{age,jdbcType=NUMERIC},
#{trueName},#{email},#{phone},#{roleName}
)
</insert>
<resultMap id="userResultMap" type="com.lee.user.pojo.User" >
<id property="id" column="id" jdbcType="NUMERIC" />
<result property="userName" column="userName" jdbcType="VARCHAR" />
<result property="password" column="password" jdbcType="VARCHAR" />
<result property="age" column="age" jdbcType="NUMERIC" />
<result property="trueName" column="trueName" jdbcType="VARCHAR" />
<result property="email" column="email" jdbcType="VARCHAR" />
<result property="phone" column="phone" jdbcType="VARCHAR" />
<result property="roleName" column="roleName" jdbcType="VARCHAR" />
</resultMap>
<!-- 查询 - 含分页 -->
<select id="find" parameterType="com.lee.user.pojo.User" resultMap="userResultMap">
select * from
(
select u1.*,rownum rn from users u1
)
<where>
<if test="userName!=null and userName!='' ">
and userName like #{userName}
</if>
<if test="start!=null and end!=null">
and rn between #{start} and #{end}
</if>
</where>
</select>
<select id="getTotal" parameterType="Map" resultType="Long">
select count(*) from users
<where>
<if test="userName!=null and userName!='' ">
and userName like #{userName}
</if>
</where>
</select>
<!-- 用户删除 -->
<delete id="delete" parameterType="Integer">
delete from users where id = #{id}
</delete>
<!-- 用户修改 -->
<update id="update" parameterType="com.lee.user.pojo.User">
update users
<set>
<if test="age != null and age != ''">age = #{age},</if>
<if test="userName != null and userName != ''">userName = #{userName},</if>
<if test="password != null and password != ''">password = #{password},</if>
<if test="trueName != null and trueName != ''">trueName = #{trueName},</if>
<if test="email != null and email != ''">email = #{email},</if>
<if test="phone != null and phone != ''">phone = #{phone},</if>
<if test="roleName != null and roleName != ''">roleName = #{roleName},</if>
</set>
where id = #{id}
</update>
</mapper>
UserService及UserServiceImpl:
UserService.java:
package com.lee.user.service;
import java.util.List;
import java.util.Map;
import com.lee.user.pojo.User;
public interface UserService {
public int delete(int id);
public int update(User user);
public int add(User user);
public List<User> find(Map<String,Object> map);
public Long getTotal(Map<String,Object> map);
}
UserServiceImpl.java:
package com.lee.user.serviceImpl;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lee.user.dao.UserDao;
import com.lee.user.pojo.User;
import com.lee.user.service.UserService;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public int delete(int id) {
// TODO Auto-generated method stub
return userDao.delete(id);
}
public int update(User user) {
// TODO Auto-generated method stub
return userDao.update(user);
}
public int add(User user) {
// TODO Auto-generated method stub
return userDao.add(user);
}
public List<User> find(Map<String, Object> map) {
// TODO Auto-generated method stub
return userDao.find(map);
}
public Long getTotal(Map<String, Object> map) {
// TODO Auto-generated method stub
return userDao.getTotal(map);
}
}
下面是几个工具类:
分页PageBean.java:
package com.lee.util;
public class PageBean {
private int page; // 第几页
private int pageSize; // 每页记录数
private int start; // 页起始
private int end; //页结束
public PageBean(int page, int pageSize) {
super();
this.page = page;
this.pageSize = pageSize;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
//重写页开始
public int getStart() {
return (page-1)*pageSize+1;
}
//重写页结束
public int getEnd(){
return page*pageSize;
}
}
用于返回json数据工具类ResponseUtil.java:
package com.lee.util;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
/**
* 用于返回json数据工具类
* @author ls
*
*/
public class ResponseUtil {
public static void write(HttpServletResponse response,Object object)throws Exception{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.println(object);
out.flush();
out.close();
}
}
字符串工具类StringUtil.java:
package com.lee.util;
/**
* 字符串工具类
* @author ls
*
*/
public class StringUtil {
/**
* 判断是否是空
* @param str
* @return
*/
public static boolean isEmpty(String str){
if(str==null||"".equals(str.trim())){
return true;
}else{
return false;
}
}
/**
* 判断是否不是空
* @param str
* @return
*/
public static boolean isNotEmpty(String str){
if((str!=null)&&!"".equals(str.trim())){
return true;
}else{
return false;
}
}
/**
* 格式化模糊查询
* @param str
* @return
*/
public static String formatLike(String str){
if(isNotEmpty(str)){
return "%"+str+"%";
}else{
return null;
}
}
}
springMVC中文编码UtfFilter.java:
package com.lee.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
//@WebFilter("/*")
public class UtfFilter implements Filter{
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
六. 前台代码:
index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/jsp/commons/include.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户信息</title>
<script type="text/javascript">
/**
* 02 ajax传值
*/
function loginUser02(){
var username = $("#username").val();
var queryData = {"username":username};
$.post("userController/userShow02",queryData,function(data){
$("#userinfo").val(data);
});
}
/**
* 03 ajax传值 传对象
*/
function loginUser03(){
var username = $("#username").val();
var queryData = {"username":username};
$.post("userController/userShow03",queryData,function(data){
$("#userinfo").val(data);
});
}
/**
* 04 ajax传值 传对象 @ResponseBody
*/
function loginUser04(){
var username = $("#username").val();
var queryData = {"username":username};
$.ajax({
type : 'POST',
url : "userController/userShow04",
dataType : 'json',
data : queryData,
success : function(data) {
$("#userinfo").val(data.username);
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
alert("出现异常,异常信息:"+textStatus,"error");
}
});
}
</script>
</head>
<body class="easyui-layout" fit="true" scroll="no">
<div id="userButton" data-options=" region:'north'," style="height:100px;padding:5px;">
用户名:<input class="easyui-textbox" data-options="iconCls:'icon-search'" style="width:300px" id="username" name="username" >
<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-save'"
οnclick="loginUser02();">登录02-ajax 后台字符串获取</a>
<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-save'"
οnclick="loginUser03();">登录03-ajax 后台对象获取</a>
<a href="#" class="easyui-linkbutton" data-options="iconCls:'icon-save'"
οnclick="loginUser04();">登录04-ajax 后台对象获取@ResponseBody</a>
<a href="jsp/user/userManage.jsp" class="easyui-linkbutton" data-options="iconCls:'icon-save'"
>转到用户管理页面</a>
</div>
<div style="margin:10px 0;"></div>
<div id="userList" data-options="region:'center' " >
<table class="easyui-datagrid" data-options="fitColumns:true,pagination:true,rownumbers:true,pagePosition:'bottom',pageSize:10">
<thead>
<tr>
<th data-options="field:'code',width:100">用户编码</th>
<th data-options="field:'name',width:100">用户名称</th>
<th data-options="field:'price',width:100">年龄</th>
<th data-options="field:'price',width:100">性别</th>
</tr>
</thead>
</table>
</div>
<div id="userinfoDiv" data-options="region:'south' " style="height:100px;" >
<input type='text' id='userinfo' name='userinfo' />
</div>
</body>
</html>
公用引入文件,主要是引入easyUI相关文件(easyUI相关文件此处不贴了,可以自己下载)include.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
String p = request.getContextPath();
String path = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+p+"/";
%>
<link rel="stylesheet" type="text/css" href="<%=path %>easyui/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="<%=path %>easyui/themes/icon.css" />
<link rel="stylesheet" type="text/css" href="<%=path %>easyui/demo.css" />
<script type="text/javascript" src="<%=path %>easyui/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="<%=path %>easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="<%=path %>easyui/jquery.tooltip.js"></script>
<script type="text/javascript" src="<%=path %>easyui/easyui-lang-zh_CN.js"></script>
用户管理userManage.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/jsp/commons/include.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户管理</title>
<script type="text/javascript">
var url;
/**
* 新增用户
*/
function openUserAddDialog() {
$("#dlg").dialog("open").dialog("setTitle", "添加用户信息");
url = "${pageContext.request.contextPath}/user/save.do";
}
/**
* 复制增加
*/
function openUserCopyAddDialog(){
var selectRows = $("#dg").datagrid("getSelected");
$("#dlg").dialog("open").dialog("setTitle","复制增加用户信息");
$("#fm").form("load",selectRows);
url = "${pageContext.request.contextPath}/user/save.do";
}
/**
* 保存用户信息
*/
function saveUser() {
$("#fm").form("submit", {
url : url,
onSubmit : function() {
if ($("#roleName").combobox("getValue") == "") {
$.messager.alert("系统提示", "请选择用户角色!");
return false;
}
return $(this).form("validate");
},
success : function(result) {
var result = eval('(' + result + ')');
if (result.success) {
$.messager.alert("系统提示", "保存成功!");
resetValue();
$("#dlg").dialog("close");
$("#dg").datagrid("reload");
} else {
$.messager.alert("系统提示", "保存失败!");
return;
}
}
});
}
/**
* 查询用户
*/
function searchUser() {
$("#dg").datagrid('load', {
"userName" : $("#s_userName").val()
});
}
/**
* 表单信息重置
*/
function resetValue() {
$("#userName").val("");
$("#password").val("");
$("#trueName").val("");
$("#email").val("");
$("#phone").val("");
$("#roleName").combobox("setValue", "");
}
/**
* 删除用户
*/
function deleteUser() {
var selectedRows = $("#dg").datagrid("getSelections");
if (selectedRows.length == 0) {
$.messager.alert("系统提示", "请选择要删除的数据!");
return;
}
var strIds = [];
for ( var i = 0; i < selectedRows.length; i++) {
strIds.push(selectedRows[i].id);
}
var ids = strIds.join(",");
$.messager.confirm("系统提示", "您确定要删除这<font color=red>"
+ selectedRows.length + "</font>条数据吗?", function(r) {
if (r) {
$.post("${pageContext.request.contextPath}/user/delete.do", {
ids : ids
}, function(result) {
if (result.success) {
$.messager.alert("系统提示", "数据已成功删除!");
$("#dg").datagrid("reload");
} else {
$.messager.alert("系统提示", "数据删除失败,请联系系统管理员!");
}
}, "json");
}
});
}
/**
* 修改用户
*/
function openUserModifyDialog() {
var selectedRows = $("#dg").datagrid("getSelections");
if (selectedRows.length != 1) {
$.messager.alert("系统提示", "请选择一条要编辑的数据!");
return;
}
var row = selectedRows[0];
$("#dlg").dialog("open").dialog("setTitle", "编辑用户信息");
$("#fm").form("load", row);
url = "${pageContext.request.contextPath}/user/save.do?id=" + row.id;
}
</script>
</head>
<body style="margin: 1px">
<table id="dg" title="用户管理" class="easyui-datagrid" fitColumns="true"
pagination="true" rownumbers="true"
url="${pageContext.request.contextPath}/user/list.do" fit="true"
toolbar="#tb">
<thead>
<tr>
<th field="cb" checkbox="true" align="center"></th>
<th field="id" width="50" align="center">编号</th>
<th field="userName" width="50" align="center">用户名</th>
<th field="password" width="50" align="center">密码</th>
<th field="trueName" width="50" align="center">真实姓名</th>
<th field="age" width="50" align="center">年龄</th>
<th field="email" width="50" align="center">邮件</th>
<th field="phone" width="50" align="center">联系电话</th>
<th field="roleName" width="50" align="center">角色</th>
</tr>
</thead>
</table>
<div id="tb">
<a href="javascript:openUserAddDialog()" class="easyui-linkbutton"
iconCls="icon-add" plain="true">添加</a>
<a href="javascript:openUserCopyAddDialog()" class="easyui-linkbutton"
iconCls="icon-add" plain="true">复制添加</a>
<a href="javascript:openUserModifyDialog()" class="easyui-linkbutton"
iconCls="icon-edit" plain="true">修改</a>
<a href="javascript:deleteUser()" class="easyui-linkbutton"
iconCls="icon-remove" plain="true">删除</a>
<a href="${pageContext.request.contextPath}/user/upload.do" class="easyui-linkbutton"
iconCls="icon-remove" plain="true">文件上传</a>
<div>
用户名: <input type="text" id="s_userName" size="20"
οnkeydοwn="if(event.keyCode == 13)searchUser()" /> <a
href="javascript:searchUser()" class="easyui-linkbutton"
iconCls="icon-search" plain="true">查询</a>
</div>
<div id="dlg-buttons">
<a href="javascript:saveUser()" class="easyui-linkbutton"
iconCls="icon-ok">保存</a> <a href="javascript:closeUserDialog()"
class="easyui-linkbutton" iconCls="icon-cancel">关闭</a>
</div>
<div id="dlg" class="easyui-dialog"
style="width: 730px;height:280px;padding:10px 10px;" closed="true"
buttons="#dlg-buttons">
<form method="post" id="fm">
<table cellspacing="8px;">
<tr>
<td>用户名:</td>
<td><input type="text" id="userName" name="userName"
class="easyui-validatebox" required="true" /> <span
style="color: red">*</span>
</td>
<td> </td>
<td>密码:</td>
<td><input type="password" id="password" name="password"
class="easyui-validatebox" required="true" /> <span
style="color: red">*</span>
</td>
</tr>
<tr>
<td>真实姓名:</td>
<td><input type="text" id="trueName" name="trueName"
class="easyui-validatebox" required="true" /> <span
style="color: red">*</span>
</td>
<td> </td>
<td>邮箱:</td>
<td><input type="text" id="email" name="email"
validType="email" class="easyui-validatebox" required="true" /> <span
style="color: red">*</span>
</td>
</tr>
<tr>
<td>联系电话:</td>
<td><input type="text" id="phone" name="phone"
class="easyui-validatebox" required="true" /> <span
style="color: red">*</span>
</td>
<td> </td>
<td>用户角色:</td>
<td><select name="roleName" class="easyui-combobox"
id="roleName" style="width: 154px;" editable="false"
panelHeight="auto">
<option value="">请选择角色</option>
<option value="系统管理员">系统管理员</option>
<option value="销售主管">销售主管</option>
<option value="客户经理">客户经理</option>
<option value="高管">高管</option>
</select> <span style="color: red">*</span>
</td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" id="age" name="age"
class="easyui-validatebox" required="true" /> <span
style="color: red">*</span>
</td>
</tr>
</table>
</form>
</div>
</div>
</body>
</html>
文件相关:
file.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>上传文件</h1>
<form method="post" action="../user/doUpload.do" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传文件"/>
</form>
</body>
</html>
success.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
文件上传成功。。。。。。
</body>
</html>
七. 配置文件类:
jdbc.properties:
#mysql driver
#driver=com.mysql.jdbc.Driver
#url=jdbc:mysql://localhost:3306/db_oep
#oracle driver
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=CHARGE_STANDARD4
password=CHARGE_STANDARD4
initialSize=0
maxActive=20
maxIdle=20
minIdle=1
maxWait=60000
log4j.properties:
#\u5B9A\u4E49LOG\u8F93\u51FA\u7EA7\u522B
log4j.rootLogger=DEBUG,Console,File
#\u5B9A\u4E49\u65E5\u5FD7\u8F93\u51FA\u76EE\u7684\u5730\u4E3A\u63A7\u5236\u53F0
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#\u53EF\u4EE5\u7075\u6D3B\u5730\u6307\u5B9A\u65E5\u5FD7\u8F93\u51FA\u683C\u5F0F\uFF0C\u4E0B\u9762\u4E00\u884C\u662F\u6307\u5B9A\u5177\u4F53\u7684\u683C\u5F0F
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#\u6587\u4EF6\u5927\u5C0F\u5230\u8FBE\u6307\u5B9A\u5C3A\u5BF8\u7684\u65F6\u5019\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6
log4j.appender.File = org.apache.log4j.RollingFileAppender
#\u6307\u5B9A\u8F93\u51FA\u76EE\u5F55
log4j.appender.File.File = logs/ssm.log
#\u5B9A\u4E49\u6587\u4EF6\u6700\u5927\u5927\u5C0F
log4j.appender.File.MaxFileSize = 10MB
# \u8F93\u51FA\u6240\u4EE5\u65E5\u5FD7\uFF0C\u5982\u679C\u6362\u6210DEBUG\u8868\u793A\u8F93\u51FADEBUG\u4EE5\u4E0A\u7EA7\u522B\u65E5\u5FD7
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
#mbaits
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
spring集成springMVC spring-mvc.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自动扫描该package,使SpringMVC认为包下使用@controller注解的类就是控制器 -->
<context:component-scan base-package="com.lee.user.controller" />
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 -->
</list>
</property>
</bean>
<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 说明:这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="../jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 此处为配置文件上传配置 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
</beans>
spring集成mybatis,spring-mybatis.xml(相当于applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.lee.user" />
<!-- 引入jdbc配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/lee/user/mapper/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.lee.user.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<!-- Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- add 解决由于采用spring的过滤器,导致页面引用的JS、images、CSS发生找不到的错误;
也可以用使用spring mvc 的 <mvc:resources /> 注解 用来处理静态文件 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<!-- end springMVC有个拦截器会拦截js css这些引用文件,配置取消拦截 -->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
八. Oracle数据库建表语句:
-- Create table
create table USERS
(
username VARCHAR2(20),
password VARCHAR2(20),
age NUMBER(10),
truename VARCHAR2(20),
email VARCHAR2(20),
phone VARCHAR2(20),
rolename VARCHAR2(20),
id NUMBER(10)
)
九. 项目效果:
Tomcat启动项目后,起始页index.jsp效果如下:
点击最后一个按钮即到了我们需要的用户管理页面:
点击增加按钮:
OK,结束。