【无标题】

借鉴原文地址:http://www.cnblogs.com/yzxk/p/4749440.html


先看两个概念:

1.android连接数据库的方式有两种

       1.通过连接服务器,再由服务器读取数据库来实现数据的增删改查,这也是我们常用的方式。

       2.android直接连接数据库,这种方式非常耗手机内存,而且容易被反编译造成安全隐患,所以在实际项目中不推荐使用。

2.连接服务器方式: http通信 、 Socket通信

Http通信:GET方式、POST方式

GET方式和POST方式的区别:

前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符。但是GET请求并不是一无是处——GET请求大多用于查询(读取资源),效率高。POST请求用于注册、登录等安全性较高且向数据库中写入数据的操作。

除了POST和GET,http通信还有其他方式!请参见http请求的方法。


Http与Scoket区别:

简单理解:一个单向,一个双向。(具体了解,自行google)


开发环境部署:

程序结构:

android+servlet+service+mysql

仅供参考:能实现相关功能即可

操作系统:win10

数据库:mysql    数据库工具:Navicat for MySql

服务器:tomcat      服务器工具: eclipse

安卓端:genymotion虚拟机  安卓端工具:Android Studio


数据库设计:



服务器设计:

1、新建Web Project,命名为HelloWeb

2、项目结构图如下:

 LogLet类和RegLet类分别用于处理客户端的登陆和注册请求;Service类用于完成servlet对数据库的具体操作;DBManager类用于进行数据库基本操作;

 左侧是项目图,右侧是web.xml配置文件截图。

   

3、项目代码:

 DBManager.java

 <1> 单例模式构建DBManager对象;       

 <2> 定义数据库连接、关闭以及增删改查的基本操作,返回结果集。



   
   
  1. package com.db;
  2. import java.sql.*;
  3. public class DBManager {
  4. // 数据库连接常量
  5. public static final String DRIVER = "com.mysql.jdbc.Driver";
  6. public static final String USER = "root";
  7. public static final String PASS = "root";
  8. public static final String URL = "jdbc:mysql://localhost:3306/test";
  9. // 静态成员,支持单态模式
  10. private static DBManager per = null;
  11. private Connection conn = null;
  12. private Statement stmt = null;
  13. // 单态模式-懒汉模式
  14. private DBManager () {
  15. }
  16. public static DBManager createInstance () {
  17. if (per == null) {
  18. per = new DBManager();
  19. per.initDB();
  20. }
  21. return per;
  22. }
  23. // 加载驱动
  24. public void initDB () {
  25. try {
  26. Class.forName( "com.mysql.jdbc.Driver");
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. // 连接数据库,获取句柄+对象
  32. public void connectDB () {
  33. System.out.println( "Connecting to database...");
  34. try {
  35. conn = DriverManager.getConnection(URL, USER, PASS);
  36. stmt = conn.createStatement();
  37. } catch (SQLException e) {
  38. e.printStackTrace();
  39. }
  40. System.out.println( "SqlManager:Connect to database successful.");
  41. }
  42. // 关闭数据库 关闭对象,释放句柄
  43. public void closeDB () {
  44. System.out.println( "Close connection to database..");
  45. try {
  46. stmt.close();
  47. conn.close();
  48. } catch (SQLException e) {
  49. e.printStackTrace();
  50. }
  51. System.out.println( "Close connection successful");
  52. }
  53. // 查询
  54. public ResultSet executeQuery (String sql) {
  55. ResultSet rs = null;
  56. try {
  57. rs = stmt.executeQuery(sql);
  58. } catch (SQLException e) {
  59. e.printStackTrace();
  60. }
  61. return rs;
  62. }
  63. // 增添/删除/修改
  64. public int executeUpdate (String sql) {
  65. int ret = 0;
  66. try {
  67. ret = stmt.executeUpdate(sql);
  68. } catch (SQLException e) {
  69. e.printStackTrace();
  70. }
  71. return ret;
  72. }
  73. }

LogLet.java

  一个简单的Servlet,用于处理Http请求(get/post)。


   
   
  1. package com.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.service.Service;
  9. public class LogLet extends HttpServlet{
  10. private static final long serialVersionUID = 9036889586892331384L;
  11. @Override
  12. protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //接受客户端信息
  14. String username = request.getParameter( "username");
  15. username = new String(username.getBytes( "ISO-8859-1"), "UTF-8");
  16. String password = request.getParameter( "password");
  17. password = new String(password.getBytes( "ISO-8859-1"), "UTF-8");
  18. System.out.println(username + ":" + password);
  19. //新建服务对象
  20. Service service = new Service();
  21. //验证处理
  22. boolean log = service.login(username, password);
  23. if( log ){
  24. System.out.println( "log success");
  25. //request.getSession().setAttribute("username", username);
  26. } else{
  27. System.out.println( "log fail");
  28. }
  29. //返回信息到客户端
  30. response.setCharacterEncoding( "UTF-8");
  31. response.setContentType( "text/html");
  32. PrintWriter out = response.getWriter();
  33. if( log ){
  34. out.print( "用户名:" + username);
  35. out.print( "密码: " + password);
  36. } else{
  37. out.print( "false");
  38. }
  39. out.flush();
  40. out.close();
  41. }
  42. @Override
  43. protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  44. // TODO 自动生成的方法存根
  45. }
  46. }

RegLet.java

  一个简单的Servlet,用于处理Http请求(get/post)。


   
   
  1. package com.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.service.Service;
  9. public class RegLet extends HttpServlet{
  10. private static final long serialVersionUID = 1L;
  11. @Override
  12. protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. // TODO 自动生成的方法存根
  14. }
  15. @Override
  16. protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. // TODO 自动生成的方法存根
  18. //接受客户端信息
  19. String username = request.getParameter( "username");
  20. username = new String(username.getBytes( "ISO-8859-1"), "UTF-8");
  21. String password = request.getParameter( "password");
  22. System.out.println(username + ":" + password);
  23. //新建服务对象
  24. Service service = new Service();
  25. //验证处理
  26. boolean reg = service.register(username, password);
  27. if( reg ){
  28. System.out.println( "reg success");
  29. //request.getSession().setAttribute("username", username);
  30. } else{
  31. System.out.println( "reg fail");
  32. }
  33. //返回信息到客户端
  34. response.setCharacterEncoding( "UTF-8");
  35. response.setContentType( "text/html");
  36. PrintWriter out = response.getWriter();
  37. if(reg){
  38. out.print( "true");
  39. } else{
  40. out.print( "false");
  41. }
  42. out.flush();
  43. out.close();
  44. }
  45. }

客户端设计:

现在开始思考需要什么东西... 

 <1> 登陆和注册页面:布局文件

   login.xml , register.xml

 <2> 登陆和注册页面对应的Activity组件,在activity中进行具体操作

   login.java , register.java

 <3> 能够实现Http以get/post方式通信的类

   WebService.java , WebServicePost.java

 <4> 网络通信权限

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

           <uses-permission android:name="android.permission.INTERNET" />

项目结构和AndroidMainfest.xml:

界面(极为简陋,按个人自行喜好设定):

登陆界面:


注册界面:



在服务器端编程时我们了解到:服务器端接收客户端发送的信息,对信息进行一系列处理后,最终信息返回到客户端。

  首先要想的,就是获取信息并发送出去,然后接收信息并显示出来。

 (网络服务由于耗时问题,放在主线程很可能由于网络故障导致ANR;所以要开辟子线程留给http网络服务。当然不使用主线程也可以,只是不推荐)


代码:

Login.java 有两点需要注意

  第一个是在子线程中,不能更改主线程的页面值,这里用了handle解决。

  第二个是这里有get/post两种http请求方式,两个实现类,。


   
   
  1. package android.zdd.com.consql;
  2. import android.app.ProgressDialog;
  3. import android.content.Intent;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.view.accessibility.AccessibilityManager;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import android.zdd.com.web.WebServiceGet;
  14. public class Login extends AppCompatActivity implements View.OnClickListener{
  15. private EditText username;
  16. private EditText password;
  17. private Button login;
  18. private TextView info;
  19. private TextView register;
  20. //提示框
  21. private ProgressDialog dialog;
  22. //服务器返回的数据
  23. private String infoString;
  24. @Override
  25. protected void onCreate (Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_login);
  28. //初始化信息
  29. username = (EditText)findViewById(R.id.username);
  30. password = (EditText)findViewById(R.id.password);
  31. login = (Button)findViewById(R.id.btn_login);
  32. info = (TextView)findViewById(R.id.info);
  33. register = (TextView)findViewById(R.id.register);
  34. //设置按钮监听器
  35. login.setOnClickListener( this);
  36. register.setOnClickListener( this);
  37. }
  38. @Override
  39. public void onClick (View view) {
  40. switch (view.getId()){
  41. case R.id.btn_login:
  42. //设置提示框
  43. dialog = new ProgressDialog(Login. this);
  44. dialog.setTitle( "正在登陆");
  45. dialog.setMessage( "请稍后");
  46. dialog.setCancelable( false); //设置可以通过back键取消
  47. dialog.show();
  48. //设置子线程,分别进行Get和Post传输数据
  49. new Thread( new MyThread()).start();
  50. break;
  51. case R.id.register:
  52. //跳转注册页面
  53. Intent intent = new Intent(Login. this,Register.class);
  54. startActivity(intent);
  55. break;
  56. }
  57. }
  58. public class MyThread implements Runnable{
  59. @Override
  60. public void run () {
  61. infoString = WebServiceGet.executeHttpGet(username.getText().toString(),password.getText().toString(), "LogLet"); //获取服务器返回的数据
  62. //更新UI,使用runOnUiThread()方法
  63. showResponse(infoString);
  64. }
  65. }
  66. private void showResponse (final String response){
  67. runOnUiThread( new Runnable() {
  68. //更新UI
  69. @Override
  70. public void run () {
  71. if(response.equals( "false")){
  72. Toast.makeText(Login. this, "登陆失败!", Toast.LENGTH_SHORT).show();
  73. } else {
  74. info.setText(response);
  75. }
  76. dialog.dismiss();
  77. }
  78. });
  79. }
  80. }

Register.java


   
   
  1. package android.zdd.com.consql;
  2. import android.app.ProgressDialog;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.preference.DialogPreference;
  6. import android.support.v7.app.ActionBar;
  7. import android.support.v7.app.AlertDialog;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.zdd.com.web.WebServiceGet;
  15. import android.zdd.com.web.WebServicePost;
  16. public class Register extends AppCompatActivity implements View.OnClickListener{
  17. private EditText regUserName;
  18. private EditText regPassWord;
  19. private Button btn_reg;
  20. ProgressDialog dialog;
  21. @Override
  22. protected void onCreate (Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_register);
  25. //修改标题栏title
  26. ActionBar ac = getSupportActionBar();
  27. ac.setTitle( "注册");
  28. //初始化
  29. regUserName = (EditText)findViewById(R.id.regUserName);
  30. regPassWord = (EditText)findViewById(R.id.regPassWord);
  31. btn_reg = (Button)findViewById(R.id.btn_reg);
  32. btn_reg.setOnClickListener( this);
  33. }
  34. @Override
  35. public void onClick (View view) {
  36. switch (view.getId()){
  37. case R.id.btn_reg:
  38. dialog = new ProgressDialog(Register. this);
  39. dialog.setTitle( "正在注册");
  40. dialog.setMessage( "请稍后");
  41. dialog.show();
  42. new Thread( new RegThread()).start();
  43. break;
  44. }
  45. }
  46. public class RegThread implements Runnable{
  47. @Override
  48. public void run () {
  49. //获取服务器返回数据
  50. //String RegRet = WebServiceGet.executeHttpGet(regUserName.getText().toString(),regPassWord.getText().toString(),"RegLet");
  51. String RegRet = WebServicePost.executeHttpPost(regUserName.getText().toString(),regPassWord.getText().toString(), "RegLet");
  52. //更新UI,界面处理
  53. showReq(RegRet);
  54. }
  55. }
  56. private void showReq (final String RegRet){
  57. runOnUiThread( new Runnable() {
  58. @Override
  59. public void run () {
  60. if(RegRet.equals( "true")){
  61. dialog.dismiss();
  62. AlertDialog. Builder builder = new AlertDialog.Builder(Register. this);
  63. builder.setTitle( "注册信息");
  64. builder.setMessage( "注册成功");
  65. builder.setCancelable( false);
  66. builder.setPositiveButton( "OK", new DialogInterface.OnClickListener(){
  67. @Override
  68. public void onClick (DialogInterface dialogInterface, int i) {
  69. Intent intent = new Intent(Register. this,Login.class);
  70. startActivity(intent);
  71. }
  72. });
  73. builder.show();
  74. } else{
  75. dialog.dismiss();
  76. AlertDialog. Builder builder = new AlertDialog.Builder(Register. this);
  77. builder.setTitle( "注册信息");
  78. builder.setMessage( "注册失败");
  79. builder.setCancelable( false);
  80. builder.setPositiveButton( "OK", new DialogInterface.OnClickListener(){
  81. @Override
  82. public void onClick (DialogInterface dialogInterface, int i) {
  83. Intent intent = new Intent(Register. this,Login.class);
  84. startActivity(intent);
  85. }
  86. });
  87. builder.show();
  88. }
  89. }
  90. });
  91. }
  92. }

WebServiceGet.java  (Get实现) 

  这里的IP是你的服务器IP,就是你电脑的IP,cmd -> ipconfig查看本机IP地址。


   
   
  1. import android.util.Log;
  2. import java.io.BufferedReader;
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.net.HttpURLConnection;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. /**
  12. * 使用get方法获取Http服务器数据
  13. */
  14. public class WebServiceGet {
  15. public static String executeHttpGet(String username,String password,String address){
  16. HttpURLConnection connection = null;
  17. InputStream in = null;
  18. try{
  19. String Url = "http://169.254.58.31:8080/HelloWeb/" + address;
  20. String path = Url + "?username=" + username + "&password=" + password;
  21. try {
  22. URL url = new URL(path);
  23. connection = (HttpURLConnection)url.openConnection();
  24. connection.setRequestMethod("GET");
  25. connection.setConnectTimeout(10000);//建立连接超时
  26. connection.setReadTimeout(8000);//传递数据超时
  27. in = connection.getInputStream();
  28. return parseInfo(in);
  29. } catch (MalformedURLException e) {
  30. e.printStackTrace();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }catch (Exception e){
  35. e.printStackTrace();
  36. }finally {
  37. //意外退出时,连接关闭保护
  38. if(connection != null){
  39. connection.disconnect();
  40. }
  41. if(in != null){
  42. try{
  43. in.close();
  44. }catch (Exception e){
  45. e.printStackTrace();
  46. }
  47. }
  48. }
  49. return null;
  50. }
  51. //得到字节输入流,将字节输入流转化为String类型
  52. public static String parseInfo(InputStream inputStream){
  53. BufferedReader reader = null;
  54. String line = "";
  55. StringBuilder response = new StringBuilder();
  56. try {
  57. reader = new BufferedReader(new InputStreamReader(inputStream));
  58. while((line = reader.readLine()) != null){
  59. response.append(line);
  60. }
  61. return response.toString();
  62. }catch (Exception e){
  63. e.printStackTrace();
  64. }finally {
  65. if(reader != null){
  66. try{
  67. reader.close();
  68. }catch (Exception e){
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73. return null;
  74. }
  75. }

WebServicePost.java  (Post实现) 

  这里的IP是你的服务器IP,就是你电脑的IP,cmd -> ipconfig查看本机IP地址。



   
   
  1. package android.zdd.com.web;
  2. import android.util.Log;
  3. import java.io.BufferedReader;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.net.HttpURLConnection;
  9. import java.net.MalformedURLException;
  10. import java.net.URL;
  11. import java.net.URLEncoder;
  12. /**
  13. * 使用Post方法获取Http服务器数据
  14. */
  15. public class WebServicePost {
  16. public static String executeHttpPost (String username,String password,String address){
  17. HttpURLConnection connection = null;
  18. InputStream in = null;
  19. try{
  20. String Url = "http://169.254.58.31:8080/HelloWeb/" + address;
  21. try {
  22. URL url = new URL(Url);
  23. connection = (HttpURLConnection)url.openConnection();
  24. connection.setDoInput( true);
  25. connection.setDoOutput( true);
  26. connection.setRequestMethod( "POST");
  27. connection.setReadTimeout( 8000); //传递数据超时
  28. connection.setUseCaches( false);
  29. connection.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded");
  30. connection.connect();
  31. DataOutputStream out = new DataOutputStream(connection.getOutputStream());
  32. String data = "username=" + URLEncoder.encode(username, "UTF-8") + "&password=" + URLEncoder.encode(password, "UTF-8");
  33. out.writeBytes(data);
  34. out.flush();
  35. out.close();
  36. int resultCode = connection.getResponseCode();
  37. if(HttpURLConnection.HTTP_OK == resultCode) {
  38. in = connection.getInputStream();
  39. return parseInfo(in);
  40. }
  41. return null;
  42. } catch (MalformedURLException e) {
  43. e.printStackTrace();
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. } catch (Exception e){
  48. e.printStackTrace();
  49. } finally {
  50. //意外退出时,连接关闭保护
  51. if(connection != null){
  52. connection.disconnect();
  53. }
  54. if(in != null){
  55. try{
  56. in.close();
  57. } catch (Exception e){
  58. e.printStackTrace();
  59. }
  60. }
  61. }
  62. return null;
  63. }
  64. //得到字节输入流,将字节输入流转化为String类型
  65. public static String parseInfo (InputStream inputStream){
  66. BufferedReader reader = null;
  67. String line = "";
  68. StringBuilder response = new StringBuilder();
  69. try {
  70. reader = new BufferedReader( new InputStreamReader(inputStream));
  71. while((line = reader.readLine()) != null){
  72. Log.d( "RegisterActivity",line);
  73. response.append(line);
  74. }
  75. Log.d( "RegisterActivity", "response.toString():"+response.toString());
  76. return response.toString();
  77. } catch (Exception e){
  78. e.printStackTrace();
  79. } finally {
  80. if(reader != null){
  81. try{
  82. reader.close();
  83. } catch (Exception e){
  84. e.printStackTrace();
  85. }
  86. }
  87. }
  88. return null;
  89. }
  90. }

运行效果:

略。。。经测试可以成功,记得服务器本地附上mysql-jdbc.jar包

# 欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 [这儿][4].

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

[4]: http://adrai.github.io/flowchart.js/





借鉴原文地址:http://www.cnblogs.com/yzxk/p/4749440.html


先看两个概念:

1.android连接数据库的方式有两种

       1.通过连接服务器,再由服务器读取数据库来实现数据的增删改查,这也是我们常用的方式。

       2.android直接连接数据库,这种方式非常耗手机内存,而且容易被反编译造成安全隐患,所以在实际项目中不推荐使用。

2.连接服务器方式: http通信 、 Socket通信

Http通信:GET方式、POST方式

GET方式和POST方式的区别:

前者通过Http消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符。但是GET请求并不是一无是处——GET请求大多用于查询(读取资源),效率高。POST请求用于注册、登录等安全性较高且向数据库中写入数据的操作。

除了POST和GET,http通信还有其他方式!请参见http请求的方法。


Http与Scoket区别:

简单理解:一个单向,一个双向。(具体了解,自行google)


开发环境部署:

程序结构:

android+servlet+service+mysql

仅供参考:能实现相关功能即可

操作系统:win10

数据库:mysql    数据库工具:Navicat for MySql

服务器:tomcat      服务器工具: eclipse

安卓端:genymotion虚拟机  安卓端工具:Android Studio


数据库设计:



服务器设计:

1、新建Web Project,命名为HelloWeb

2、项目结构图如下:

 LogLet类和RegLet类分别用于处理客户端的登陆和注册请求;Service类用于完成servlet对数据库的具体操作;DBManager类用于进行数据库基本操作;

 左侧是项目图,右侧是web.xml配置文件截图。

   

3、项目代码:

 DBManager.java

 <1> 单例模式构建DBManager对象;       

 <2> 定义数据库连接、关闭以及增删改查的基本操作,返回结果集。



 
 
  1. package com.db;
  2. import java.sql.*;
  3. public class DBManager {
  4. // 数据库连接常量
  5. public static final String DRIVER = "com.mysql.jdbc.Driver";
  6. public static final String USER = "root";
  7. public static final String PASS = "root";
  8. public static final String URL = "jdbc:mysql://localhost:3306/test";
  9. // 静态成员,支持单态模式
  10. private static DBManager per = null;
  11. private Connection conn = null;
  12. private Statement stmt = null;
  13. // 单态模式-懒汉模式
  14. private DBManager () {
  15. }
  16. public static DBManager createInstance () {
  17. if (per == null) {
  18. per = new DBManager();
  19. per.initDB();
  20. }
  21. return per;
  22. }
  23. // 加载驱动
  24. public void initDB () {
  25. try {
  26. Class.forName( "com.mysql.jdbc.Driver");
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. // 连接数据库,获取句柄+对象
  32. public void connectDB () {
  33. System.out.println( "Connecting to database...");
  34. try {
  35. conn = DriverManager.getConnection(URL, USER, PASS);
  36. stmt = conn.createStatement();
  37. } catch (SQLException e) {
  38. e.printStackTrace();
  39. }
  40. System.out.println( "SqlManager:Connect to database successful.");
  41. }
  42. // 关闭数据库 关闭对象,释放句柄
  43. public void closeDB () {
  44. System.out.println( "Close connection to database..");
  45. try {
  46. stmt.close();
  47. conn.close();
  48. } catch (SQLException e) {
  49. e.printStackTrace();
  50. }
  51. System.out.println( "Close connection successful");
  52. }
  53. // 查询
  54. public ResultSet executeQuery (String sql) {
  55. ResultSet rs = null;
  56. try {
  57. rs = stmt.executeQuery(sql);
  58. } catch (SQLException e) {
  59. e.printStackTrace();
  60. }
  61. return rs;
  62. }
  63. // 增添/删除/修改
  64. public int executeUpdate (String sql) {
  65. int ret = 0;
  66. try {
  67. ret = stmt.executeUpdate(sql);
  68. } catch (SQLException e) {
  69. e.printStackTrace();
  70. }
  71. return ret;
  72. }
  73. }

LogLet.java

  一个简单的Servlet,用于处理Http请求(get/post)。


 
 
  1. package com.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.service.Service;
  9. public class LogLet extends HttpServlet{
  10. private static final long serialVersionUID = 9036889586892331384L;
  11. @Override
  12. protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //接受客户端信息
  14. String username = request.getParameter( "username");
  15. username = new String(username.getBytes( "ISO-8859-1"), "UTF-8");
  16. String password = request.getParameter( "password");
  17. password = new String(password.getBytes( "ISO-8859-1"), "UTF-8");
  18. System.out.println(username + ":" + password);
  19. //新建服务对象
  20. Service service = new Service();
  21. //验证处理
  22. boolean log = service.login(username, password);
  23. if( log ){
  24. System.out.println( "log success");
  25. //request.getSession().setAttribute("username", username);
  26. } else{
  27. System.out.println( "log fail");
  28. }
  29. //返回信息到客户端
  30. response.setCharacterEncoding( "UTF-8");
  31. response.setContentType( "text/html");
  32. PrintWriter out = response.getWriter();
  33. if( log ){
  34. out.print( "用户名:" + username);
  35. out.print( "密码: " + password);
  36. } else{
  37. out.print( "false");
  38. }
  39. out.flush();
  40. out.close();
  41. }
  42. @Override
  43. protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  44. // TODO 自动生成的方法存根
  45. }
  46. }

RegLet.java

  一个简单的Servlet,用于处理Http请求(get/post)。


 
 
  1. package com.servlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.service.Service;
  9. public class RegLet extends HttpServlet{
  10. private static final long serialVersionUID = 1L;
  11. @Override
  12. protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. // TODO 自动生成的方法存根
  14. }
  15. @Override
  16. protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. // TODO 自动生成的方法存根
  18. //接受客户端信息
  19. String username = request.getParameter( "username");
  20. username = new String(username.getBytes( "ISO-8859-1"), "UTF-8");
  21. String password = request.getParameter( "password");
  22. System.out.println(username + ":" + password);
  23. //新建服务对象
  24. Service service = new Service();
  25. //验证处理
  26. boolean reg = service.register(username, password);
  27. if( reg ){
  28. System.out.println( "reg success");
  29. //request.getSession().setAttribute("username", username);
  30. } else{
  31. System.out.println( "reg fail");
  32. }
  33. //返回信息到客户端
  34. response.setCharacterEncoding( "UTF-8");
  35. response.setContentType( "text/html");
  36. PrintWriter out = response.getWriter();
  37. if(reg){
  38. out.print( "true");
  39. } else{
  40. out.print( "false");
  41. }
  42. out.flush();
  43. out.close();
  44. }
  45. }

客户端设计:

现在开始思考需要什么东西... 

 <1> 登陆和注册页面:布局文件

   login.xml , register.xml

 <2> 登陆和注册页面对应的Activity组件,在activity中进行具体操作

   login.java , register.java

 <3> 能够实现Http以get/post方式通信的类

   WebService.java , WebServicePost.java

 <4> 网络通信权限

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

           <uses-permission android:name="android.permission.INTERNET" />

项目结构和AndroidMainfest.xml:

界面(极为简陋,按个人自行喜好设定):

登陆界面:


注册界面:



在服务器端编程时我们了解到:服务器端接收客户端发送的信息,对信息进行一系列处理后,最终信息返回到客户端。

  首先要想的,就是获取信息并发送出去,然后接收信息并显示出来。

 (网络服务由于耗时问题,放在主线程很可能由于网络故障导致ANR;所以要开辟子线程留给http网络服务。当然不使用主线程也可以,只是不推荐)


代码:

Login.java 有两点需要注意

  第一个是在子线程中,不能更改主线程的页面值,这里用了handle解决。

  第二个是这里有get/post两种http请求方式,两个实现类,。


 
 
  1. package android.zdd.com.consql;
  2. import android.app.ProgressDialog;
  3. import android.content.Intent;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.view.accessibility.AccessibilityManager;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import android.zdd.com.web.WebServiceGet;
  14. public class Login extends AppCompatActivity implements View.OnClickListener{
  15. private EditText username;
  16. private EditText password;
  17. private Button login;
  18. private TextView info;
  19. private TextView register;
  20. //提示框
  21. private ProgressDialog dialog;
  22. //服务器返回的数据
  23. private String infoString;
  24. @Override
  25. protected void onCreate (Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.activity_login);
  28. //初始化信息
  29. username = (EditText)findViewById(R.id.username);
  30. password = (EditText)findViewById(R.id.password);
  31. login = (Button)findViewById(R.id.btn_login);
  32. info = (TextView)findViewById(R.id.info);
  33. register = (TextView)findViewById(R.id.register);
  34. //设置按钮监听器
  35. login.setOnClickListener( this);
  36. register.setOnClickListener( this);
  37. }
  38. @Override
  39. public void onClick (View view) {
  40. switch (view.getId()){
  41. case R.id.btn_login:
  42. //设置提示框
  43. dialog = new ProgressDialog(Login. this);
  44. dialog.setTitle( "正在登陆");
  45. dialog.setMessage( "请稍后");
  46. dialog.setCancelable( false); //设置可以通过back键取消
  47. dialog.show();
  48. //设置子线程,分别进行Get和Post传输数据
  49. new Thread( new MyThread()).start();
  50. break;
  51. case R.id.register:
  52. //跳转注册页面
  53. Intent intent = new Intent(Login. this,Register.class);
  54. startActivity(intent);
  55. break;
  56. }
  57. }
  58. public class MyThread implements Runnable{
  59. @Override
  60. public void run () {
  61. infoString = WebServiceGet.executeHttpGet(username.getText().toString(),password.getText().toString(), "LogLet"); //获取服务器返回的数据
  62. //更新UI,使用runOnUiThread()方法
  63. showResponse(infoString);
  64. }
  65. }
  66. private void showResponse (final String response){
  67. runOnUiThread( new Runnable() {
  68. //更新UI
  69. @Override
  70. public void run () {
  71. if(response.equals( "false")){
  72. Toast.makeText(Login. this, "登陆失败!", Toast.LENGTH_SHORT).show();
  73. } else {
  74. info.setText(response);
  75. }
  76. dialog.dismiss();
  77. }
  78. });
  79. }
  80. }

Register.java


 
 
  1. package android.zdd.com.consql;
  2. import android.app.ProgressDialog;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.preference.DialogPreference;
  6. import android.support.v7.app.ActionBar;
  7. import android.support.v7.app.AlertDialog;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.zdd.com.web.WebServiceGet;
  15. import android.zdd.com.web.WebServicePost;
  16. public class Register extends AppCompatActivity implements View.OnClickListener{
  17. private EditText regUserName;
  18. private EditText regPassWord;
  19. private Button btn_reg;
  20. ProgressDialog dialog;
  21. @Override
  22. protected void onCreate (Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_register);
  25. //修改标题栏title
  26. ActionBar ac =
    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值