使用Spring MVC重构项目

Spring MVC介绍

Spring MVC框架是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易和非常快速。
Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。
模型(Model) 封装了应用程序数据,通常它们将由POJO类组成。
视图(View) 负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
控制器(Controller) 负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。

注意:
Spring是IOC和AOP的容器框架,Spring MVC是基于Spring功能之上添加的Web框架想,用Spring MVC必须先依赖Spring

项目结构

在这里插入图片描述

依赖配置

<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.yzc</groupId>
	<artifactId>stuwebNG</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<dependencies>
		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>sqljdbc4</artifactId>
			<version>4.0</version>
		</dependency>		
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.6</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
			<scope>provided</scope>
		</dependency>
		<!-- 文件上传组件 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
		</dependency>				
        <!-- Spring dependencies -->
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency> 
        <!-- http://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
		<!-- Jackson Json处理工具包 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.4.2</version>
		</dependency>        		
	</dependencies>
	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8080</port>
					<path>/</path>
				</configuration>
			</plugin>
			<!-- java编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.2</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

web.xml配置

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1"
  metadata-complete="true">

	<display-name>Welcome to Tomcat</display-name>
	<description>Welcome to Tomcat</description>
	<!-- post乱码过滤器 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>  
	<servlet>
		<servlet-name>spring-mvc</servlet-name>
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
		<!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springmvc.xml</param-value>
		</init-param>       
		<load-on-startup>1</load-on-startup>
	</servlet>       
	<servlet-mapping>
		<servlet-name>spring-mvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

springmvc.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:dubbo="http://code.alibabatech.com/schema/dubbo"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

	<!-- 加载属性文件 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 配置注解驱动 -->
	<mvc:annotation-driven />
	<!-- 视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<!-- 配置包扫描器,扫描@Controller注解的类 -->
	<context:component-scan base-package="com.yzc.handlers"/>
	<!-- 配置资源映射 -->
	<mvc:resources location="/bootstrap/" mapping="/bootstrap/**"/>
	<mvc:resources location="/bootstrap-datetimepicker/" mapping="/bootstrap-datetimepicker/**"/>	
	<mvc:resources location="/bootstrap-table/" mapping="/bootstrap-table/**"/>		
	<mvc:resources location="/js/" mapping="/js/**"/>
	<mvc:resources location="/upload/" mapping="/upload/**"/>	
	<mvc:resources location="/images/" mapping="/images/**"/>	
	<mvc:resources location="/" mapping="/*.html"/>	
	<!-- 配置文件上传解析器 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设定默认编码 -->
		<property name="defaultEncoding" value="UTF-8"></property>
		<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
		<property name="maxUploadSize" value="5242880"></property>
	</bean>		
</beans>      

html完整代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>学生管理系统</title>
<link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css"/>
<link rel="stylesheet" href="bootstrap-table/css/bootstrap-table.css">
<script src="js/jquery.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js" type="text/javascript" charset="utf-8"></script>
<script src="bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js" type="text/javascript" charset="utf-8"></script>
<script src="bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js" type="text/javascript" charset="utf-8"></script>
<script src="bootstrap-table/js/bootstrap-table.js"></script>
<script src="bootstrap-table/js/bootstrap-table-zh-CN.js"></script>
<script src="js/student.js"></script>
<script type="text/javascript">	
	$(function(){
		$('.form_date').datetimepicker({
		  language: 'zh-CN',
		  weekStart: 1,
		  todayBtn: 1,
		  autoclose: 1,
		  todayHighlight: 1,
		  startView: 2,
		  minView: 2,
		  forceParse: 0,
		 });
		
		initMainTable();
	}) 
</script>
</head>
<body class="bg-info">
<!--导航层-->
<div>
	<!--菜单列表-->
	<ul class="nav nav-pills nav-justified">
		<li role="presentation" class="active"><a href="javascript:void(0);">学生基本信息管理</a></li>
		<li role="presentation"><a href="javascript:void(0);">学生档案</a></li>
		<li role="presentation"><a href="javascript:void(0);">学生就业情况</a></li>
	</ul>	
</div>
<div>
<table id="grid" class="table" data-toolbar=".toolbar"></table>
</div>
<div id="toolbar" class="toolbar">
<button type="button" class="btn btn-primary" onclick="add();">
  <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 添加
</button>
</div>
<!-- 模态框(Modal) -->
<div class="modal fade" id="edit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h3 class="modal-title" id="subject"></h3>
            </div>
            <div class="modal-body">
				<form role="form" id="register">
					<div class="form-group" id="first">
						<label for="sid">学号</label> <input type="text"
							class="form-control" id="sid" name="sid" readonly>
					</div>
					<div class="form-group">
						<label for="sname">姓名</label> <input type="text"
							class="form-control" id="sname" name="sname" placeholder="请输入姓名">
					</div>
					<label for="name">性別</label>
					<div class="form-group">
			    		<label class="radio-inline">
			        		<input type="radio" name="gender" id="male" value="1" checked> 靓仔
			    		</label>
			    		<label class="radio-inline">
			        		<input type="radio" name="gender" id="female" value="0"> 美女
			    		</label>
					</div>
					<div class="form-group">
					<label for="birth">生日</label>
					<div class="input-group date form_date" data-date="" data-date-format="yyyy MM dd" data-link-field="birth" data-link-format="yyyy-mm-dd">						
						<input name="birth" id="birth" class="form-control" type="text" value="" readonly>
						<span class="input-group-addon">
							<span class="glyphicon glyphicon-remove"></span>
						</span>
						<span class="input-group-addon">
							<span class="glyphicon glyphicon-calendar"></span>
						</span>
					</div>
					</div>  	
					<div class="form-group">
						<label for="photo">上传头像</label>
						<input type="file" id="photo" name="photo">
						<p class="help-block">请上传jpg或者png格式的文件!</p>
					</div>
					<div class="form-group">
						<button type="button" class="btn btn-default" onclick="upload();">
			  				<span class="glyphicon glyphicon-upload" aria-hidden="true"></span> 上传
						</button>
					</div>
					<div hidden="hidden">
						<input type="text" name="filePath" id="filePath" value="images/default.png"/>
					</div>
					<div class="form-group">
						<img width="120" height="120" src="images/default.png" id="photo2"/>
					</div>
				</form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" class="btn btn-primary" onclick="save();">保存</button>
            </div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
</div><!-- /.modal -->
</body>
</html>

js完整代码

var $table;	
var rows = 5;
function initMainTable() {	//初始化bootstrap-table的内容
    //记录页面bootstrap-table全局变量$table,方便应用
    var queryUrl = 'welcome';
    $table = $('#grid').bootstrapTable({
        url: queryUrl,                      //请求后台的URL(*)
        method: 'POST',                     //请求方式(*)
        toolbar: '.toolbar',              	//工具按钮用哪个容器
        striped: true,                      //是否显示行间隔色
        cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
        pagination: true,                   //是否显示分页(*)
        sortable: true,                     //是否启用排序
        sortOrder: "asc",                   //排序方式
        sidePagination: "server",           //分页方式:client客户端分页,server服务端分页(*)
        pageNumber: 1,                      //初始化加载第一页,默认第一页,并记录
        pageSize: rows,                     //每页的记录行数(*)
        pageList: [10, 25, 50, 100],        //可供选择的每页的行数(*)
        search: false,                      //是否显示表格搜索
        strictSearch: true,
        showColumns: true,                  //是否显示所有的列(选择显示的列)
        showRefresh: true,                  //是否显示刷新按钮
        minimumCountColumns: 2,             //最少允许的列数
        clickToSelect: true,                //是否启用点击选中行
        //height: 500,                      //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度
        uniqueId: "sno",                     //每一行的唯一标识,一般为主键列
        showToggle: true,                   //是否显示详细视图和列表视图的切换按钮
        cardView: false,                    //是否显示详细视图
        detailView: false,                  //是否显示父子表
        //得到查询的参数
        queryParams : function (params) {
            //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
            var temp = {   
                rows: params.limit,                         //页面大小
                page: (params.offset / params.limit) + 1,   //页码
                sort: params.sort,      //排序列名  
                sortOrder: params.order //排位命令(desc,asc) 
            };
            return JSON.stringify(temp);
        },
        columns: [{
            checkbox: true,  
            visible: true                  //是否显示复选框  
        }, {
            field: 'sno',
            title: '学号',
            sortable: true
        }, {
            field: 'sname',
            title: '姓名',
            sortable: true
        }, {
            field: 'male',
            title: '性别',
            sortable: true,
            formatter: genderFormatter
        }, {
            field: 'birth',
            title: '生日'
        }, {
            field:'sno',
            title: '操作',
            width: 120,
            align: 'center',
            valign: 'middle',
            formatter: actionFormatter
        }, ],
        onLoadSuccess: function () {
        },
        onLoadError: function () {
            alert("数据加载失败!");
        },
        onDblClickRow: function (row, $element) {
            var id = row.sno;
            edit(id);
        },
        responseHandler: responseHandler,
    });
};
	

function actionFormatter(value, row, index) {	//操作栏的格式化
    var id = value;
    var result = "";
    result += "<a href='javascript:;' class='btn btn-xs green' οnclick=\"view(" + id + ")\" title='查看'><span class='glyphicon glyphicon-search'></span></a>";
    result += "<a href='javascript:;' class='btn btn-xs blue' οnclick=\"edit(" + id + ")\" title='编辑'><span class='glyphicon glyphicon-pencil'></span></a>";
    result += "<a href='javascript:;' class='btn btn-xs red' οnclick=\"del(" + id + ")\" title='删除'><span class='glyphicon glyphicon-remove'></span></a>";
    return result;
}

/**
 * 获取返回的数据的时候做相应处理,让bootstrap table认识我们的返回格式
 * @param {Object} res
 */
function responseHandler(res) {
	 return {
		 "rows": res.data.rows, // 具体每一个bean的列表
		 "total": res.data.total // 总共有多少条返回数据
	 }
}
     
//性别字段格式化
function genderFormatter(value) {
	var gender;
	if (value == false) { 
		color = 'Red'; 
		gender = '小姐姐';
	}
	else if (value == true) {
		color = 'Blue';
		gender = '大帅哥';
	}
	else { color = 'Yellow'; }

	return '<div  style="color: ' + color + '">' + gender + '</div>';
}   

function add(){
	$("#subject").text("注册学生信息");
	$("#first").hide();
	$("#register")[0].reset();
    $("#photo2").attr("src","images/default.png");
	//$("#edit").css("display","block");
    $('.form_date').datetimepicker("setDate", new Date()); 
    $('#edit').modal('show');
}

function edit(sid){
	$("#register")[0].reset();        		
	$("#subject").text("修改学生信息");
	$("#first").show();
    $("#photo2").attr("src","images/default.png");
	//var sid = $(e).parent().siblings().first().text();
	//alert(sid);
    $.ajax({
    	//几个参数需要注意一下
        type: "GET",//方法类型
        cache: false,
        dataType: "json",//预期服务器返回的数据类型
        url: "edit/"+sid ,//url
        success: function (data) {
            //console.log(data);//打印服务端返回的数据(调试用)
            if (data.status == 200) {
            	var stu = data.data;
            	$("#sid").val(stu.sno);
            	$("#sname").val(stu.sname);
            	if(stu.male){
            		$("#male").prop("checked",true);
            	}else{
            		$("#female").prop("checked",true);
            	}
            	$("#birth").val(stu.birth);
            	$("#filePath").val(stu.imageUrl);
                $("#photo2").attr("src",stu.imageUrl);
                $('#edit').modal('show');
            }
        },
        error : function() {
            alert("异常!");
        }
    });
}

function save(){
    $.ajax({
        	//几个参数需要注意一下
            type: "post",//方法类型
            dataType: "json",//预期服务器返回的数据类型
            url: "save" ,//url
            data: $("#register").serialize(),
            success: function (data) {
                //console.log(data);//打印服务端返回的数据(调试用)
                if (data.status == 200) {
                	$('#edit').modal('hide');
                    //$("#edit").css("display","none");
                    //$("#register")[0].reset();
                    //$("#photo2").attr("src","images/default.png");
                    //alert(data.message);
	            	$table.bootstrapTable('refresh');
                }
            },
            error : function() {
                alert("异常!");
            }
        });
}

function upload(){
	var file = $("#photo").get(0).files[0];
	var formData = new FormData();
	formData.append("source",file);
	$.ajax({
		url:"upload/file",
		type:"post",
		dataType:"json",
		cache:false,
		data:formData,
		contentType:false,
		processData:false,
		success:function(data){
			if(data.status==200){
				$("#photo2").attr("src",data.data);
				$("#filePath").val(data.data);
			}
			console.log("hello test");
		}
	});
}

function del(sid){
	//var sid = $(e).parent().siblings().first().text();
	var yesOrNo = confirm("确定要删除该学生么?");
	if(yesOrNo){
	    $.ajax({
	    	//几个参数需要注意一下
	        type: "GET",//方法类型
	        dataType: "json",//预期服务器返回的数据类型
	        url: "delete/"+sid ,//url
	        success: function (data) {
	            console.log(data.msg);//打印服务端返回的数据(调试用)
	            if (data.status == 200) {
	            	$table.bootstrapTable('refresh');
	            }
	        },
	        error : function() {
	            alert("异常!");
	        }
	    });	
	}
}

自定义响应结构

package com.yzc.pojo;

import java.io.Serializable;
import java.util.List;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 自定义响应结构
 */
public class ActionResult implements Serializable{

	private static final long serialVersionUID = 1L;

	// 定义jackson对象
    private static final ObjectMapper MAPPER = new ObjectMapper();

    // 响应业务状态
    private Integer status;

    // 响应消息
    private String msg;

    // 响应中的数据
    private Object data;

    public static ActionResult build(Integer status, String msg, Object data) {
        return new ActionResult(status, msg, data);
    }

    public static ActionResult ok(Object data) {
        return new ActionResult(data);
    }

    public static ActionResult ok() {
        return new ActionResult(null);
    }

    public ActionResult() {

    }

    public static ActionResult build(Integer status, String msg) {
        return new ActionResult(status, msg, null);
    }

    public ActionResult(Integer status, String msg, Object data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public ActionResult(Object data) {
        this.status = 200;
        this.msg = "OK";
        this.data = data;
    }

//    public Boolean isOK() {
//        return this.status == 200;
//    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 将json结果集转化为ActionResult对象
     * 
     * @param jsonData json数据
     * @param clazz ActionResult中的object类型
     * @return
     */
    public static ActionResult formatToPojo(String jsonData, Class<?> clazz) {
        try {
            if (clazz == null) {
                return MAPPER.readValue(jsonData, ActionResult.class);
            }
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (clazz != null) {
                if (data.isObject()) {
                    obj = MAPPER.readValue(data.traverse(), clazz);
                } else if (data.isTextual()) {
                    obj = MAPPER.readValue(data.asText(), clazz);
                }
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 没有object对象的转化
     * 
     * @param json
     * @return
     */
    public static ActionResult format(String json) {
        try {
            return MAPPER.readValue(json, ActionResult.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Object是集合转化
     * 
     * @param jsonData json数据
     * @param clazz 集合中的类型
     * @return
     */
    public static ActionResult formatToList(String jsonData, Class<?> clazz) {
        try {
            JsonNode jsonNode = MAPPER.readTree(jsonData);
            JsonNode data = jsonNode.get("data");
            Object obj = null;
            if (data.isArray() && data.size() > 0) {
                obj = MAPPER.readValue(data.traverse(),
                        MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
            }
            return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
        } catch (Exception e) {
            return null;
        }
    }

}

定义学生模板

package com.yzc.entity;

import java.io.Serializable;
import java.util.Date;

public class Student implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private int sno;
	private String sname;
	private boolean isMale;
	private Date birth;
	private String imageUrl;

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Student(int sno, String sname, boolean isMale, Date birth, String imageUrl) {
		super();
		this.sno = sno;
		this.sname = sname;
		this.isMale = isMale;
		this.birth = birth;
		this.imageUrl = imageUrl;
	}

	public int getSno() {
		return sno;
	}

	public void setSno(int sno) {
		this.sno = sno;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public boolean isMale() {
		return isMale;
	}

	public void setMale(boolean isMale) {
		this.isMale = isMale;
	}

	public Date getBirth() {
		return birth;
	}

	public void setBirth(Date birth) {
		this.birth = birth;
	}

	public String getImageUrl() {
		return imageUrl;
	}

	public void setImageUrl(String imageUrl) {
		this.imageUrl = imageUrl;
	}
	
}

学生列表接口

package com.yzc.handlers;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yzc.entity.Student;
import com.yzc.pojo.ActionResult;
import com.yzc.utils.DBUtil;

@Controller
public class HelloHandler {
	
	@RequestMapping("/welcome")
	@ResponseBody
	public ActionResult getStudents(@RequestBody Map<String,String> map) {
		//PrintWriter pw = null;
		Connection conn = null;
		PreparedStatement stmt = null;
		//
		Map<String,Object> data = new HashMap<String,Object>();
		List<Student> list = new ArrayList<Student>();
		ActionResult result = null;
		//解决响应正文内容包含中文会出现乱码的问题
		//resp.setContentType("application/json;charset=utf-8");
		//
		//int rows = Integer.parseInt(req.getParameter("rows"));
		int rows = Integer.parseInt(map.get("rows"));
		//
		//int page = Integer.parseInt(req.getParameter("page"));
		int page = Integer.parseInt(map.get("page"));
		//
		int begin = (page-1)*rows;		
		//StringBuilder str = new StringBuilder();
/*		try {
			pw = resp.getWriter();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		try {
			conn = DBUtil.getConnection();
			stmt = conn.prepareStatement("SELECT COUNT(*) FROM STUDENT");
			ResultSet rs = stmt.executeQuery();
			rs.next();
			data.put("total", rs.getInt(1));
			//str.append("{\"result\":\"success\",\"message\":\"\",\"data\":{\"total\":"+rs.getInt(1)+",\"rows\":[");
			stmt = conn.prepareStatement("SELECT * FROM STUDENT ORDER BY SNO LIMIT ?,?");
			stmt.setInt(1, begin);
			stmt.setInt(2, rows);
			rs = stmt.executeQuery();
			while(rs.next()) {
				//str.append("{\"sno\":"+rs.getInt(1)+","+
				//"\"sname\":\""+rs.getString(2)+"\""+",\"isMale\":"+rs.getString(3).equals("男")+",\"birth\":"+
				//"\""+rs.getDate(4)+"\""+",\"url\":\""+rs.getString(5)+"\"},");
				list.add(new Student(rs.getInt(1),rs.getString(2),rs.getString(3).equals("男"),rs.getDate(4),rs.getString(5)));
			}
			data.put("rows", list);
			result = ActionResult.ok(data);
			//str = new StringBuilder(str.substring(0, str.length()-1));		
			//str.append("]}}");
			//System.out.println(str);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}
}

学生详情接口

package com.yzc.handlers;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yzc.entity.Student;
import com.yzc.pojo.ActionResult;
import com.yzc.utils.DBUtil;

@Controller
public class EditHandler {

	@RequestMapping("/edit/{sid}")
	@ResponseBody
	public ActionResult loadStudent(@PathVariable int sid){
		Connection conn = null;
		PreparedStatement stmt = null;
		ActionResult result = null;
		//解决响应正文内容包含中文会出现乱码的问题
		//resp.setContentType("application/json;charset=utf-8");
		//
		//PrintWriter pw = resp.getWriter();
		//
		//int sid = Integer.parseInt(req.getParameter("sid"));
		//
		try {
			conn = DBUtil.getConnection();
			stmt = conn.prepareStatement("SELECT * FROM STUDENT WHERE SNO=?");
			stmt.setInt(1, sid);
			ResultSet rs = stmt.executeQuery();
/*			if(rs.next()) {
				pw.println("{\"result\":\"success\",\"message\":\"\",\"data\":"+
				"{\"sno\":"+rs.getInt(1)+","+"\"sname\":\""+rs.getString(2)+"\""+
				",\"isMale\":"+rs.getString(3).equals("男")+
				",\"birth\":"+"\""+rs.getDate(4)+"\",\"filePath\":\""+rs.getString(5)+"\"}"+"}");
			}*/
			if(rs.next()) {
				result = ActionResult.ok(new Student(rs.getInt(1),rs.getString(2),rs.getString(3).equals("男"),rs.getDate(4),rs.getString(5)));
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//pw.println("{\"result\":\"fail\",\"message\":\"出现异常!\"}");
		} finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}
}

学生信息保存接口

package com.yzc.handlers;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yzc.pojo.ActionResult;
import com.yzc.utils.DBUtil;

@Controller
public class SaveHandler{

	@RequestMapping("/save")
	@ResponseBody
	public ActionResult saveStudent(HttpServletRequest req){
		Connection conn = null;
		PreparedStatement stmt = null;
		ActionResult result = null;
		//解决响应正文内容包含中文会出现乱码的问题
		//resp.setContentType("application/json;charset=utf-8");
		//解决请求参数内容包含中文会出现乱码的问题
		//req.setCharacterEncoding("utf-8");
		//PrintWriter pw = resp.getWriter();
		//
		String sno = req.getParameter("sid");
		//
		String sname = req.getParameter("sname");
		//
		String gender = req.getParameter("gender").equals("0")?"女":"男";
		//
		String birth = req.getParameter("birth");
		//
		String filePath = req.getParameter("filePath");
		//
		try {
			conn = DBUtil.getConnection();
			if(sno==null||sno.equals("")) {
				stmt = conn.prepareStatement("INSERT INTO STUDENT(SNAME,GENDER,BIRTH,PHOTO_URL) VALUES(?,?,?,?)");
				stmt.setString(1, sname);
				stmt.setString(2, gender);
				stmt.setString(3, birth);
				stmt.setString(4, filePath);
			}else {
				stmt = conn.prepareStatement("UPDATE STUDENT SET SNAME=?,GENDER=?,BIRTH=?,PHOTO_URL=? WHERE SNO=?");
				stmt.setString(1, sname);
				stmt.setString(2, gender);
				stmt.setString(3, birth);
				stmt.setString(4, filePath);			
				stmt.setInt(5, Integer.parseInt(sno));
			}	
			stmt.executeUpdate();
			result = ActionResult.ok();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				conn.close();//关闭数据库的连接
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		//pw.println("{\"result\":\"success\",\"message\":\"保存成功!\"}");
		return result;
	}
}

学生删除接口

package com.yzc.handlers;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yzc.pojo.ActionResult;
import com.yzc.utils.DBUtil;

@Controller
public class DeleteHandler {

	@RequestMapping("/delete/{sid}")
	@ResponseBody
    public ActionResult delStudent(@PathVariable int sid){
        Connection conn = null;
        PreparedStatement stmt = null;
        ActionResult result = null;
        //解决响应正文内容包含中文会出现乱码的问题
        //resp.setContentType("application/json;charset=utf-8");
        //解决请求参数内容包含中文会出现乱码的问题
        //req.setCharacterEncoding("utf-8");
        //PrintWriter pw = resp.getWriter();
        //获取学号
        //int sid = Integer.parseInt(req.getParameter("sid"));
        try {
            conn = DBUtil.getConnection();
            stmt = conn.prepareStatement("DELETE FROM STUDENT WHERE SNO = ?");
            stmt.setInt(1, sid);
            stmt.executeUpdate();
            result = ActionResult.ok();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                conn.close();//关闭数据库的连接
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //pw.println("{\"result\":\"success\",\"message\":\"删除成功!\"}");
        return result;
    }
}

文件上传接口

package com.yzc.handlers;

import java.io.File;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.yzc.pojo.ActionResult;

@Controller
public class UploadFileHandler {

	@RequestMapping("/upload/file")
	@ResponseBody
	public ActionResult uploadFile(@RequestParam("source") MultipartFile file,HttpServletRequest req) {
		//PrintWriter pw = null;
		// 解决响应正文内容包含中文会出现乱码的问题
		//resp.setContentType("application/json;charset=utf-8");
		ActionResult result = null;
		try {
			//pw = resp.getWriter();
			//Part part = req.getPart("source");
			// System.out.println(part.getClass());
			//String cd = part.getHeader("Content-Disposition");
			// System.out.println(cd);
			// 截取不同类型的文件需要自行判断
			String filename = file.getOriginalFilename();
			if (!file.isEmpty()) {
				String extName = filename.substring(filename.indexOf("."));// 取文件格式后缀名
				String uuid = UUID.randomUUID().toString().replace("-", "");
				// 新名称
				String newName = uuid + extName;// 在这里用UUID来生成新的文件夹名字,这样就不会导致重名
				// 用ServletContext对象的getRealPath()方法获得上传文件夹的绝对路径
				String savepath = req.getServletContext().getRealPath("/upload");
				file.transferTo(new File(savepath+"/"+newName));
				// 更好的做法是为上传的文件进行重命名(避免同名文件的相互覆盖)
				//part.write(savepath + "/" + newName);
				//pw.println("{\"result\":\"success\",\"message\":\"上传成功!\",\"url\":\"upload/" + newName + "\"}");
				result = ActionResult.ok("upload/"+newName);
			}
		} catch (Exception e) {
			e.printStackTrace();
			//pw.println("{\"result\":\"fail\",\"message\":\"上传失败!\",\"url\":\"\"}");
		}
		return result;
	}
}

参考资料

[01] 史上最实用的Springmvc技术教程
[02] Spring4 MVC HelloWord实例
[03] Spring MVC框架下406错误解析
[04] Spring MVC 实现文件的上传
[05] 关于SpringMVC的文件上传
[06] SpringMVC请求参数接收总结
[07] SpringMVC Controller接收参数总结
[08]SpringMVC-如何接收各种参数
[09] springmvc接收json数据的4种方式
[10] Springmvc接受json参数总结
[11] Ajax中传递Json格式的参数
[12] 把数据转化为JSON格式用ajax进行前后端交互
[13] Ajax向前后台传递json和转换
[14] js中json字符串与json对象的相互转换
[15] spring、spring mvc与spring boot的区别是什么?

微信扫一扫关注公众号
image.png
点击链接加入群聊

https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值