前后端分离(二)
一、数据库city
一张表cities,四个字段pName、cName、cNote、cImage
二、JavaScript基础
1、获取与设置元素的value值
常用的<input type="text" />,<textarea>等文本框的value属性就是输入的值,DOM中通过:
document.getElementById("id").value;
来获取与设置id那个元素的值,例如:
//设置id="province"的value的值为“广东”;
document.getElementById("province").value="广东";
//获取id="province"的value的值;
var v=document.getElementById("province").value;
2、获取与设置元素的innerHTML属性值
常用的<div>,<span>等元素的innerHTML属性就是显示的值,DOM中通过:
document.getElementById("id").innerHTML;
来获取与设置id那个元素的值,例如:
//设置id="msg"的innerHTML的值为“广东”;
document.getElementById("msg").innerHTML="广东";
//获取id="msg"的innerHTML的值;
var v=document.getElementById("msg").innerHTML;
三、JSON基础
把一个对象转为JSON格式的字符串成为对象的序列化,一个对象只有序列化成一个字符串后才能在网络上传输。反过来,一个接收到JSON字符串必须转化为一个对象才能在程序中使用,这个过程称为JSON字符串反序列化。
四、DEMO
简述:这个DEMO实现的功能是在前端页面点击提交按钮,前端页面将要提交的数据转化为JSON格式,然后通过Ajax将JSON数据传输到后台,后接受到数据之后将JSON数据字符串反序列化为对象,再插入数据库,如果插入成功再在前端页面上打印出插入成功的字样。
client.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ajax</title>
<script language="javascript">
var http = null;
function getHttp() {
//获取XMLHttpRequest对象
var http = null;
try {
if (window.ActiveXObject)
http = new ActiveXObject("Microsoft.XMLHTTP");
else if (window.XMLHttpRequest)
http = new XMLHttpRequest();
else
alert('Getting XMLHttpRequest faild');
}
catch (exp) {
alert(exp.description);
}
return http;
}
function process() {
if (http.readyState == 4) {
//获取服务器响应,显示结果
document.getElementById("msg").innerHTML = http.responseText;
}
}
function getDateTime() {
try {
//获取XMLHttpRequest对象
if (http == null) {
http = getHttp();
}
http.onreadystatechange = process;
//获取数据
var obj = new Object();
obj.province = document.getElementById("province").value;
obj.city = document.getElementById("city").value;
var s = JSON.stringify(obj);
//s = "&s="+s;
s = encodeURI(s);
s = encodeURI(s); //两次编码
//发送数据
http.open("GET", "server.ashx?&s=" + s + "&rnd=" + Math.random().toString(), true);
//http.open("POST", "server.ashx?&rnd=" + Math.random().toString(), true);
//设置数据格式
//http.setRequestHeader("content-Type", "application/json");
http.send(null);
}
catch (exp) {
alert(exp.description);
}
}
</script>
</head>
<body>
省份<input type="text" id="province" value="广东" style="width:50px" />
城市<input type="text" id="city" value="深圳" style="width:50px" />
<input type="submit" value="提交" onclick="getDateTime()"><br/>
<span id="msg"/>
</body>
</html>
server.ashx
<%@ WebHandler Language="C#" Class="DEMO.server" Debug="true" %>
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace DEMO
{
public class server : IHttpHandler
{
private SQLHelper sqlhelper = null;
//初始化
public server()
{
sqlhelper = new SQLHelper();
}
public bool IsReusable
{
get
{
return false;
}
}
public void ProcessRequest(HttpContext context)
{
//接收s
String s=context.Request.QueryString["s"];
//context.Response.ContentType = "application/json";
//context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
//using (var reader = new System.IO.StreamReader(context.Request.InputStream))
//{
// String s = reader.ReadToEnd();
// if (!string.IsNullOrEmpty(s))
// {
// //业务处理
// }
//}
//String s = context.Request.QueryString["s"];
s = System.Web.HttpUtility.UrlDecode(s);
//将json字符串转换为对象
//JObject jObject = (JObject)JsonConvert.DeserializeObject(s);
//JArray jar = JArray.Parse(jObject["RTDataSets"].ToString());
JObject jObject = JObject.Parse(s);
//接收province参数
String p = (string)jObject["province"];
//接收city参数
String c = (string)jObject["city"];
//context.Response.Clear();
//context.Response.ContentType = "text/plain";
//context.Response.Write(p + " " + c);
//context.Response.Flush();
if (Insert(p, c))
{
context.Response.Write("增加("+p+","+c+")成功!");
}
else
{
context.Response.Write("增加(" + p + "," + c + ")失败!");
}
}
//插入函数
public bool Insert(string pName,string cName)
{
bool flag = false;
string sql = "insert into cities(pName,cName) values(@pName,@cName)";
SqlParameter[] para = new SqlParameter[]{
new SqlParameter("@pName",pName),
new SqlParameter("@cName",cName)
};
int res = sqlhelper.ExecuteNonQuery(sql, para);
if (res > 0)
{
flag = true;
}
return flag;
}
}
}
SQLHelper.cs
/*
* author : H
* time: 2015/5/30 16:50:04
* explain : 数据库助手类
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DEMO
{
public class SQLHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SQLHelper()
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
/// <summary>
/// 执行带参数的SQL增删改语句
/// </summary>
/// <param name="sql">增删改SQL语句</param>
/// <param name="para">参数集合</param>
/// <returns></returns>
public int ExecuteNonQuery(string sql, SqlParameter[] para)
{
int res;
using (cmd = new SqlCommand(sql, GetConn()))
{
cmd.Parameters.AddRange(para);
res = cmd.ExecuteNonQuery();
}
return res;
}
/// <summary>
/// 执行带参数的SQL查询
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="para">参数集合</param>
/// <returns></returns>
public DataTable ExecuteQuery(string sql, SqlParameter[] para)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(sql, GetConn());
cmd.Parameters.AddRange(para);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
}
数据库已经在文章的开头给出这里不再赘述。