文章目录
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">×</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的区别是什么?
微信扫一扫关注公众号
点击链接加入群聊
https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105