做安卓开发有很多时候都是要和web交互的,我们很难制作本地应用,这次把小弟整出来的安卓和服务器通讯贡献出来,希望能帮到需要的朋友,同时也是加深印象。

我们先来搭建安卓客户端,首先写好布局文件:

1.布局文件Register.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:background="@drawable/fuction_fond_bg"
  6. android:orientation="vertical" >
  7. <ImageView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:src="@drawable/setting_btn" >
  11. </ImageView>
  12. <ScrollView
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content" >
  15. <LinearLayout
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content"
  18. android:layout_gravity="center_horizontal"
  19. android:orientation="vertical" >
  20. <TextView
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. android:text="请输入您的注册信息:"
  24. android:textColor="#6495ED"
  25. android:textSize="20dip" >
  26. </TextView>
  27. <View
  28. android:layout_width="fill_parent"
  29. android:layout_height="2dip"
  30. android:background="#FF909090" />
  31. <LinearLayout
  32. android:layout_width="fill_parent"
  33. android:layout_height="wrap_content"
  34. android:layout_margin="20dip"
  35. android:background="#FFFFFF"
  36. android:orientation="vertical"
  37. android:padding="10dp" >
  38. <LinearLayout
  39. android:layout_width="wrap_content"
  40. android:layout_height="wrap_content"
  41. android:orientation="horizontal" >
  42. <TextView
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:text="帐   号:  "
  46. android:textColor="#6495ED" >
  47. </TextView>
  48. <EditText
  49. android:id="@+id/username"
  50. android:layout_width="190dip"
  51. android:layout_height="wrap_content" >
  52. </EditText>
  53. </LinearLayout>
  54. <View
  55. android:layout_width="fill_parent"
  56. android:layout_height="2dip"
  57. android:background="#FF909090" />
  58. <LinearLayout
  59. android:layout_width="wrap_content"
  60. android:layout_height="wrap_content"
  61. android:orientation="horizontal" >
  62. <TextView
  63. android:layout_width="wrap_content"
  64. android:layout_height="wrap_content"
  65. android:text="密   码:  "
  66. android:textColor="#6495ED" >
  67. </TextView>
  68. <EditText
  69. android:id="@+id/password"
  70. android:layout_width="190dip"
  71. android:layout_height="wrap_content"
  72. android:password="true" >
  73. </EditText>
  74. </LinearLayout>
  75. <View
  76. android:layout_width="fill_parent"
  77. android:layout_height="2dip"
  78. android:background="#FF909090" />
  79. <LinearLayout
  80. android:layout_width="wrap_content"
  81. android:layout_height="wrap_content"
  82. android:orientation="horizontal" >
  83. <TextView
  84. android:layout_width="wrap_content"
  85. android:layout_height="wrap_content"
  86. android:text="确认密码 :  "
  87. android:textColor="#6495ED" >
  88. </TextView>
  89. <EditText
  90. android:id="@+id/confirmpsw"
  91. android:layout_width="190dip"
  92. android:layout_height="wrap_content"
  93. android:password="true" >
  94. </EditText>
  95. </LinearLayout>
  96. <View
  97. android:layout_width="fill_parent"
  98. android:layout_height="2dip"
  99. android:background="#FF909090" />
  100. <LinearLayout
  101. android:layout_width="wrap_content"
  102. android:layout_height="wrap_content"
  103. android:orientation="horizontal" >
  104. <TextView
  105. android:layout_width="wrap_content"
  106. android:layout_height="wrap_content"
  107. android:text="昵   称:  "
  108. android:textColor="#6495ED" >
  109. </TextView>
  110. <EditText
  111. android:id="@+id/nikename"
  112. android:layout_width="190dip"
  113. android:layout_height="wrap_content" >
  114. </EditText>
  115. </LinearLayout>
  116. <View
  117. android:layout_width="fill_parent"
  118. android:layout_height="2dip"
  119. android:background="#FF909090" />
  120. <LinearLayout
  121. android:layout_width="wrap_content"
  122. android:layout_height="wrap_content"
  123. android:orientation="horizontal" >
  124. <TextView
  125. android:layout_width="wrap_content"
  126. android:layout_height="wrap_content"
  127. android:layout_marginTop="5dp"
  128. android:text="性   别:  "
  129. android:textColor="#6495ED" >
  130. </TextView>
  131. <RadioGroup
  132. android:id="@+id/gender_group_rb"
  133. android:layout_width="fill_parent"
  134. android:layout_height="wrap_content"
  135. android:orientation="horizontal" >
  136. <RadioButton
  137. android:id="@+id/male_rb"
  138. android:layout_width="wrap_content"
  139. android:layout_height="wrap_content"
  140. android:text="男 "
  141. android:textColor="#6495ED" >
  142. </RadioButton>
  143. <RadioButton
  144. android:id="@+id/female_rb"
  145. android:layout_width="wrap_content"
  146. android:layout_height="wrap_content"
  147. android:text="女"
  148. android:textColor="#6495ED" >
  149. </RadioButton>
  150. </RadioGroup>
  151. </LinearLayout>
  152. <LinearLayout
  153. android:layout_width="wrap_content"
  154. android:layout_height="wrap_content"
  155. android:orientation="horizontal" >
  156. <ImageView
  157. android:layout_width="fill_parent"
  158. android:layout_height="wrap_content" >
  159. </ImageView>
  160. </LinearLayout>
  161. <View
  162. android:layout_width="fill_parent"
  163. android:layout_height="2dip"
  164. android:background="#FF909090" />
  165. <Button
  166. android:id="@+id/register_btn"
  167. android:layout_width="fill_parent"
  168. android:layout_height="40dp"
  169. android:layout_margin="10dp"
  170. android:background="@drawable/new_button_bg"
  171. android:gravity="center"
  172. android:text="注 册" />
  173. </LinearLayout>
  174. </LinearLayout>
  175. </ScrollView>
  176. </LinearLayout>

2.Activity文件:RegisterActivity.java

为了让大家看得方便,我逐个为大家讲解:

1.初始化视图控件:

  1. /**
  2. * 初始化视图控件
  3. */
  4. private void initView() {
  5. username_et = (EditText) findViewById(R.id.username);
  6. password_et = (EditText) findViewById(R.id.password);
  7. confirmpsw_et = (EditText) findViewById(R.id.confirmpsw);
  8. nikename_et = (EditText) findViewById(R.id.nikename);
  9. register_btn = (Button) findViewById(R.id.register_btn);
  10. register_btn.setOnClickListener(listener);
  11. gender_group_rb = (RadioGroup) findViewById(R.id.gender_group_rb);
  12. gender_group_rb.setOnCheckedChangeListener(checkListener);
  13. }

2.当我们填写好数据后,点击注册按钮,调用注册这个方法:

  1. /**
  2. * 注册按钮的点击
  3. */
  4. private OnClickListener listener = new OnClickListener() {
  5. @Override
  6. public void onClick(View v) {
  7. doRegister();
  8. }
  9. };
  10. /**
  11. * 开始注册
  12. */
  13. private void doRegister() {
  14. pd = ProgressDialog.show(RegisterActivity.this, "正在注册..",
  15. "正在注册中..请稍后....", true, true);
  16. // 1.获取数据
  17. username = username_et.getText().toString();
  18. password = password_et.getText().toString();
  19. confirmpsw = confirmpsw_et.getText().toString();
  20. nickname = nikename_et.getText().toString();
  21. // 2.进行校验,不对返回,否则继续
  22. if (checkNull(username) || checkNull(password) || checkNull(confirmpsw)
  23. || checkNull(gender) || checkNull(nickname)) {
  24. Toast.makeText(this, "请填写完整数据", Toast.LENGTH_SHORT).show();
  25. // TODO 这里本应该完整校验的,暂时偷懒
  26. return;
  27. }
  28. // 3.开始向服务器注册
  29. Thread thread = new Thread(registerRunnable);
  30. thread.start();
  31. }

因为做的比较简陋,详细的表单校验没有写,点击注册开启一个子线程来处理和服务器打交道的耗时操作。在注册的过程中用的httpUrlConnection连接服务器,向服务器提交注册信息。

  1. /**
  2. * 开始注册的线程
  3. */
  4. Runnable registerRunnable = new Runnable() {
  5. @Override
  6. public void run() {
  7. // 1.拼装数据
  8. StringBuilder sb = new StringBuilder();
  9. sb.append("<users>");
  10. sb.append("<user>");
  11. sb.append("<username>");
  12. sb.append(username);
  13. sb.append("</username>");
  14. sb.append("<password>");
  15. sb.append(password);
  16. sb.append("</password>");
  17. sb.append("<nickname>");
  18. sb.append(nickname);
  19. sb.append("</nickname>");
  20. sb.append("<gender>");
  21. sb.append(gender);
  22. sb.append("</gender>");
  23. sb.append("</user>");
  24. sb.append("</users>");
  25. // 2.开始写数据
  26. byte content[] = sb.toString().getBytes();
  27. try {
  28. URL url = new URL(Constant.REGISTER_SERVLET);
  29. HttpURLConnection conn = (HttpURLConnection) url
  30. .openConnection();
  31. conn.setDoInput(true);
  32. conn.setDoOutput(true);
  33. conn.setRequestMethod("POST");
  34. conn.setRequestProperty("Content-Type", "mutipart/form-data");
  35. conn.setRequestProperty("Content-Length", content.length + "");
  36. conn.getOutputStream().write(content);
  37. // 3.获取服务器返回的数据
  38. if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
  39. InputStream in = conn.getInputStream();
  40. RegisterResultTool resultTool = new RegisterResultTool();
  41. String result = resultTool.getResultFromInputStream(in);
  42. // 4.提交结果
  43. Message msg = new Message();
  44. msg.obj = result;
  45. msg.what = 200;
  46. registerResultHandler.sendMessage(msg);
  47. }
  48. } catch (IOException e) {
  49. Message msg = new Message();
  50. msg.what = 400;
  51. registerResultHandler.sendMessage(msg);
  52. e.printStackTrace();
  53. }
  54. pd.cancel();
  55. }
  56. };

向服务器提交数据后,服务器会返回一些结果数据,我们就需要处理这些结果数据:

  1. /**
  2. * 处理服务器返回结果的类
  3. *
  4. * @author Larson
  5. *
  6. */
  7. private class RegisterResultTool {
  8. /**
  9. * 从服务器返回的数据中读取返回结果
  10. *
  11. * @param in
  12. * @return
  13. */
  14. public String getResultFromInputStream(InputStream in) {
  15. String result = "";
  16. SAXParserFactory sf = SAXParserFactory.newInstance();
  17. try {
  18. XMLReader xr = sf.newSAXParser().getXMLReader();
  19. RegisterResultHandler rrh = new RegisterResultHandler();
  20. xr.setContentHandler(rrh);
  21. xr.parse(new InputSource(in));
  22. result = rrh.getResult();
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. return result;
  27. }
  28. }
  29. /**
  30. * 因为服务器返回的是xml形式,所以需要解析
  31. *
  32. * @author Larson
  33. *
  34. */
  35. private class RegisterResultHandler extends DefaultHandler {
  36. /**
  37. * 获得的服务器返回结果
  38. */
  39. private String result;
  40. /**
  41. * 临时存取数据的变量
  42. */
  43. private String var="";
  44. /**
  45. * 获取返回值
  46. *
  47. * @return
  48. */
  49. public String getResult() {
  50. return result;
  51. }
  52. @Override
  53. public void startElement(String uri, String localName, String qName,
  54. Attributes attributes) throws SAXException {
  55. super.startElement(uri, localName, qName, attributes);
  56. }
  57. @Override
  58. public void characters(char[] ch, int start, int length)
  59. throws SAXException {
  60. var += new String(ch, start, length);
  61. super.characters(ch, start, length);
  62. }
  63. @Override
  64. public void endElement(String uri, String localName, String qName)
  65. throws SAXException {
  66. /**
  67. * 取出info标签的数据(服务器返回的注册结果)
  68. */
  69. if (qName.equals("info")) {
  70. result = var.trim();
  71. }
  72. super.endElement(uri, localName, qName);
  73. }
  74. }

获取结果后,在handler中刷新ui通知用户:

  1. /**
  2. * 处理返回结果的handler
  3. * 如果返回的数据是服务器给的成功数据,注册成功,否则就是服务器有问题
  4. */
  5. private Handler registerResultHandler = new Handler() {
  6. public void handleMessage(Message msg) {
  7. System.out.println(msg.obj+"-------------"+msg.what);
  8. switch (msg.what) {
  9. case 400:
  10. Toast.makeText(RegisterActivity.this, "注册失败.", Toast.LENGTH_SHORT).show();
  11. break;
  12. case 200:
  13. String str = (String) msg.obj;
  14. if(str.contains("regist_ok"))
  15. Toast.makeText(RegisterActivity.this, "注册成功.", Toast.LENGTH_SHORT).show();
  16. else
  17. Toast.makeText(RegisterActivity.this, "服务器未开放.", Toast.LENGTH_SHORT).show();
  18. break;
  19. default:
  20. break;
  21. }
  22. };
  23. };

接下来我们来写服务器端:

服务器段用registerServlet处理客户端请求:registerServlet.java:

  1. package com.larson.pm;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.PrintWriter;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import com.larson.tools.RegisterResultTool;
  10. public class RegisterServlet extends HttpServlet {
  11. public void doGet(HttpServletRequest request, HttpServletResponse response)
  12. throws ServletException, IOException {
  13. }
  14. public void doPost(HttpServletRequest request, HttpServletResponse response)
  15. throws ServletException, IOException {
  16. //1.获取输入输出流
  17. response.setContentType("text/html;charset=UTF-8");
  18. PrintWriter out = response.getWriter();
  19. InputStream in = request.getInputStream();
  20. //2.处理客户端发送的数据
  21. RegisterResultTool tool = new RegisterResultTool();
  22. String result = tool.register(in);
  23. //3.向客户端写相应数据
  24. out.write(result);
  25. out.flush();
  26. out.close();
  27. in.close();
  28. }
  29. }

servlet拿到客户端的数据inputStream,用一个工具类RegisterResultTool.java处理这些数据:

  1. package com.larson.tools;
  2. import java.io.InputStream;
  3. import javax.xml.parsers.SAXParserFactory;
  4. import org.xml.sax.InputSource;
  5. import org.xml.sax.XMLReader;
  6. import com.larson.bean.UserInfo;
  7. import com.larson.daoimpl.UserDao;
  8. import com.larson.handler.RegisterHandler;
  9. /**
  10. * 处理客户端发送过来数据的类
  11. *
  12. * @author Larson
  13. *
  14. */
  15. public class RegisterResultTool {
  16. /**
  17. * 处理客户端发送过来数据的类
  18. * @param in
  19. *            客户端的流
  20. * @return 处理结果
  21. */
  22. public String register(InputStream in) {
  23. String result = null;
  24. StringBuilder sb = new StringBuilder();
  25. //1.获取解析工厂
  26. SAXParserFactory factory = SAXParserFactory.newInstance();
  27. XMLReader reader= null;
  28. try {
  29. //2.自定义解析过程
  30. reader = factory.newSAXParser().getXMLReader();
  31. RegisterHandler handler = new RegisterHandler();
  32. reader.setContentHandler(handler);
  33. //3.开始解析客户端过来的输入流,并把数据封装到userInfo的bean中
  34. reader.parse(new InputSource(in));
  35. UserInfo user = handler.getUser();
  36. //4.往服务器的数据库添加一条用户信息
  37. UserDao dao = new UserDao();
  38. dao.add(user);
  39. //5.完成后给客户端反馈消息
  40. sb.append("<info>");
  41. sb.append("regist_ok");
  42. sb.append("</info>");
  43. } catch (Exception e) {
  44. //TODO 解析失败
  45. sb.append("<info>");
  46. sb.append("regist_fail");
  47. sb.append("</info>");
  48. e.printStackTrace();
  49. }
  50. result = sb.toString();
  51. return result;
  52. }
  53. }

再次过程中,我们需要自定义一个sax解析xml的handler对数据进行处理封装到bean文件中:

RegisterHandler.java:

  1. package com.larson.handler;
  2. import org.xml.sax.Attributes;
  3. import org.xml.sax.SAXException;
  4. import org.xml.sax.helpers.DefaultHandler;
  5. import com.larson.bean.UserInfo;
  6. public class RegisterHandler extends DefaultHandler {
  7. private UserInfo user;
  8. private String var="";
  9. @Override
  10. public void startElement(String uri, String localName, String qName,
  11. Attributes attributes) throws SAXException {
  12. //遇到user标签就表示是一个user对象
  13. if(qName.equals("user"))
  14. user = new UserInfo();
  15. super.startElement(uri, localName, qName, attributes);
  16. }
  17. @Override
  18. public void endElement(String uri, String localName, String qName)
  19. throws SAXException {
  20. if("username".equals(qName))
  21. user.setUsername(var);
  22. if("password".equals(qName))
  23. user.setPassword(var);
  24. if("nickname".equals(qName))
  25. user.setNickname(var);
  26. if("gender".equals(qName))
  27. user.setGender(var);
  28. //设置完临时属性置空
  29. var="";
  30. super.endElement(uri, localName, qName);
  31. }
  32. @Override
  33. public void characters(char[] ch, int start, int length)
  34. throws SAXException {
  35. var+=new String(ch, start, length);
  36. super.characters(ch, start, length);
  37. }
  38. /**
  39. * 获取填充完属性的user对象
  40. * @return
  41. */
  42. public UserInfo getUser() {
  43. return user;
  44. }
  45. }

,处理完毕以后,需要把这些数据写入到数据库,生成一条新的用户信息记录,因此需要些一个UserDao。,而我们习惯性用jdbcutils管理连接,这里为了代码可重用更好,我把所有修改的方法集合到一个update方法里面:JdbcUtils.java:

  1. package com.larson.tools;
  2. import java.io.InputStream;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.sql.Statement;
  9. import java.util.Properties;
  10. import com.larson.handler.ResultSetHandler;
  11. /**
  12. * 数据库相关
  13. * @author Larson
  14. *
  15. */
  16. public class JdbcUtils {
  17. //    private static ComboPooledDataSource ds = null;
  18. private static Connection conn;
  19. static{
  20. try{
  21. InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
  22. Properties properties = new Properties();
  23. properties.load(in);
  24. String url = properties.getProperty("url");
  25. String user = properties.getProperty("user");
  26. String passwd  = properties.getProperty("password");
  27. String driver =  properties.getProperty("driver");
  28. Class.forName(driver);
  29. conn = DriverManager.getConnection(url, user, passwd);
  30. //          ds = new ComboPooledDataSource();
  31. //          ds.setDriverClass(driver);
  32. //          ds.setJdbcUrl(url);
  33. //          ds.setUser(user);
  34. //          ds.setPassword(passwd);
  35. //
  36. //          ds.setInitialPoolSize(10);
  37. //          ds.setMinPoolSize(5);
  38. //          ds.setMaxPoolSize(20);
  39. //
  40. //          ds = new ComboPooledDataSource();
  41. }catch (Exception e) {
  42. throw new ExceptionInInitializerError(e);
  43. }
  44. }
  45. /**
  46. * 获取连接
  47. * @return
  48. * @throws SQLException
  49. */
  50. public static Connection getConnection() throws SQLException{
  51. //      return ds.getConnection();
  52. return conn;
  53. }
  54. /**
  55. * 释放连接
  56. * @param conn
  57. * @param st
  58. * @param rs
  59. */
  60. public static void release(Connection conn,Statement st,ResultSet rs){
  61. if(rs!=null){
  62. try{
  63. rs.close();
  64. }catch (Exception e) {
  65. e.printStackTrace();
  66. }
  67. rs = null;
  68. }
  69. if(st!=null){
  70. try{
  71. st.close();
  72. }catch (Exception e) {
  73. e.printStackTrace();
  74. }
  75. }
  76. if(conn!=null){
  77. try{
  78. conn.close();
  79. }catch (Exception e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. }
  84. /**
  85. * 替换dao中的增删改方法
  86. * @param sql
  87. * @param params
  88. * @throws SQLException
  89. */
  90. public static void update(String sql,Object params[]) throws SQLException{
  91. Connection conn = null;
  92. PreparedStatement st = null;
  93. ResultSet rs = null;
  94. try{
  95. conn = getConnection();
  96. st = conn.prepareStatement(sql);
  97. for(int i=0;i<params.length;i++){
  98. st.setObject(i+1, params[i]);
  99. }
  100. st.executeUpdate();
  101. }finally{
  102. release(conn, st, rs);
  103. }
  104. }
  105. /**
  106. * 替换所有dao中的查询   策略模式
  107. * @param sql
  108. * @param params
  109. * @param rsh
  110. * @return
  111. * @throws SQLException
  112. */
  113. public static Object query(String sql,Object params[],ResultSetHandler rsh) throws SQLException{
  114. Connection conn = null;
  115. PreparedStatement st = null;
  116. ResultSet rs = null;
  117. try{
  118. conn = getConnection();
  119. st = conn.prepareStatement(sql);
  120. for(int i=0;i<params.length;i++){
  121. st.setObject(i+1, params[i]);
  122. }
  123. rs = st.executeQuery();
  124. return rsh.handler(rs);
  125. }finally{
  126. release(conn, st, rs);
  127. }
  128. }
  129. }

然后便是UserDao.java:

  1. package com.larson.daoimpl;
  2. import com.larson.bean.UserInfo;
  3. import com.larson.exception.DaoException;
  4. import com.larson.handler.BeanHandler;
  5. import com.larson.tools.JdbcUtils;
  6. public class UserDao {
  7. public void add(UserInfo user) {
  8. try {
  9. String sql = "insert into user(username,password,gender,nickname) values(?,?,?,?)";
  10. Object params[] = {  user.getUsername(),
  11. user.getPassword(), user.getGender(),user.getNickname() };
  12. for(Object obj:params)
  13. System.out.println("userdao add---"+obj);
  14. JdbcUtils.update(sql, params);
  15. } catch (Exception e) {
  16. throw new DaoException(e);
  17. }
  18. }
  19. public void update(UserInfo user) {
  20. try {
  21. String sql = "update user set user=?,password=?,gender=?,nickname=? where id=?";
  22. Object params[] = { user.getId(), user.getUsername(),
  23. user.getPassword(), user.getNickname(), user.getId() };
  24. JdbcUtils.update(sql, params);
  25. } catch (Exception e) {
  26. throw new DaoException(e);
  27. }
  28. }
  29. public void delete(String id) {
  30. try {
  31. String sql = "delete from user where id=?";
  32. Object params[] = { id };
  33. JdbcUtils.update(sql, params);
  34. } catch (Exception e) {
  35. throw new DaoException(e);
  36. }
  37. }
  38. public UserInfo find(String id) {
  39. try {
  40. String sql = "select * from user where id=?";
  41. Object params[] = { id };
  42. return (UserInfo) JdbcUtils.query(sql, params, new BeanHandler(
  43. UserInfo.class));
  44. } catch (Exception e) {
  45. throw new DaoException(e);
  46. }
  47. }
  48. }

为了方便,我把bean文件也贴出来:

userInfo.java:

  1. package com.larson.bean;
  2. public class UserInfo {
  3. private int id;
  4. private String username;
  5. private String password;
  6. private String gender;
  7. private String nickname;
  8. public String getUsername() {
  9. return username;
  10. }
  11. public void setUsername(String username) {
  12. this.username = username;
  13. }
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public String getPassword() {
  21. return password;
  22. }
  23. public void setPassword(String password) {
  24. this.password = password;
  25. }
  26. public String getGender() {
  27. return gender;
  28. }
  29. public void setGender(String gender) {
  30. this.gender = gender;
  31. }
  32. public String getNickname() {
  33. return nickname;
  34. }
  35. public void setNickname(String nickname) {
  36. this.nickname = nickname;
  37. }
  38. }

本来准备用数据库连接池的,可是老是报错,就是上面注释的那几行,有懂的人麻烦告诉我,感激不尽。

让你的APP和你的服务器畅快通讯的更多相关文章

  1. web服务器、app(应用)服务器、DB后端性能瓶颈和分析

    性能测试day07_性能瓶颈和分析 https://www.cnblogs.com/leixiaobai/p/9463748.html 其实如果之前都做的很到位的话,那么再加上APM工具(dynaTr ...

  2. TCP/IP协议学习(七) 基于C# Socket的Web服务器---动态通讯实现

    目录 (1).基于Ajax的前端实现 (2).Web服务器后端处理 一个完整的web服务器,不仅需要满足用户端对于图片.文档等资源的需求:还能够对于用户端的动态请求,返回指定程序生成的数据.支持动态请 ...

  3. JavaWeb-SpringBoot(抖音)_二、服务器间通讯

    JavaWeb-SpringBoot(抖音)_一.抖音项目制作 传送门 JavaWeb-SpringBoot(抖音)_二.服务器间通讯 传送门 JavaWeb-SpringBoot(抖音)_三.抖音项 ...

  4. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  5. 27.app后端搭建聊天服务器的经历

    现在,聊天功能已经成了社交app的标配了.但是,众多web开发出生的程序员对聊天相关的服务的不了解,带来了很多开发上的困扰.在这篇文章中,根据下面3个方面,谈谈聊天服务. 1.      聊天服务的技 ...

  6. 9.app后端选择什么服务器

    对于很多刚入行的朋友来说,不清楚应该选择什么样的服务器提供商,是选择传统的IDC, 租用服务器租用机柜,还是选择现在很火的云服务器呢?在本文中,通过对比传统的IDC和云服务,简单阐述一下服务器的选择. ...

  7. iOS 开发App捕获异常, 反馈给服务器, 提高用户体验

    在我们开发的app中, 不可避免的, 有时候用户使用软件会崩溃.  我们就需要捕获异常, 可以在入口类中加入相应的代码, 可以在每次用户打开程序的时候, 检查一下沙盒中是否有崩溃日志, 如果有, 可以 ...

  8. app页面连接到服务器的数据库

    第一步在服务器上写好servlet用于和数据库交互,目前我只写了添加. 第二步app端使用HttpURLConnection连接交互. 效果图: 增加了一条数据:第十一条

  9. 使用h5开发跨平台APP确保数据安全交互---服务器篇

    从eclipse到android studio的安卓开发经验告诉我原声开发才是硬道理,其实以前很抵触html5开发app的,虽然没有去了解过,但是冥冥中就觉得它运行速度太慢了,加载渲染根本比不上原生开 ...

随机推荐

  1. 阿里的STORM——JSTORM

    看介绍文档貌似挺好:https://github.com/alibaba/jstorm   阿里拥有自己的实时计算引擎 类似于hadoop 中的MR 开源storm响应太慢 开源社区的速度完全跟不上A ...

  2. 初识EntityFramework6

    初识EntityFramework6 什么是EF? EF是一种ORM(Object-relational mapping)框架,它能把我们在编程时使用对象映射到底层的数据库结构.比如,你可以在数据库中 ...

  3. MediaPlayer 状态机 API 详解 示例

    简介 public class android.media.MediaPlayer extends Object implements VolumeAutomation 可能需要的权限: One ma ...

  4. scala 学习笔记十三 特质(转载)

    转载地址:https://blog.csdn.net/dwb1015/article/details/51761510 1,介绍 Scala和java一样不允许类从多个超类继承:从多个超类继承可能会导 ...

  5. 【leetcode】 9. palindrome number

    @requires_authorization @author johnsondu @create_time 2015.7.13 9:48 @url [palindrome-number](https ...

  6. SELinux安全系统基础

    一.SELinux简介 SELinux(Secure Enhanced Linux)安全增强的Linux是由美国国家安全局NSA针对计算机基础结构安全开发的一个全新的Linux安全策略机制.SELin ...

  7. 免费素材-Helium (AI, EPS, SVG, Icon Font)

    在线演示 在线演示 本地下载 我很高兴和大家分享今天的素材-Helium.它有多种格式可供下载(AI, EPS, SVG, Icon Font) ,内容包含曲线.飞行器.上传下载.喇叭等类型.

  8. C#.NET常见问题(FAQ)-找不到类型或命名空间名称“ManagementBaseObject”怎么办

    如下图所示,虽然添加了using System.Management,还是报错   System.Management似乎跟普通的命名空间不太一样,这个项目还需要添加.右击这个项目的csproj文件, ...

  9. Android 之 AndroidManifest.xml 详解(二)

    [10]<activity> Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声 ...

  10. PHP Mysql-连接

    PHP 连接 MySQL PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi extension ("i" 意为 improved) PDO (PHP Dat ...