仿QQ空间的一款APP(二)

接着上面一片博客,这篇主要讲一下服务器怎么写的。

对于服务器方面的知识,其实我也不大了解,以前更是没有学习过SSH框架,之前也没用过IntellJ IDEA这个工具(以前都是用myeclipse的),不过用过之后就感觉这个软件非常好用,强烈推荐。

服务器方面,我采用的是基于注解的SSH框架搭建的,Tomcat7,MySQL数据库。至于Struts,spring,hibernate是什么版本我也没仔细看,直接从我姐夫那拷了一个模板,把所有的jar包导入,再配置一下applicationContext.xml,web.xml,struts.xml这几个配置文件,至于jdbc.properties这个我就没有配置了,直接在applicationContext中配置了,反正也可以,没有应该不是什么大事。。

项目目录结构:
仿QQ空间的一款APP(二)_第1张图片

一、项目结构

1、model部分

负责映射到数据库中的模块。以用户表user为例分析,下面的都一样。
其中@Entity注释指名这是一个实体Bean;
@Table注释指定了Entity所要映射带数据库表:
@Column代表数据库表中的一个属性
@Id代表是主键,@GeneratedValue(strategy = GenerationType.IDENTITY)代表主键增长策略。
这些都是一些注解,对应映射到你数据库中的表和对应的属性,如果你的applicationContext.xml中配置了这个属性
update
那么当你运行工程时候,就会自动的在数据库中创建一个表,每个表的属性和你配置的也一样,非常方便。

package com.message.server.model;


import net.sf.json.JSONObject;
import org.springframework.stereotype.Repository;

import javax.persistence.*;
import java.util.List;

/**
 * Created by SX10100563 on 2016/10/10.
 */
@Entity
@Table(name = "user")
public class User {
    @Id
    @Column(name = "userId")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int userId;

    @Column(name = "userName")
    private String userName;

    @Column(name = "userPassword")
    private String userPassword;

    public User(int userId, String userName, String userPassword) {
        this.userId = userId;
        this.userName = userName;
        this.userPassword = userPassword;
    }

    public User(String userName, String userPassword) {
        this.userName = userName;
        this.userPassword = userPassword;
    }

    public User(int userId) {
        this.userId = userId;
    }

    public User() {

    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }


    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public JSONObject UserToJSON(){
        JSONObject json = new JSONObject();
        json.put("userId", userId);
        json.put("userName", userName);
        json.put("userPassword", userPassword);
        return json;
    }
}

2、dao部分

负责获取数据库中的数据了,从这里获得数据库数据并返回给service层进行处理。
UserDao.java代码如下:
@Repository(“userDao”)这个注解使得可以在别的java文件中不需要new一个对象就可以使用,userDao就相当于一个对象了,不要纠结这个太多,这个注解作用会在UserAction.java中显现出来。

package com.message.server.dao;

/**
 * Created by SX10100563 on 2016/10/9.
 */

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


import org.hibernate.Session;
import org.hibernate.Transaction;

import com.message.server.dao.daoImpl.UserDaoInterface;
import com.message.server.model.User;
import com.message.server.utils.*;
import org.springframework.stereotype.Repository;

/**
 * Session操作数据库的相关方法:
 * get ()从数据库获取数据对象,不存在时返回null
 * load ()从数据库获取数据对象,不存在时抛出异常
 * createQuery ()根据条件查询数据对象
 * save ()将对象保存到数据库
 * update() 更新对象到数据库
 * delete () 根据对象删除数据库数据
 */
@Repository("userDao")
public class UserDao extends MyHibernateDaoSupport implements UserDaoInterface {

    public void addUser(User user) {
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        session.save(user);
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
    }

    public void delUser(int userId) {
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        User u = new User(userId);
        session.delete(u);
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
    }

    public void updateUser(User user) {
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        session.update(user);
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();

    }

    public List selectAllUserName() {
        List usernameList = new ArrayList<>();
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        List list = session.createQuery("From User").list();
        for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
            User u = (User) iterator.next();
            usernameList.add(u.getUserName());
        }
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
        return usernameList;
    }

    public List selectUser() {
        List users = new ArrayList<>();
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        List list = session.createQuery("From User").list();
        for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
            User u = (User) iterator.next();
            users.add(u);
        }
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
        return users;
    }

    public User getUserByUserId(int userId) {
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        User user = (User) session.load(User.class, userId);
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
        return user;
    }

    public boolean isExitByName(String userName) {
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        List user = session.createQuery("From User u where u.userName=:userName").setString("userName", userName).list();
        if (user.size() > 0) {
            try {
                tc.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
            session.close();
            return true;
        }
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
        return false;
    }

    public boolean isExitByNameAndPass(User user) {
        Session session = this.getSession(true);
        Transaction tc = session.beginTransaction();
        List users = null;
        users = session.createQuery("From User u where u.userName=:userName and u.userPassword=:userPassword").setString("userName", user.getUserName()).setString("userPassword", user.getUserPassword()).list();
        if (users.size() > 0) {
            try {
                tc.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
            session.close();
            return true;
        }
        try {
            tc.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        session.close();
        return false;
    }

}

这里面有数据库的增删改查,还有登录的一些判断方法,都写在这里面,这些方法理应是传到service层的,但我直接传到了web层了,service部分舍弃了。

3、service部分

关于service部分,我就没有写东西了,所有东西都在dao层实现了,好像没service层啥事了。

4、web层

这一层的作用就是涉及到和客户端的交互了,前面更多的是从数据库获取数据,处理逻辑等,这一层就是直接返回消息了,客户端可以通过http请求访问得到返回了。

@Action(value = “login”)加上这个注解就是一个action请求了,直接使用链接加上action名字就能访问这个action了。

package com.message.server.action;

/**
 * Created by SX10100563 on 2016/10/14.
 */

import com.message.server.dao.UserDao;
import com.message.server.model.User;
import com.message.server.utils.ActionSupportUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.struts2.convention.annotation.Action;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;
import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * 与user有关的Action
 */
@Controller
public class UserAction extends ActionSupportUtil {
    @Resource
    private UserDao userDao;
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    /**
     * 用户的登录功能。
     * 通过UserDao中的isExitByNameAndPass(user)方法可以知道数据库中用户名和密码是否正确
     * http://localhost:8080/login.action?user.userName=cjs&user.userPassword=123
     *
     * @return
     */
    @Action(value = "login")
    public void login() throws UnsupportedEncodingException {
        user.setUserName(new String(user.getUserName().getBytes("ISO-8859-1"), "UTF-8"));
        boolean flag = userDao.isExitByNameAndPass(user);
        if (flag) {
            renderText("Success");
            return;
        }
        renderText("Fail");
    }

    /**
     * 用户的注册功能。
     * 使用UserDao的addUser方法可以向数据库中插入用户信息(用户名、密码)、用户ID是自增
     * http://localhost:8080/addUser?user.userName=&user.userPassword=1234
     *
     * @return
     */
    @Action(value = "addUser")
    public void addUser() throws UnsupportedEncodingException {
        user.setUserName(new String(user.getUserName().getBytes("ISO-8859-1"), "UTF-8"));
        userDao.addUser(user);
        renderText("success");
    }

    /**
     * 获得所有的用户名及密码
     * http://localhost:8080/getAllUsers
     */
    @Action("getAllUsers")
    public void getAllUsers() {
        List users = userDao.selectUser();
        if (users == null) {
            renderText("user null");
        } else {
            JSONArray json = new JSONArray();
            for (User user : users) {
                json.add(user.UserToJSON());
            }
            renderJson(json.toString());
        }
    }

    /**
     * 获取所有的用户名
     * http://localhost:8080/getAllUserName
     */
    @Action("getAllUserName")
    public void getAllUserName(){
        List usernameList=userDao.selectAllUserName();
        if(usernameList==null){
            renderText("null");
        }else{
            JSONArray jsonArray=new JSONArray();
            JSONObject jsonObject=new JSONObject();
            for (String name : usernameList){
                jsonObject.put("userName",name);
                jsonArray.add(jsonObject);
            }
            renderJson(jsonArray.toString());
        }
    }

}

这里面的action写的有点多,按照我姐夫的说法,web层应该是调用service层的方法就行了,不需要写别的逻辑,结果我全写在web层里面了。这里我就偷懒了,调用和返回值全都写在了这里面,最好还是包装一下到service里面,如何action直接调用service的一个方法就行了。

二、客户端访问服务器端,获取数据。

1、客户端通过http请求访问数据库

这里面serverUrl 要换成你自己的服务器地址,通过HttpPost访问action的链接,这里访问了”http://121.42.144.254:8080/msgserver_war/login“这个action,并且附带了名字和密码属性,一起发送给action验证,服务器对该请求进行解析并返回数据(登录成功返回success,登录失败返回fail)。客户端收到数据之后就可以知道登录的是否成功了。

package com.example.web;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpConnection;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.util.Log;

import com.example.web.Conn_server;

/**
 * 这个类用来进行登录判断的工具类
 * 
 * @author ubuntu
 * 
 */
public class LoginJudge {

    private final String serverUrl = "http://121.42.144.254:8080/msgserver_war/";

    /**
     * 使用post方式向服务器发送请求,相当于http://localhost:8080/login.action?user.userName=cjs&
     * user.userPassword=123这种get方式 向服务器发出http请求,附带用户名和密码
     * 
     * @param url
     * @param userName
     * @param userPassword
     * @return
     */
    public String login(String action, String userName, String userPassword) {
        String result = null;
        List params = new ArrayList();
        params.add(new BasicNameValuePair("user.userName", userName));
        params.add(new BasicNameValuePair("user.userPassword", userPassword));
        HttpEntity entity;
        HttpClient client = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(serverUrl + "login");
        HttpResponse response;
        try {
            entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);
            httpPost.setEntity(entity);
            response = client.execute(httpPost);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // result = "网络连接成功";
                result = EntityUtils.toString(response.getEntity(), "utf-8");
            } else {
                result = "InternalFail";
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }

}

2、服务器端返回JSON数据,客户端解析。

JSON数据格式类似于这种:[{“userId”:1,”userPassword”:”123456”,”userName”:”root”},{“userId”:2,”userPassword”:”123456”,”userName”:”demo”},{“userId”:3,”userPassword”:”123456”,”userName”:”test”}]
服务器端记得把所有的数据变成上面格式并打印到网页上,客户端就可以收到该字符串,这个字符串就是JSONArray型的数据,具体解析方法如下:

JSONArray jsonArray = new JSONArray(result);
for (int i=0;istr=str+"第"+i+"个,userId:"+jsonObject2.getString("userId")+"userName:"+jsonObject2.getString("userName")+"userPassword:"+jsonObject2.getString("userPassword");

     }

大概就是这样,所以思路就是客户端发送http请求,服务器端响应,返回给客户端JSON格式的数据,客户端解析JSON数据,如何相应的显示在listview中去,这里我是重写了ArrayAdapter,具体怎么实现的就不细细说了,感兴趣的需要源码的可以私信我,有啥疑问也可以私信我。

你可能感兴趣的:(Android)