Tomact和MySql搭建android简单服务器
之前已經寫了怎么搭建eclipse加tomcat整合成服務器環境,如果有人不知道怎么配置,可以看我的那篇博客。
?
現在環境搭配好的情況下,在eclipse里新建一個Web工程,在src包下新建一個servlet。
@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {?
??? private static final long serialVersionUID = 1L;
???
??? //============add
??? List<String> mList=new ArrayList<>();
??? private StringBuffer UIDS;
??
??? public UserServlet() {?
??????? super();?
??? }?
??? public void doGet(HttpServletRequest request, HttpServletResponse response)?
??????????? throws ServletException, IOException {?
??? ?
??? ?//在服務器端解決中文亂碼問題??
??? ?response.setContentType("text/html;charset=utf-8");
??????? request.setCharacterEncoding("utf-8");
??? ?response.setCharacterEncoding("utf-8");
??????? if(request.getParameter("userName")==null || request.getParameter("passWord")==null){
??????? ?return;
??????? }
??????? String userName="",passWord="";
???????
//??????? //根據請求類型解決中文亂碼問題
??????? if(request.getMethod().equalsIgnoreCase("GET")) {??
??????? ? userName = new String(request.getParameter("userName").getBytes("iso-8859-1"),"utf-8");
???????????? passWord = new String(request.getParameter("passWord").getBytes("iso-8859-1"),"utf-8");
??????? }else{
??????? ? userName = new String(request.getParameter("userName").getBytes());
???????????? passWord = new String(request.getParameter("passWord").getBytes());
??????? }
???????
??????? System.out.println("賬號:"+userName);?
??????? System.out.println("密碼:"+passWord);
???????
??????? //連接數據庫,使用局部變量防止并發問題
??????? selectUser(userName,passWord,response);
??????
??? }????
???
?protected void doPost(HttpServletRequest request,?
??????????? HttpServletResponse response) throws ServletException, IOException {?
??????? this.doGet(request, response);?
??? }?
???
?private void selectUser(String userName,final String passWord,HttpServletResponse response) {
?? List<Person> persons=new ArrayList<>();
?? JDBCUtil j=new JDBCUtil();
????? String? sql="select * from user where account = '"+userName+"' and password = '"+passWord+"'";
????? //新建一個json數據返回客戶端
????? String jsonString="";
????? try {
???? ? ResultSet rs=j.query(sql);
???? ? if(rs.next()){
???? ?? System.out.println("id"+"\t"+"賬號"+"\t"+"密碼"+"\t"+"攝像機名稱"+"\t"+"UID"+"\t"+"用戶名"+"\t"+"用戶密碼"+"\t");
???? ?? rs.previous();
???? ? }
???? ? while(rs.next()){
????int id=rs.getInt(1);
????String n=rs.getString(2);
????String s=rs.getString(3);
????String cname=rs.getString(4);
????? ?String UID=rs.getString(5);
????? ?String name=rs.getString(6);
????? ?String cpassword=rs.getString(7);
????System.out.println(id+"\t"+n+"\t"+s+"\t"+cname+"\t"+UID+"\t"+name+"\t"+cpassword+"\t");
????Person person=new Person(id,n,s,cname,UID,name,cpassword);
????persons.add(person);
????}
???
???//判斷查詢結果
???if(persons.size()>0){
????jsonString = JsonTools.createJsonString("strings",DataUtil.getPersons(persons));
????response.getWriter().print(jsonString);
????persons.clear();
?????
???}else{
????response.getOutputStream().print("fail");
???}
??} catch (Exception e) {
??// TODO: handle exception
??}finally {
????j.close();
???}
??
?}
}?
在servlet里用到了一個實體類Person.
public class Person {
?int id;
?String account;
?String password;
?String name;
?String uid;
?String cname;
?String cpassword;
?public Person() {
??// TODO Auto-generated constructor stub
?}
?
?public Person(int id, String account, String password, String name, String uid, String cname, String cpassword) {
??super();
??this.id = id;
??this.account = account;
??this.password = password;
??this.name = name;
??this.uid = uid;
??this.cname = cname;
??this.cpassword = cpassword;
?}
?
?public int getId() {
??return id;
?}
?
?public void setId(int id) {
??this.id = id;
?}
?
?public String getAccount() {
??return account;
?}
?
?public void setAccount(String account) {
??this.account = account;
?}
?
?public String getPassword() {
??return password;
?}
?
?public void setPassword(String password) {
??this.password = password;
?}
?
?public String getName() {
??return name;
?}
?
?public void setName(String name) {
??this.name = name;
?}
?
?public String getUid() {
??return uid;
?}
?
?public void setUid(String uid) {
??this.uid = uid;
?}
?
?public String getCname() {
??return cname;
?}
?
?public void setCname(String cname) {
??this.cname = cname;
?}
?
?public String getCpassword() {
??return cpassword;
?}
?
?public void setCpassword(String cpassword) {
??this.cpassword = cpassword;
?}
//?String id;
//?String account;
//?String password;
//?String name;
//?String uid;
//?String cname;
//?String cpassword;
?@Override
?public String toString() {
??return "Person [id=" + id + ", account=" + account + ", password=" + password
????+ ", name=" + name + ", uid=" + uid +", cname=" + cname +", cpassword=" + cpassword? +"]";
?}
}
?
然后根據接收的用戶名和密碼查找數據庫,所有首先必須安裝MySQL數據庫,在網上下載MySQL數據庫,具體安裝可以參考http://www.jb51.net/article/23876.htm,安裝完成后,最后下載一個視圖工具管理Mysql,我用的是Navicat for MySQL,網上可以下載并且破解。然后新建user表,字段和Person實體類對應。隨便寫入一些數據。
由于連接數據庫需要用的JDBC架包,所以去網上下載Mysql數據庫的JDBC架包,在工程下新建lib目錄,把架包拷入lib目錄,讓后郵寄點擊架包,build path->add buildpath,把架包加入工程。這樣還不夠,web項目必須把架包拷入Tomcat的lib目錄下,否則會報找不到架包的錯誤。
在src包下還有一個JDBC類,封裝了數據庫的操作:
public class JDBCUtil {
?private static String Driver="com.mysql.jdbc.Driver";
?private String url="jdbc:mysql://localhost:3306/aa?characterEncoding=utf-8";
?private String user="root";
?private String pwd="123456";
?private Connection conn=null;
?private PreparedStatement ps=null;
?
?//1,加載驅動(一次加載)
?static{
??try {
???Class.forName(Driver);
??} catch (ClassNotFoundException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
??
?}
?
?//2,建立連接
?public void getConn(){
??try {
???conn=DriverManager.getConnection(url,user,pwd);
??} catch (SQLException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
???
?}
?
?//3,創建sql對象,執行sql語句,處理結果集(增,刪,改)
?public int update(String sql,Object obj[]){
??getConn();
??int k=0;
??
??try {
???ps=conn.prepareStatement(sql);
???if(obj!=null){
????for(int i=0;i<obj.length;i++){
?????ps.setObject((i+1), (String)obj[i]);
????}
???}
???
???k=ps.executeUpdate();
???
???
??} catch (SQLException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
??
??close();
??return k;
?}
?
?//4,查詢
?public ResultSet query(String sql){
??getConn();
??ResultSet rs=null;
??try {
???ps=conn.prepareStatement(sql);
???rs=ps.executeQuery();
???
???
??} catch (SQLException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
??
??return rs;
?
?}
?
?
?
?//5,釋放資源
?public void close(){
??
???try {
???if(ps!=null){
????ps.close();
????}
???if(conn!=null){
????conn.close();
???}
???} catch (SQLException e) {
????// TODO Auto-generated catch block
????e.printStackTrace();
???}
??
??
?}
?
}
?
至此服務器的代碼編寫基本完成,然后編寫客戶端的代碼。
在android端新建一個類JsonTools,負責解析服務器傳回的json數據。
public static List<Person> getPersons(String key, String jsonString) {List<Person> list = new ArrayList<Person>(); JSONObject jsonObject; try {jsonObject = new JSONObject(jsonString); JSONArray Persons = jsonObject.getJSONArray(key); for (int i = 0; i < Persons.length(); i++) {Person person = new Person(); JSONObject jsonObject2 = Persons.getJSONObject(i); person.setId(jsonObject2.getInt("id")); person.setAccount(jsonObject2.getString("account")); person.setPassword(jsonObject2.getString("password")); person.setName(jsonObject2.getString("name")); person.setUid(jsonObject2.getString("uid")); person.setCname(jsonObject2.getString("cname")); person.setCpassword(jsonObject2.getString("cpassword")); list.add(person); }} catch (JSONException e) {// TODO Auto-generated catch block e.printStackTrace(); }return list; }?
然后新建一個類UserService,負責發送POST請求和接收服務器返回的數據。
/** * DOPost請求 */ private static String sendPOSTRequest(String path, Map<String, String> params,String encode) throws MalformedURLException, IOException {byte[] data = getRequestData(params, encode).toString().getBytes();//獲得請求體 //此處不能把path變成StringBuilder,否則會崩潰 HttpURLConnection conn=(HttpURLConnection)new URL(path).openConnection(); conn.setConnectTimeout(5000); //================= conn.setDoInput(true); //打開輸入流,以便從服務器獲取數據 conn.setDoOutput(true); //打開輸出流,以便向服務器提交數據 conn.setRequestMethod("POST"); //設置以Post方式提交數據 conn.setUseCaches(false); // conn.setRequestProperty(); //設置請求體的類型是文本類型 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //設置請求體的長度 conn.setRequestProperty("Content-Length", String.valueOf(data.length)); OutputStream outputStream = conn.getOutputStream(); outputStream.write(data); if(conn.getResponseCode()==200){InputStreamReader in=new InputStreamReader(conn.getInputStream()); BufferedReader bufferedReader=new BufferedReader(in); String result=""; String readLine=null; while ((readLine=bufferedReader.readLine())!=null){result +=readLine; }in.close(); return result; }conn.disconnect(); return null; }public static String checkPost(String name, String pass) {String path="http://192.168.1.190:8080/MyWeb/UserServlet"; //將用戶名和密碼放入HashMap中 Map<String,String> params=new HashMap<String,String>(); params.put("userName", name); params.put("passWord", pass); try {return sendPOSTRequest(path,params,"UTF-8"); } catch (MalformedURLException e) {// TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) {// TODO Auto-generated catch block e.printStackTrace(); }return null; }/* * Function : 封裝請求體信息 * Param : params請求體內容,encode編碼格式 */ public static StringBuffer getRequestData(Map<String, String> params, String encode) {StringBuffer stringBuffer = new StringBuffer(); //存儲封裝好的請求體信息 try {for(Map.Entry<String, String> entry : params.entrySet()) {stringBuffer.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), encode)).append("&"); }stringBuffer.deleteCharAt(stringBuffer.length() - 1); //刪除最后的一個"&" } catch (Exception e) {e.printStackTrace(); }return stringBuffer; }?
這其中checkPost是用來接收界面傳遞的用戶名密碼,然后封裝成Map,然后調用sendPOSTRequest()發送post請求,并且返回服務器傳來的json數據。getRequestData()用來把Map參數封裝成Post請求的請求體。
然后就可以編寫主界面的activity。
public class LoginActivity extends Activity {private EditText userName; private EditText passWord; //=============== private String result=null; private TextView mTextView; private List<Person> mPersons =new ArrayList<>(); @Override public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); userName=(EditText)this.findViewById(R.id.userName); passWord=(EditText)this.findViewById(R.id.password); mTextView= (TextView) findViewById(R.id.tv_info); findViewById(R.id.btn_connect).setOnClickListener(new View.OnClickListener() {@Override public void onClick(View view) {login(); }}); findViewById(R.id.btn_connectPost).setOnClickListener(new View.OnClickListener() {@Override public void onClick(View view) {loginPost(); }}); }private void clearEditTexts() { // userName.setText(""); // passWord.setText(""); result=null; }/** * 用戶登錄的方法 */ public void login(){//取得用戶輸入的賬號和密碼 final String name=userName.getText().toString(); final String pass=passWord.getText().toString(); new Thread(new Runnable() {@Override public void run() {result=UserService.check(name,pass); runOnUiThread(new Runnable() {@Override public void run() {if (result!=null){if (result.equals("fail")){Toast.makeText(LoginActivity.this,"fail",Toast.LENGTH_LONG).show(); clearEditTexts(); }else {mTextView.setText(result); }}else {Toast.makeText(LoginActivity.this,"null",Toast.LENGTH_LONG).show(); }}}); }}).start(); }/** * 采用post請求 */ public void loginPost(){//取得用戶輸入的賬號和密碼 final String name=userName.getText().toString(); final String pass=passWord.getText().toString(); new Thread(new Runnable() {@Override public void run() {result=UserService.checkPost(name,pass); runOnUiThread(new Runnable() {@Override public void run() {if (result!=null){if (result.equals("fail")||result.equals("")){Toast.makeText(LoginActivity.this,"用戶名或密碼錯誤",Toast.LENGTH_LONG).show(); clearEditTexts(); }else {mPersons= JsonTools.getPersons("strings",result); StringBuffer buffer=new StringBuffer(); for (int i=0;i<mPersons.size();i++){Person Person=mPersons.get(i); buffer.append(Person.getId()+"\t"+Person.getAccount()+"\t"+Person.getPassword()+"\t"+Person.getName()+"\t"+Person.getUid()+"\t"+Person.getCname()+"\t"+Person.getCpassword()+"\t"); buffer.append("\r\n"); }mTextView.setText(buffer.toString()); clearEditTexts(); }}else {Toast.makeText(LoginActivity.this,"訪問服務器失敗",Toast.LENGTH_LONG).show(); }}}); }}).start(); } }?
界面的布局很簡單
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/tv_info" android:text="hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_below="@+id/tv_info" android:id="@+id/mLiner"> <Button android:text="ConnectGet" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/btn_connect"/> <Button android:text="ConnectPost" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:id="@+id/btn_connectPost"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="48dp" android:layout_below="@+id/liner" android:orientation="horizontal" android:gravity="center_vertical"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="密碼:" android:gravity="center|left" android:textSize="15sp" /> <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:id="@+id/password" android:password="true" android:textSize="15sp" android:background="@drawable/bg_edittext" android:padding="5dp" android:textCursorDrawable="@null" /> </LinearLayout> <LinearLayout android:id="@+id/liner" android:layout_width="match_parent" android:layout_height="48dp" android:orientation="horizontal" android:gravity="center_vertical" android:layout_below="@+id/mLiner" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="用戶名:" android:gravity="center|left" android:textSize="15sp" /> <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:id="@+id/userName" android:textSize="15sp" android:padding="5dp" android:background="@drawable/bg_edittext" android:textCursorDrawable="@null"/> </LinearLayout> </RelativeLayout>?
?
其中editText是自定義的樣式,如果報錯可以把樣式刪除,或者參考我的另一篇博客EditText的設置邊框樣式。
由于訪問網絡,所有manifest文件記得加入網絡權限
<uses-permission android:name="android.permission.INTERNET"/>?
?
這樣,一個android客戶端就完成了。
?
由于此次博客的內容量太大,我感覺很難講明白,不過效果完全可以做出來。做android開發的可以看看,我覺得會些服務器的知識才能更好的做android開發。如果大家有什么問題,歡迎給我留言,我看到后會回復。
?
?
總結
以上是生活随笔為你收集整理的Tomact和MySql搭建android简单服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EditView设置边框
- 下一篇: VWware安装ubuntu设置静态IP