精华内容
下载资源
问答
  • AndroidStudio+Tomcat进行学生登录并进行学生信息的管理——增删改查 本项目需要在androidStudio上面和eclisp上面分别创建相应的项目,所以这里给大家整体分为两个大步骤进行介绍,就让我们往下看吧,觉得可以的可以...

    AndroidStudio+Tomcat进行学生登录并进行学生信息的管理——增删改查

    本项目需要在androidStudio上面和eclisp上面分别创建相应的项目,所以这里给大家整体分为两个大步骤进行介绍,就让我们往下看吧,觉得可以的可以留言对林君进行支持,有不懂的可以进行留言,林君给你解答,有不同观点的也欢迎大家留言进行讨论哦!

    一、AndroidStudio端的步骤如下所示:

    首先我们需要的是在AndroidStudio端创建学生信息管理的项目studentSystemWeb,相信大家对于项目的创建知道怎么做,这里就不进行项目的创建的步骤
    因为需要网络连接,所以我们首要的就是进行网络许可的配置,如下:

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

    在android项目中的配置文件“Androidmanifest.xml”中加入以上的入网许可!
    1、既然是对学生进行管理,那么首先必要的步骤是创建一个Student学生的java类,这个是自己重新new一个java类的步骤哦_

    import java.io.Serializable;
    public class Student  implements Serializable {
        private String name;//姓名
        private String id;//学号
        private String major;//专业
        private String age;//年龄
        private String sex;//性别
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public Student(String id, String name, String sex, String age, String major) {
            this.id=id;
            this.name=name;
            this.sex=sex;
            this.age=age;
            this.major=major;
        }
        public Student(){
        }
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public String getName(){
            return name;
        }
        public String getMajor(){
            return major;
        }
        public void setName(String name){
            this.name=name;
        }
        public void setMajor(String major){
            this.major=major;
        }
    }
    

    2、接下来我们进行登录界面的设置,登录界面的设定通过自己的个人喜好进行设定,这里当然只献上林君自己的界面设计的XML代码啦,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:background="@drawable/back6"
        android:id="@+id/back3"
        tools:context=".MainActivity">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:textSize="20dp"
            android:text="欢迎进入学生信息管理系统"
            android:gravity="center"
            android:textColor="#FFAB00"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="235dp">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/back"
                android:src="@drawable/pto4" />
            <ImageView
                android:layout_width="130dp"
                android:layout_height="130dp"
                android:id="@+id/pto"
                android:layout_marginTop="70dp"
                android:layout_marginLeft="5dp"
                android:src="@drawable/pto"/>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/userName"
                android:layout_marginTop="70dp"
                android:hint="@string/user"
                android:layout_marginLeft="5dp"
                android:inputType="text"
                android:layout_toRightOf="@id/pto"/>
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/password"
                android:hint="@string/passward"
                android:inputType="textPassword"
                android:layout_marginTop="120dp"
                android:layout_marginLeft="5dp"
                android:layout_toRightOf="@id/pto"/>
            <CheckBox
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:id="@+id/remember"
                android:layout_toRightOf="@id/pto"
                android:layout_marginLeft="5dp"
                android:text="记住密码"
                android:layout_below="@+id/password"/>
            <CheckBox
                android:layout_width="90dp"
                android:layout_height="wrap_content"
                android:layout_below="@+id/password"
                android:id="@+id/right1"
                android:layout_toRightOf="@+id/remember"
                android:text="自动登录"
                />
        </RelativeLayout>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="登录"
            android:id="@+id/login"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="match_parent"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:textColor="#FF4081"
                android:text="忘记密码?"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:textColor="#FF4081"
                android:gravity="right"
                android:text="注册账号"/>
        </LinearLayout>
    </LinearLayout>
    

    我们可以知道上面有很多隐藏的string,下面图片中将进行给出,也就是hint或者你给输入框设置的提示语言的东西,通过如下的方式,可以简化以后修改的时间,以后修改通过在这里修改就ok了,不必在代码中寻找然后修改。
    在这里插入图片描述
    以下就是我自己的界面设计的图像所示

    3、有了登录界面设计的设计,那么肯定会有相应的实现我们界面设计的java代码,登录界面的java代码如下所示:
    3-1、既然是通过Tomcat服务器进行数据的获取,那么我们需要建立一个连接Tomcat服务器的java类–新建一个java类名字为HttpUtilsHttpURLConnection,代码如下

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.Map;
    /**
     * Created by cool on 2019/12/8.
     */
    public class HttpUtilsHttpURLConnection {
        public static String BASE_URL= "http://192.168.43.128:8080/JSPStudy";//这里的ip地址,设置为自己网络的ip地址,这里注意,eclisp也就是电脑上面的网络应该和手机连接的网处于同一个网络。JSPStudy是自己eclisp上面的学生信息管理的java项目
        /*
         * urlStr:网址
         * parms:提交数据
         * return:网页源码
         * */
        public static  String getContextByHttp(String urlStr,Map<String,String> parms){
            StringBuilder result = new StringBuilder();//StringBuilder用于单线程多字符串拼接
            try {
                URL url = new URL(urlStr);
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("POST");
                connection.setReadTimeout(10000);
                connection.setConnectTimeout(10000);
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setInstanceFollowRedirects(true);
                OutputStream outputStream = connection.getOutputStream();
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
                writer.write(getStringFromOutput(parms));
                System.out.println(getStringFromOutput(parms));
                System.out.println(parms);
                writer.flush();
                writer.close();
                outputStream.close();
                if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
                    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String temp;
                    while((temp = reader.readLine()) != null) {
                        result.append(temp);
                    }
                }else{
                    return "error:0";
                }
                connection.disconnect();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result.toString();
    
        }
        /**
         * 将map转换成key1=value1&key2=value2的形式
         * @param map
         * @return
         * @throws UnsupportedEncodingException
         */
        private static String getStringFromOutput(Map<String,String> map) throws UnsupportedEncodingException {
            StringBuilder sb = new StringBuilder();//StringBuilder用于单线程多字符串拼接
            boolean isFirst = true;
            for(Map.Entry<String,String> entry:map.entrySet()){
                if(isFirst)
                    isFirst = false;
                else
                    sb.append("&");
                sb.append(URLEncoder.encode(entry.getKey(),"UTF-8"));
                sb.append("=");
                sb.append(URLEncoder.encode(entry.getValue(),"UTF-8"));
            }
            return sb.toString();
        }
    
        /**
         * 数据请求的方法
         */
    }
    

    3-2、实现登录界面设计的的java代码(mainActivity)如下所示:

    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.Toast;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    public class MainActivity extends AppCompatActivity {
        private SharedPreferences loginPreference;
        private EditText userName1;
        private EditText password1;
        private CheckBox remember;
        private Button login;
        public static ArrayList<Student> students = new ArrayList<>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            View v = findViewById(R.id.back3);
            v.getBackground().setAlpha(210);
            userName1 = (EditText) findViewById(R.id.userName);
            password1 = (EditText) findViewById(R.id.password);
            remember = (CheckBox) findViewById(R.id.remember);
            login = (Button) findViewById(R.id.login);
            loginPreference = getSharedPreferences("login", MODE_PRIVATE);
            ///要通过loginPreference去记录三个参数(checked,userName,password)
            boolean cheched = loginPreference.getBoolean("checked", false);
            if (cheched) {
                Map<String, Object> m = readLogin();
                if (m != null) {
                    userName1.setText((CharSequence) m.get("userName"));
                    password1.setText((CharSequence) m.get("password"));
                    remember.setChecked(cheched);
                }
            }
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    configLoginInfo(remember.isChecked());
                    login();
                }
            });
        }
        public void configLoginInfo(boolean checked) {
            SharedPreferences.Editor editor = loginPreference.edit();
            editor.putBoolean("checked", remember.isChecked());
            if (checked) {
                editor.putString("userName", userName1.getText().toString());
                editor.putString("password", password1.getText().toString());
            } else {
                editor.remove("userName").remove("password");
            }
            editor.commit();
        }
        /**
         * 读登录信息
         *
         * @return
         */
        public Map<String, Object> readLogin() {
            Map<String, Object> m = new HashMap<>();
            String userName = loginPreference.getString("userName", "");
            String password = loginPreference.getString("password", "");
            m.put("userName", userName);
            m.put("password", password);
            return m;
        }
        private void login() {
            new Thread() {
                @Override
                public void run() {
                    System.out.println("登录成功");
                    Map<String, String> params = new HashMap<String, String>();
                    String userName = userName1.getText().toString();
                    String password = password1.getText().toString();
                    String url = HttpUtilsHttpURLConnection.BASE_URL + "/login";
                    params.put("password", password);
                    params.put("userName", userName);
                    String result = HttpUtilsHttpURLConnection.getContextByHttp(url,params);
                        ///返回JSON
                    Message msg = new Message();
                    msg.what = 0x11;
                    Bundle data = new Bundle();
                    data.putString("result", result);
                    msg.setData(data);
                    handler.sendMessage(msg);
                }
                Handler handler=new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        if(msg.what==0x11){
                            Bundle data = msg.getData();
                            String key = data.getString("result");//得到json返回的json
                            System.out.println(key);
                            try {
                                JSONObject json= new JSONObject(key);
                                int code = Integer.parseInt(json.getString("code"));
                                System.out.println(code);
                                if (code==1) {
                                    Toast.makeText(MainActivity.this, "登录成功!", Toast.LENGTH_LONG).show();
                                    Intent intent=new Intent();
                                    intent.setClass(MainActivity.this,studentList.class);
                                    startActivity(intent);
                                } else {
                                    Toast.makeText(MainActivity.this, "用户名或密码错误!", Toast.LENGTH_LONG).show();
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                };
            }.start();
        }
    
    }
    

    4、登录界面进入后,我们进入学生信息获取的界面,界面我们需要利用listView进行学生信息的展示,包括学生属性的所有,所以我们首先得自定义我们自己的适配器,界面设计的XML代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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:orientation="vertical"
        tools:context=".studentList">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="学生信息如下:"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <EditText
                android:layout_width="300dp"
                android:layout_height="50dp"
                android:layout_weight="1"
                android:hint="学生信息查找"
                android:id="@+id/find"/>
            <ImageButton
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_weight="1"
                android:id="@+id/search"
                android:background="@drawable/find1"/>
        </LinearLayout>
        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/listView"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="填加"
            android:id="@+id/addStudent"/>
    </LinearLayout>
    

    界面的设计效果:
    在这里插入图片描述
    4-1、同样,我们需要新建一个java类, StuAdapter,里面为我们自定义适配器的java代码,如下:

    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    import java.util.List;
    public class StuAdapter extends BaseAdapter implements View.OnClickListener {
        private List <Student>stuDates;
        private Context stuContext;
        private InnerItemOnClickListener myListener;
        public StuAdapter(Context context,List<Student>list){
            this.stuContext=context;
            this.stuDates=list;
        }
        @Override
        public int getCount() {
            return stuDates.size();
        }
        @Override
        public Object getItem(int position) {
            return stuDates.get(position);
        }
        @Override
        public long getItemId(int position) {
            Student student=(Student)stuDates.get(position);
            return position;
        }
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            View stuView=View.inflate(stuContext,R.layout.studentweb_item,null);
            TextView stuName=stuView.findViewById(R.id.student_name);
            TextView stuSex=stuView.findViewById(R.id.student_sex);
            TextView stuAge=stuView.findViewById(R.id.student_age);
            TextView stuId=stuView.findViewById(R.id.student_id);
            TextView stuMajor=stuView.findViewById(R.id.student_major);
            ImageView edit=stuView.findViewById(R.id.student_edit);
            ImageView delete=stuView.findViewById(R.id.student_delete);
            Student student=(Student)stuDates.get(i);
            stuName.setText(student.getName());
            stuSex.setText(student.getSex());
            stuAge.setText(student.getAge());
            stuId.setText(student.getId());
            stuMajor.setText(student.getMajor());
            edit.setImageResource(R.drawable.edit);
            delete.setImageResource(R.drawable.delete);
            edit.setOnClickListener(this);
            delete.setOnClickListener(this);
            edit.setTag(i);
            delete.setTag(i);
            return stuView;
        }
        interface InnerItemOnClickListener {
            abstract void itemClick(View view);
        }
        public void setOnInnerItemOnClickListener(InnerItemOnClickListener listener){
            this.myListener=listener;
        }
        @Override
        public void onClick(View view) {
            myListener.itemClick(view);
        }
    }
    

    4-2、有了自定义的适配器之后,我们就可以对学生信息列表进行实现了,对应就是信息列表界面的java代码,如下:

    package com.cqjtu.studentsystemweb;
    import androidx.appcompat.app.AlertDialog;
    import androidx.appcompat.app.AppCompatActivity;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.ListView;
    import android.widget.Toast;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import static com.cqjtu.studentsystemweb.MainActivity.students;
    public class studentList extends AppCompatActivity implements StuAdapter.InnerItemOnClickListener
            , AdapterView.OnItemClickListener, View.OnClickListener{
        private ListView listView;
        private Button add;
        public static StuAdapter adapter;
        private ImageButton search;
        private EditText find1;
        public static List<Student>find;
        private List<Student>show;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_student_list);
            listView = findViewById(R.id.listView);
            add = (Button) findViewById(R.id.addStudent);
            add.setOnClickListener(this);
            find1=(EditText)findViewById(R.id.find);
            search=(ImageButton)findViewById(R.id.search);
            search.setOnClickListener(this);
            students.clear();
            if (find!=null) {
                find.clear();
            }
            new Thread() {
                @Override
                public void run() {
                    String url = HttpUtilsHttpURLConnection.BASE_URL + "/studentQuery";
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("flag", "1");
                    params.put("key", "");
                    String result = HttpUtilsHttpURLConnection.getContextByHttp(url, params);
                    ///返回JSON
                    Message msg = new Message();
                    msg.what = 0x11;
                    Bundle data = new Bundle();
                    data.putString("result", result);
                    System.out.println(result);
                    msg.setData(data);
                    handler.sendMessage(msg);
                }
                Handler handler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        if (msg.what == 0x11) {
                            Bundle data = msg.getData();
                            String key = data.getString("result");//得到json返回的json
                            try {
                                JSONObject json = new JSONObject(key);
                                JSONArray jsonArray = new JSONArray(json.get("students").toString());
                                for (int i = 0; i < jsonArray.length(); i++) {
                                    JSONObject jsonObject = (JSONObject) jsonArray.get(i);
                                    String id = jsonObject.get("no").toString();
                                    String name = (String) jsonObject.get("name");
                                    String sex = (String) jsonObject.get("sex");
                                    String age = jsonObject.get("age").toString();
                                    String major = (String) jsonObject.get("major");
                                    Student s = new Student(id, name, sex, age, major);
                                    students.add(s);
                                }
                                adapter = new StuAdapter(studentList.this, students);
                                listView.setAdapter(adapter);
                                adapter.setOnInnerItemOnClickListener(studentList.this);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                };
            }.start();
            listView.setOnItemClickListener(this);
        }
        @Override
        public void onClick(View view) {
            Intent intent=new Intent();
            if (view.getId()==R.id.addStudent){
                intent.setClass(studentList.this,addStudent.class);
                startActivity(intent);
            }else if(view.getId()==R.id.search){
                final String key=find1.getText().toString();
                if (isEmpty(key)) {
                    Toast.makeText(this,"查找条件不能为空",Toast.LENGTH_SHORT).show();
                    return;
                }
                find=new ArrayList<Student>();
                new Thread() {
                    @Override
                    public void run() {
                        String url = HttpUtilsHttpURLConnection.BASE_URL + "/studentQuery";
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("flag", "1");
                        params.put("key",key);
                        String result = HttpUtilsHttpURLConnection.getContextByHttp(url, params);
                        ///返回JSON
                        Message msg = new Message();
                        msg.what = 0x11;
                        Bundle data = new Bundle();
                        data.putString("result", result);
                        System.out.println(result);
                        msg.setData(data);
                        handler.sendMessage(msg);
                    }
                    Handler handler = new Handler() {
                        @Override
                        public void handleMessage(Message msg) {
                            if (msg.what == 0x11) {
                                Bundle data = msg.getData();
                                String key = data.getString("result");//得到json返回的json
                                try {
                                    JSONObject json = new JSONObject(key);
                                    JSONArray jsonArray = new JSONArray(json.get("students").toString());
                                    for (int i = 0; i < jsonArray.length(); i++) {
                                        JSONObject jsonObject = (JSONObject) jsonArray.get(i);
                                        String id = jsonObject.get("no").toString();
                                        String name = (String) jsonObject.get("name");
                                        String sex = (String) jsonObject.get("sex");
                                        String age = jsonObject.get("age").toString();
                                        String major = (String) jsonObject.get("major");
                                        Student s = new Student(id, name, sex, age, major);
                                        find.add(s);
                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    };
                }.start();
                intent.setClass(studentList.this,searchlist.class);
                intent.putExtra("find",(Serializable)find);
                startActivity(intent);
            }
        }
        private boolean isEmpty(String str) {
            return str.length()==0||null==str;
        }
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            show=new ArrayList<Student>();
            Intent intent=new Intent();
            String id=students.get(i).getId();
            String name=students.get(i).getName();
            String sex=students.get(i).getSex();
            String age=students.get(i).getAge();
            String major=students.get(i).getMajor();
            Student student=new Student(id,name,sex,age,major);
            show.add(student);
            intent.setClass(studentList.this,delite.class);
            intent.putExtra("show",(Serializable)show);
            startActivity(intent);
        }
        @Override
        public void itemClick(View view) {
            Intent intent=new Intent();
            switch (view.getId()){
                case R.id.student_edit:
                    int p=(Integer) view.getTag();
                    intent.setClass(this,edit.class);
                    sentI(intent,p);
                    startActivity(intent);
                    break;
                case R.id.student_delete:
                    final int k=(Integer)view.getTag();
                    new AlertDialog.Builder( this )
                            .setIcon( R.drawable.student1)
                            .setTitle( "删除对话框" )
                            .setMessage( "确定删除学生:"+students.get(k).getName()+"?" )
                            .setNegativeButton( "取消",null )
                            .setPositiveButton( "确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    final String no=students.get(k).getId();
                                    new Thread() {
                                        @Override
                                        public void run() {
                                            String url = HttpUtilsHttpURLConnection.BASE_URL + "/studentDelServlet";
                                            Map<String, String> params = new HashMap<String, String>();
                                            params.put("no", no);
                                            String result = HttpUtilsHttpURLConnection.getContextByHttp(url, params);
                                            System.out.println(result);
                                        }
                                    }.start();
                                    students.remove(k);
                                    Toast.makeText(studentList.this,"删除成功",Toast.LENGTH_SHORT).show();
                                    adapter.notifyDataSetChanged();
                                }
                            } ).show();
                    break;
            }
        }
        public void sentI(Intent intent,int p){
            intent.putExtra("p",p);
        }
    }
    

    5、新创建一个activity页面,实现搜索功能,如下介绍
    5-1、搜索界面的的界面设计的XML代码如下,将搜索到的学生信息展示到此页面上:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        tools:context=".studentList">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="您搜索的信息如下:"/>
        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:descendantFocusability="blocksDescendants"
            android:id="@+id/studentList1"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="返回"
            android:id="@+id/back"/>
    </LinearLayout>
    

    5-2、实现搜索功能对应的java代码如下:

    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ListView;
    import static com.cqjtu.studentsystemweb.studentList.find;
    public class searchlist extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener,StuAdapter.InnerItemOnClickListener{
        private ListView list;
        public static StuAdapter stuAdapter1;
        private Button back;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_searchlist);
            list=(ListView)findViewById(R.id.studentList1);
            back=(Button)findViewById(R.id.back);
            Bundle bundle = getIntent().getExtras();
            stuAdapter1=new StuAdapter(searchlist.this,find);
            list.setAdapter(stuAdapter1);
            stuAdapter1.setOnInnerItemOnClickListener(this);
            list.setOnItemClickListener(searchlist.this);
            back.setOnClickListener(this);
        }
        @Override
        public void onClick(View view) {
            Intent intent=new Intent();
            if (view.getId()==R.id.back){
                finish();
            }
        }
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        }
        @Override
        public void itemClick(View view) {
    
        }
    }
    

    6、新创建一个activity页面,实现学生信息的添加功能
    6-1、添加功能的XML界面设计代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:background="@drawable/background2"
        android:id="@+id/back"
        tools:context=".addStudent">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:background="@drawable/back4"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:textSize="20dp"
            android:text="添加学生信息"
            android:gravity="center"
            android:textColor="#00B8D4"/>
        <TextView
            android:id="@+id/no"
            android:layout_marginTop="5dp"
            android:layout_width="match_parent"
            android:gravity="center"
            android:layout_height="25dp"
            android:inputType="text"
            android:textColor="#D50000"
            android:textSize="20dp"
            android:text="学号由系统分配" />
        <EditText
            android:id="@+id/name"
            android:layout_marginTop="5dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:hint="@string/name" />
        <EditText
            android:id="@+id/age"
            android:layout_marginTop="2dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="numberSigned"
            android:maxLength="3"
            android:hint="@string/age"/>
        <AutoCompleteTextView
            android:id="@+id/major"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:inputType="text"
            android:hint="@string/major"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_marginTop="2dp"
            android:layout_height="wrap_content"
            android:textColor="#00B8D4"
            android:text="性别"/>
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/sex"
            android:orientation="horizontal">
            <RadioButton
                android:layout_width="600dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textColor="#00B0FF"
                android:text="男"/>
            <RadioButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textColor="#D81B60"
                android:text="女"/>
        </RadioGroup>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
            <Button
                android:id="@+id/addname"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/button_shape1"
                android:text="确认添加" />
            <Button
                android:id="@+id/addmajor"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/button_shape1"
                android:text="发送信息" />
        </LinearLayout>
    </LinearLayout>
    

    界面设计的效果图如下:(其中的图片大家可以自己替换哦)
    在这里插入图片描述
    6-2、添加功能页面对应的java实现类代码如下:

    package com.cqjtu.studentsystemweb;//这里是导入自己项目的全类名上面没有给出,这里给出,每一个java页面的代码就都要导入
    import androidx.appcompat.app.AppCompatActivity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.AutoCompleteTextView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.Toast;
    import java.util.HashMap;
    import java.util.Map;
    import static com.cqjtu.studentsystemweb.MainActivity.students;
    public class addStudent extends AppCompatActivity implements View.OnClickListener {
        private AutoCompleteTextView major1;
        public  EditText name1;
        private EditText age1;
        private Button addname1;
        private Button addmajor1;
        private RadioGroup sex1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_student);
            name1=(EditText) findViewById(R.id.name);
            major1=(AutoCompleteTextView) findViewById(R.id.major);
            age1=(EditText)findViewById(R.id.age);
            sex1=(RadioGroup)findViewById(R.id.sex);
            addname1=(Button)findViewById(R.id.addname);
            addmajor1=(Button)findViewById(R.id.addmajor);
            addname1.setOnClickListener(this);
            addmajor1.setOnClickListener(this);
            String major[]={"计算机科学与技术","物联网工程","电子信息","电子通信","土木工程","工程造价","计算机软件","物联网系统"};
            ArrayAdapter<String> arrayAdapter=new ArrayAdapter(this,R.layout.textview,major);
            major1.setAdapter(arrayAdapter);
            View v = findViewById(R.id.back);
            v.getBackground().setAlpha(200);
        }
        private boolean isEmpty(String str) {
            return str.length()==0||null==str;
        }
        @Override
        public void onClick(View view) {
            Intent intent = new Intent();
            if (view.getId() == R.id.addname) {
                final String name22 = name1.getText().toString();
                final String sex22 = getRadio(sex1);
                final String age22 = age1.getText().toString();
                final String major22 = major1.getText().toString();
                if (isEmpty(name22)) {
                    Toast.makeText(this, "姓名不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (isEmpty(age22)) {
                    Toast.makeText(this, "年龄不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (isEmpty(sex22)) {
                    Toast.makeText(this, "请选择性别", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (isEmpty(major22)) {
                    Toast.makeText(this, "专业不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                new Thread() {
                    @Override
                    public void run() {
                        String url = HttpUtilsHttpURLConnection.BASE_URL + "/studentInsertServlet";
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("name", name22);
                        params.put("age", age22);
                        params.put("major", major22);
                        params.put("sex", sex22);
                        String result = HttpUtilsHttpURLConnection.getContextByHttp(url, params);
                        System.out.println(result);
                    }
                }.start();
                Toast.makeText(this, "已经添加" + students.size() + "条记录", Toast.LENGTH_SHORT).show();
                name1.setText("");
                sex1.clearCheck();
                age1.setText("");
                major1.setText("");
                name1.setFocusable(true);
                name1.setFocusableInTouchMode(true);
                name1.requestFocus();
            } else if (view.getId() == R.id.addmajor) {
                intent.setClass(this, studentList.class);
                startActivity(intent);
            }
        }
        public String getRadio(RadioGroup radioGroup){
            String info="";
            int num=radioGroup.getChildCount();
            for(int i=0;i<num;i++){
                RadioButton rd=(RadioButton)radioGroup.getChildAt(i);
                if(rd.isChecked()){
                    info=rd.getText().toString();
                    break;
                }
            }
            return info;
        }
    }
    

    7、新建一个学生信息编辑的activity页面,实现对学生信息的编辑,修改
    7-1、学生信息编辑界面的XML设计代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:background="@drawable/background4"
        android:id="@+id/back1"
        tools:context=".edit">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:background="@drawable/back5"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:textSize="20dp"
            android:text="学生信息编辑"
            android:gravity="center"
            android:textColor="#00B8D4"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:layout_height="wrap_content">
            <TextView
                android:layout_marginTop="5dp"
                android:layout_width="430dp"
                android:gravity="right"
                android:layout_weight="1"
                android:layout_height="25dp"
                android:inputType="text"
                android:textColor="#D50000"
                android:text="学生学号:"/>
            <TextView
                android:id="@+id/no"
                android:layout_marginTop="5dp"
                android:layout_width="match_parent"
                android:gravity="left"
                android:layout_height="25dp"
                android:layout_weight="1"
                android:inputType="text"
                android:textColor="#D50000"
                android:text="学号不能修改"/>
        </LinearLayout>
        <EditText
            android:id="@+id/name1"
            android:layout_marginTop="5dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:hint="@string/name" />
        <EditText
            android:id="@+id/age1"
            android:layout_marginTop="2dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="numberSigned"
            android:maxLength="3"
            android:hint="@string/age"/>
        <AutoCompleteTextView
            android:id="@+id/major1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:inputType="text"
            android:hint="@string/major"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_marginTop="2dp"
            android:layout_height="wrap_content"
            android:textColor="#00B8D4"
            android:text="性别"/>
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/sex1"
            android:orientation="horizontal">
            <RadioButton
                android:layout_width="600dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textColor="#00B0FF"
                android:text="男"/>
            <RadioButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textColor="#D81B60"
                android:text="女"/>
        </RadioGroup>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
            <Button
                android:id="@+id/save"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/button_shape1"
                android:text="保存" />
            <Button
                android:id="@+id/exit"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/button_shape1"
                android:text="退出" />
        </LinearLayout>
    </LinearLayout>
    

    学生信息编辑的界面如下:
    在这里插入图片描述
    7-2、学生编辑界面的实现类java代码如下:

    package com.cqjtu.studentsystemweb;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.AutoCompleteTextView;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.util.HashMap;
    import java.util.Map;
    import static com.cqjtu.studentsystemweb.MainActivity.students;
    import static com.cqjtu.studentsystemweb.studentList.adapter;
    public class edit extends AppCompatActivity implements View.OnClickListener{
        private EditText name11;
        private AutoCompleteTextView major11;
        private TextView id11;
        private EditText age11;
        private RadioGroup sex11;
        private Button save;
        private Button quit;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_edit);
            View v = findViewById(R.id.back1);
            v.getBackground().setAlpha(230);
            id11=(TextView)findViewById(R.id.no);
            name11=(EditText) findViewById(R.id.name1);
            sex11=(RadioGroup) findViewById(R.id.sex1);
            age11=(EditText) findViewById(R.id.age1);
            major11=(AutoCompleteTextView)findViewById(R.id.major1);
            quit=(Button)findViewById(R.id.exit);
            save=(Button)findViewById(R.id.save);
            String id=(String) students.get(k()).getId();
            String name=(String) students.get(k()).getName();
            String sex=(String) students.get(k()).getSex();
            String age=(String) students.get(k()).getAge();
            String major=(String)students.get(k()).getMajor();
            id11.setText(id);
            name11.setText(name);
            showRadio(sex11,sex);
            age11.setText(age);
            major11.setText(major);
            String major1[]={"计算机科学与技术","物联网工程","电子信息","电子通信","土木工程","工程造价","计算机软件","物联网系统"};
            ArrayAdapter<String> arrayAdapter=new ArrayAdapter(this,R.layout.textview,major1);
            major11.setAdapter(arrayAdapter);
            quit.setOnClickListener(this);
            save.setOnClickListener(this);
        }
        @Override
        public void onClick(View view) {
            if(view.getId()==R.id.exit){
                finish();
            }else if (view.getId()==R.id.save){
                final String id=id11.getText().toString();
                students.get(k()).setId(id);
                final String name=name11.getText().toString();
                students.get(k()).setName(name);
                final String sex=getRadio(sex11);
                students.get(k()).setSex(sex);
                final String age=age11.getText().toString();
                students.get(k()).setAge(age);
                final String major=major11.getText().toString();
                students.get(k()).setMajor(major);
                new Thread() {
                    @Override
                    public void run() {
                        String url = HttpUtilsHttpURLConnection.BASE_URL + "/studentInsertServlet";
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("no",id);
                        params.put("name", name);
                        params.put("age", age);
                        params.put("major", major);
                        params.put("sex", sex);
                        String result = HttpUtilsHttpURLConnection.getContextByHttp(url, params);
                        System.out.println(result);
                    }
                }.start();
                Toast.makeText(this, "修改成功", Toast.LENGTH_SHORT).show();
                adapter.notifyDataSetChanged();
                finish();
            }
        }
        public void showRadio(RadioGroup radioGroup, String v){
            int num=radioGroup.getChildCount();
            for(int i=0;i<num;i++){
                RadioButton radioButton=(RadioButton)radioGroup.getChildAt(i);
                String info=radioButton.getText().toString();
                if(info.equals(v)){
                    radioButton.setChecked(true);
                    break;
                }
            }
        }
        public int k(){
            Bundle bundle1 = getIntent().getExtras();
            int k=bundle1.getInt("p");
            return k;
        }
        public String getRadio(RadioGroup radioGroup){
            String info="";
            int num=radioGroup.getChildCount();
            for(int i=0;i<num;i++){
                RadioButton rd=(RadioButton)radioGroup.getChildAt(i);
                if(rd.isChecked()){
                    info=rd.getText().toString();
                    break;
                }
            }
            return info;
        }
    }
    
    

    8、新建一个activity页面,当单击我们listView时候,我们可以跳转到这个页面,进行学生信息的详细情况查看
    8-1、该页面的XML设计的代码如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="match_parent"
        android:background="@drawable/background3"
        android:id="@+id/back4"
        tools:context=".delite">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:background="@drawable/back2"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:textSize="20dp"
            android:text="学生信息详情如下"
            android:gravity="center"
            android:textColor="#00B8D4"/>
        <TextView
            android:id="@+id/no33"
            android:layout_marginTop="5dp"
            android:layout_width="match_parent"
            android:gravity="center"
            android:layout_height="25dp"
            android:inputType="text"
            android:textColor="#D50000"
            android:text="学号不能修改"/>
        <EditText
            android:id="@+id/name33"
            android:layout_marginTop="5dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="text"
            android:hint="@string/name" />
        <EditText
            android:id="@+id/age33"
            android:layout_marginTop="2dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="numberSigned"
            android:maxLength="3"
            android:hint="@string/age"/>
        <AutoCompleteTextView
            android:id="@+id/major33"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:inputType="text"
            android:hint="@string/major"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_marginTop="2dp"
            android:layout_height="wrap_content"
            android:textColor="#00B8D4"
            android:text="性别"/>
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/sex33"
            android:orientation="horizontal">
            <RadioButton
                android:layout_width="600dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:textColor="#00B0FF"
                android:clickable="false"
                android:text="男"/>
            <RadioButton
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:clickable="false"
                android:textColor="#D81B60"
                android:text="女"/>
        </RadioGroup>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="15dp"
            android:orientation="horizontal">
            <Button
                android:id="@+id/exit1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/button_shape1"
                android:text="退出" />
        </LinearLayout>
    </LinearLayout>
    

    界面设计的效果图如下所示:
    在这里插入图片描述
    8-2、该界面的实现类java代码如下所示:

    package com.cqjtu.studentsystemweb;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.RadioButton;
    import android.widget.RadioGroup;
    import android.widget.TextView;
    import java.util.ArrayList;
    import java.util.List;
    public class delite extends AppCompatActivity implements View.OnClickListener {
        private TextView id33;
        private EditText major33;
        private EditText age33;
        private RadioGroup sex33;
        private EditText name33;
        private Button exit1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_delite);
            id33=(TextView)findViewById(R.id.no33);
            name33=(EditText) findViewById(R.id.name33);
            sex33=(RadioGroup) findViewById(R.id.sex33);
            age33=(EditText) findViewById(R.id.age33);
            major33=(EditText)findViewById(R.id.major33);
            exit1=(Button)findViewById(R.id.exit1);
            exit1.setOnClickListener(this);
            name33.setKeyListener(null);
            age33.setKeyListener(null);
            major33.setKeyListener(null);
            View v = findViewById(R.id.back4);
            v.getBackground().setAlpha(230);
            Bundle bundle = getIntent().getExtras();
            List<Student> show=(ArrayList<Student>)bundle.get("show");
            String id=(String) show.get(0).getId();
            String name=(String) show.get(0).getName();
            String sex=(String) show.get(0).getSex();
            String age=(String) show.get(0).getAge();
            String major=(String)show.get(0).getMajor();
            id33.setText("学生学号:"+id);
            name33.setText("姓名:"+name);
            showRadio(sex33,sex);
            age33.setText("年龄:"+age);
            major33.setText("专业:"+major);
        }
        public void showRadio(RadioGroup radioGroup, String v){
            int num=radioGroup.getChildCount();
            for(int i=0;i<num;i++){
                RadioButton radioButton=(RadioButton)radioGroup.getChildAt(i);
                String info=radioButton.getText().toString();
                if(info.equals(v)){
                    radioButton.setChecked(true);
                    break;
                }
            }
        }
        public void showBox(LinearLayout linearLayout , List<String>v){
            int num=linearLayout.getChildCount();
            for(int i=0;i<num;i++){
                CheckBox checkBox=(CheckBox)linearLayout.getChildAt(i);
                checkBox.setChecked(false);
                for(String c:v){
                    if(checkBox.getText().toString().equals(c)){
                        checkBox.setChecked(true);
                        break;
                    }
                }
            }
        }
        @Override
        public void onClick(View view) {
            if(view.getId()==R.id.exit1){
                finish();
            }
        }
    }
    
    

    到这里,我们的AndroidStudent端的项目设计就完成了,接下来,我们就该进行服务器端的讲解了

    二、eclisp-Tomcat端的步骤如下所示:

    对于eclisp中的Tomcat的布置,大家可以参照一下网上的博客进行服务器端的Tomcat端进行相应的配置
    Tomcat在eclisp上面的配置参考教程
    (一)、创建我们需要的数据库

    1、用户名和密码的保存:

    列名 数据类型
    no int
    username varchar(30)
    password varchar(30)

    2、学生信息列表的创建:

    列名 数据类型
    no int
    name varchar(30)
    age int
    sex varchar(5)
    major varchar(30)

    (二)、创建学生信息类和用户名类对应android端的学生信息
    1、学生类的java代码如下:

    package cqjtu.edu.studentadmin.entity;
    public class Student {
    	private int no;
    	private String name;
    	private String sex;
    	private int age;
    	private String major;
    	public Student(){}
    	public Student(int no,String name,String sex,int age,String major){
    		this.no=no;
    		this.name=name;
    		this.sex=sex;
    		this.age=age;
    		this.major=major;
    	}
    	public int getNo() {
    		return no;
    	}
    	public void setNo(int no) {
    		this.no = no;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getMajor() {
    		return major;
    	}
    	public void setMajor(String major) {
    		this.major = major;
    	}
    }
    

    2、用户名类的java代码如下:

    package cqjtu.edu.studentadmin.entity;
    public class User {
    	private int no;
    	private String userName;
    	private String password;
    	public int getNo() {
    		return no;
    	}
    	public void setNo(int no) {
    		this.no = no;
    	}
    	public String getUserName() {
    		return userName;
    	}
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    }
    

    (三)、让服务器端与SqlServer数据库进行连接匹配
    1、创建一个java类DatabaseOperation进行对数据库的连接,代码如下所示:

    package cqjtu.edu.studentadmin.dao;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    import cqjtu.edu.studentadmin.entity.Course;
    import cqjtu.edu.studentadmin.entity.Grade;
    import cqjtu.edu.studentadmin.entity.Student;
    public class DatabaseOperation {
    	public static Connection getConn() {
    		String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    		String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=javaWeb;";
    		String userName="sa";
    		String userPwd="*******";//这里填写自己的数据库连接的密码
    		try
    		{
    		    Class.forName(driverName);
    		    Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd);
    		    return dbConn;
    		 }
    		 catch(ClassNotFoundException e)
    		 {
    			  e.printStackTrace();
    		 } 
    		 catch(SQLException e) {
    			  e.printStackTrace();
    		 }
    		 return null;
    	}
        /*
         * 用户登录验证
         */
        public boolean findUser(String name,String password){	
        	Connection conn=getConn();
    		String sql="select * from user1 where username=? and password=?";
    		PreparedStatement pst=null;
    		try {
    			pst=conn.prepareStatement(sql);
    			pst.setString(1, name);
    			pst.setString(2, password);
    			ResultSet results=pst.executeQuery();
    			while(results.next()) {
    				return true;
    			}		
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			try {
    				pst.close();
    				conn.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    		}
        	return false;   	 
        }
        /*
         * 学生信息查询 
         */
        public List<Student> findStuInfo(String key){
    		List<Student> students=new ArrayList<Student>();
    		Connection conn=getConn();
    		String sql = "select * from student where name like '%"+key+"%' or no like '%"+key+"%'";
    		try {
    			PreparedStatement pst=conn.prepareStatement(sql);
    			ResultSet results=pst.executeQuery();
    			while(results.next()){
    				int no=results.getInt("no");
    				String name=results.getString("name");
    				String sex=results.getString("sex");
    				int age=results.getInt("age");
    				String major=results.getString("major");
    				Student s=new Student(no,name,sex,age,major);
    				students.add(s);
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return students;	
    	}
        /*
         * 删除学生信息
         */
        public int deleteGradeInfo(int no,int no1){
        	int i=0;
        	Connection con=getConn();
        	String sql="delete from grade where sno=? and cno=?";
        	try {
    			PreparedStatement pst=con.prepareStatement(sql);
    			pst.setInt(1,no);
    			pst.setInt(2,no1);
    			i=pst.executeUpdate();
    			pst.close();
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        	return i;
        }
        /*
         * 插入学生信息
         */
        public int insertStuInfo(Student s){
    		if(s==null) return 0;
    		Connection con=getConn();
    		String sql="insert into student(name,sex,age,major) values(?,?,?,?)";
    		try {
    			PreparedStatement pst=con.prepareStatement(sql);
    			pst.setString(1, s.getName());
    			pst.setString(2, s.getSex());
    			pst.setInt(3, s.getAge());
    			pst.setString(4, s.getMajor());
    			int i=pst.executeUpdate();
    			pst.close();
    			con.close();
    			return i;
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			return 0;
    			
    		}
    	}
        /*
         * 编辑学生信息
         */
        public int updateStudent(Student s){
    		int i=0;
    		Connection con=getConn();
    		String sql="update student set name='"+s.getName()+"',sex='"+s.getSex()+"',age="+s.getAge()+",major='"+s.getMajor()+"'where"
    				+ " no="+s.getNo();
    		try {
    			PreparedStatement pst=con.prepareStatement(sql);
    			i=pst.executeUpdate();
    			pst.close();
    			con.close();
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return i;
    	}
    }
    

    (四)、对服务器学生信息实现和数据库学生信息同步的增、删、改、查!
    1、首先创建一个学生信息的接口类,StudentOperation,实现学生信息的一系列操作的函数接口,代码如下所示:

    package cqjtu.edu.studentadmin.service;
    import java.util.List;
    import cqjtu.edu.studentadmin.entity.Student;
    public interface StudentOperation {
    	public abstract List<Student> searchStudent(String key);
    	public abstract int  deleteStudent(int no);
    	public abstract int  insertStudent(Student s);
    	public abstract int  updateStudent(Student s);
    }
    

    增加学生信息public abstract int insertStudent(Student s);
    删除学生信息public abstract int deleteStudent(int no);
    修改学生信息public abstract int updateStudent(Student s);
    查找学生信息public abstract List<Student> searchStudent(String key);
    2、创建有一个学生信息接口函数的实现类StudentOperationImp,为接口StudentOperation完成函数的实现,java代码如下:

    package cqjtu.edu.studentadmin.service;
    import java.util.List;
    import cqjtu.edu.studentadmin.dao.DatabaseOperation;
    import cqjtu.edu.studentadmin.entity.Student;
    public class StudentOperationImp implements StudentOperation {
    	DatabaseOperation dbOp = new DatabaseOperation();
    	@Override
    	public List<Student> searchStudent(String key) {
    		// TODO Auto-generated method stub
    		return dbOp.findStuInfo(key);
    	}
    	@Override
    	public int deleteStudent(int no) {
    		int i = dbOp.deleteStuInfo(no);
    		return i;
    	}
    	@Override
    	public int insertStudent(Student s) {
    		int i = dbOp.insertStuInfo(s);
    		return i;
    	}
    	@Override
    	public int updateStudent(Student s) {
    		int i=dbOp.updateStudent(s);
    		return i;
    	}
    }
    

    以上中返回(return)的函数在数据库连接的函数中可以找到。
    (五)、创建学生信息的servlet服务和用户信息的servlet服务,用来实现前端和后端的相互访问
    1、新建一个servlet名为LoginServlet,进行用户的登录数据获取代码如下:

    package cqjtu.edu.jsp.servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.alibaba.fastjson.JSONObject;
    import cqjtu.edu.studentadmin.service.LoginService;
    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
        LoginService loginService=new LoginService();
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html;charset=utf-8");
    		//
    		response.setCharacterEncoding("UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		String username=request.getParameter("userName");
    		String password=request.getParameter("password");
    		JSONObject json = new JSONObject(); 
    		if(loginService.loginCheck(username, password)) {
    			json.put("code", 1);
    		}else {
    			json.put("code", 0);
    		}
    		PrintWriter pw=response.getWriter();
    		pw.print(json);
    		pw.close();
    	}
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    		doGet(request,resp);
    	}
    }
    

    这里response.setCharacterEncoding("UTF-8")request.setCharacterEncoding("UTF-8")这两句代码很重要,一个是保证传过去的数据不会发生乱码、另一个是保证从前端传回来的数据不会发生乱码、任何一个发生都会导致学生信息查找失败或者用户登录失败。
    2、新建一个servlet名为StudentInsertServlet,进行学生信息插入,java代码如下:

    package cqjtu.edu.jsp.servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.alibaba.fastjson.JSONObject;
    import com.mysql.jdbc.StringUtils;
    import cqjtu.edu.studentadmin.entity.Student;
    import cqjtu.edu.studentadmin.service.StudentOperationImp;
    /**
     * 学生信息保存
     */
    @WebServlet("/StudentInsertServlet")
    public class StudentInsertServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	StudentOperationImp stuOper = new StudentOperationImp();
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		response.setCharacterEncoding("UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		String name=request.getParameter("name");
    		String age=request.getParameter("age");
    		String no=request.getParameter("no");
    		String sex=request.getParameter("sex");
    		String major=request.getParameter("major");
    		int i=0 ;
    		if(StringUtils.isNullOrEmpty(no)) {//如果有No说明是编辑,没有说明是新增
    			Student s=new Student(0,name,sex,Integer.parseInt(age),major);
    			i=stuOper.insertStudent(s);
    		}else {
    			Student s=new Student(Integer.parseInt(no),name,sex,Integer.parseInt(age),major);
    			i=stuOper.updateStudent(s);
    		}
    		JSONObject json = new JSONObject();
    		json.put("code", i);
    		PrintWriter pw=response.getWriter();
    		pw.print(json);
    		pw.close();
    	}
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    		doGet(request,resp);
    	}
    }
    
    

    3、新建一个servlet名为StudentQuery,进行学生信息的查询,java代码如下:

    package cqjtu.edu.jsp.servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.alibaba.fastjson.JSONObject;
    import cqjtu.edu.studentadmin.entity.Student;
    import cqjtu.edu.studentadmin.service.StudentOperationImp;
    
    /**
     * Servlet implementation class StudentQuery
     */
    @WebServlet("/StudentQuery")
    public class StudentQuery extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	StudentOperationImp stuOper = new StudentOperationImp();
    	/**
    	 * 学生信息查询
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html;charset=utf-8");//防止页面出现中文乱码,要放在PrintWriter前面
    		response.setCharacterEncoding("UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		String key = request.getParameter("key");
    		JSONObject json = new JSONObject();
    		List<Student> students=stuOper.searchStudent(key);
    		json.put("students", students);
    		PrintWriter pw = response.getWriter();
    		pw.print(json);
    		pw.close();
    	}
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    		doGet(request,resp);
    	}
    }
    
    

    4、新建一个servlet名为StudentDelServlet,进行学生信息的删除,java代码如下:

    package cqjtu.edu.jsp.servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.alibaba.fastjson.JSONObject;
    import cqjtu.edu.studentadmin.service.StudentOperationImp;
    
    /**
     * Servlet implementation class StudentDelServlet
     */
    @WebServlet("/StudentDelServlet")
    public class StudentDelServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	StudentOperationImp stuOper = new StudentOperationImp();   
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		response.setContentType("text/html;charset=utf-8");
    		//
    		response.setCharacterEncoding("UTF-8");
    		request.setCharacterEncoding("UTF-8");
    		String no = request.getParameter("no");
    		int i=stuOper.deleteStudent(Integer.parseInt(no));
    		JSONObject json = new JSONObject();
    		json.put("code", i);
    		PrintWriter pw = response.getWriter();
    		pw.print(json);
    		pw.close();
    	}
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
    		doGet(request,resp);
    	}
    }
    
    

    (六)、在创建的web项目中找到web.xml文件,将里面添加代码为我们上面创建的一系列servlet
    1、web.xml中的代码如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
      <display-name>JSPStudy</display-name>
      <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>cqjtu.edu.jsp.servlet.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
      </servlet-mapping>
      <servlet>
        <servlet-name>studentQuery</servlet-name>
        <servlet-class>cqjtu.edu.jsp.servlet.StudentQuery</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>studentQuery</servlet-name>
        <url-pattern>/studentQuery</url-pattern>
      </servlet-mapping>
      <servlet>
        <servlet-name>studentDelServlet</servlet-name>
        <servlet-class>cqjtu.edu.jsp.servlet.StudentDelServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>studentDelServlet</servlet-name>
        <url-pattern>/studentDelServlet</url-pattern>
      </servlet-mapping>
      <servlet>
        <servlet-name>studentInsertServlet</servlet-name>
        <servlet-class>cqjtu.edu.jsp.servlet.StudentInsertServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>studentInsertServlet</servlet-name>
        <url-pattern>/studentInsertServlet</url-pattern>
      </servlet-mapping>
      <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>cqjtu.edu.jsp.servlet.MyServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

    2、创建我们的登录界面login.jsp,html文件代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/dist/css/AdminLTE.min.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/temp/login/logincss/myLogin.css">
    <title>登录</title>
    </head>
    <body class="hold-transition login-page">
    	<div class="login-box">
    		<div class="login-logo">
    			<h1>
    				学生课程管理系统<b>Admin</b>student
    			</h1>
    		</div>
    		<!-- /.login-logo -->
    		<div class="login-box-body">
    			<div class="form-group has-feedback">
    				<input type="text" class="form-control" placeholder="username"
    					id="userName"> <span
    					class="glyphicon glyphicon-envelope form-control-feedback"></span>
    			</div>
    			<div class="form-group has-feedback">
    				<input type="password" class="form-control" placeholder="Password"
    					id="password"> <span
    					class="glyphicon glyphicon-lock form-control-feedback"></span>
    			</div>
    			<div class="col-xs-12">
    				<label id="error" style="color: red"></label>
    			</div>
    			<div class="row">
    				<div class="col-xs-6">
    					<button type="button" id="loginBtn"
    						class="btn btn-primary btn-block btn-flat">登录</button>
    				</div>
    				<!-- /.col -->
    				<div class="col-xs-6">
    					<button type="reset" class="btn btn-primary btn-block btn-flat">重置</button>
    				</div>
    				<!-- /.col -->
    			</div>
    		</div>
    		<!-- /.login-box-body -->
    	</div>
    	<!-- /.login-box -->
    	<!-- jQuery 2.1.4 -->
    	<script
    		src="<%=request.getContextPath()%>/resource/jQuery/jQuery-2.1.4.min.js"></script>
    	<!-- Bootstrap 3.3.5 -->
    	<script
    		src="<%=request.getContextPath()%>/resource/bootstrap/js/bootstrap.min.js"></script>
    	<script type="text/javascript">
    		$('#loginBtn').on('click',function(){
    			var userName=$('#userName').val();
    			var password=$('#password').val();
    			var url="<%=request.getContextPath()%>/login"
    			var data = {
    				"userName" : userName,
    				"password" : password
    			}
    			$.ajax({
    				type : "post",
    				url : url,
    				dataType : "json",
    				data:data,
    				success : function(data) {
                        if(data.code==1){
                        	window.location ='<%=request.getContextPath()%>/temp/student/student.jsp';
    					} else {
    						$('#error').html('用户名或密码错误');
    					}
                    }
    		   })
    	})
    	</script>
    </body>
    </html>
    

    登录界面的效果如下所示:
    在这里插入图片描述
    3、创建我们的学生信息界面student.jsp,html文件代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/dist/css/AdminLTE.min.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/dist/css/skins/_all-skins.min.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/font-awesome-4.4.0/css/font-awesome.min.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/datatables/dataTables.bootstrap.css">
    <link rel="stylesheet"
    	href="<%=request.getContextPath()%>/resource/mycss/mystlye.css">
    <style type="text/css">
    table {
          text-align:center; /*设置水平居中*/
          vertical-align:middle;/*设置垂直居中*/
          font-size: 12px;
    }
    th {
          text-align:center; /*设置水平居中*/
          vertical-align:middle;/*设置垂直居中*/
          font-size: 14px;
    }
    </style>
    <title>学生信息管理</title>
    </head>
    <body class="hold-transition skin-yellow layout-top-nav">
    	<div class="wrapper">
    		<div class="main-header">
    			<div class="navbar navbar-static-top">
    				<div class="navbar-header">
    					<a href="#" class="navbar-brand"><b>Admin</b>课程管理</a>
    				</div>
    				<!--顶部导航栏菜单按钮-->
    				<div class="collapse navbar-collapse pull-left" id="navbar-collapse">
    					<ul class="nav navbar-nav">
    						<li class="active"><a href="#" id="studenshow">学生信息 <span
    								class="sr-only">(current)</span></a></li>
    						<li class="dropdown"><a href="course.jsp">课程信息 <span 
    								class="sr-only">(current)</span></a></li>
    						<li class="dropdown"><a href="grade.jsp">成绩管理 <span 
    						class="sr-only">(current)</span></a></li>
    					</ul>
    
    
    				</div>
    				<!-- /.navbar-collapse -->
    				<!--顶部导航栏右侧的-->
    			</div>
    		</div>
    		<div class="content-wrapper">
    			<div class="content" style="min-height: 560px">
    				<div class="box-header with-border">
    					<i class="fa fa-th-list"></i>
    					<h4 class="box-title">学生管理</h4>
    				</div>
    				<div class="box-body">
    					<div class="box-header with-border">
    						<button type="button" name="add"
    							class="btn btn-info pull-left addBtn">
    							<i class="fa fa-plus-circle"></i>添加
    						</button>
    						<button type="button" name="cancel" id="cancel-btn"
    							class="btn btn-info pull-left resetBtn" title="刷新">
    							<i class="fa fa-refresh"></i>刷新
    						</button>
    						<div class="form-inline pull-right">
    							<button type="button" name="search" id="search-btn"
    								class="btn btn-default pull-right searchBtn" title="查询">
    								<i class="fa fa-search"></i>
    							</button>
    							<input type="text"
    								class="form-control pull-right name-search position-search"
    								id="keyword" placeholder="姓名" />
    						</div>
    					</div>
    					<table width="100%" id="dataTable" class="table" >
    						<thead>
    							<tr>
    								<th width="10%">序号</th>
    								<th width="10%">学号</th>
    								<th width="15%">姓名</th>
    								<th width="15%">年龄</th>
    								<th width="15%">性别</th>
    								<th width="15%">专业</th>
    								<th width="20%">操作</th>
    							</tr>
    						</thead>
    						<tbody id="stuInfoList">
    						</tbody>
    					</table>
    				</div>
    			</div>
    
    		</div>
    		<div class="main-footer">
    			<div class="pull-right hidden-xs">
    				<strong>Copyright &copy; 2016-2017 <a href="#">重庆交通大学</a></strong>
    			</div>
    			<b>Version</b> 1.0.0
    
    		</div>
    		<!-- 学生信息弹窗 -->
    	<div class="modal" id="studentModal">
    		<div class="modal-dialog" role="dialog">
    			<div class="modal-content">
    				<form id="userEditForm">
    					<div class="modal-header">
    						<button type="button" class="close" data-dismiss="modal"
    							aria-label="Close">
    							<span aria-hidden="true">&times;</span>
    						</button>
    						<h4 class="modal-title">
    							<strong>学生信息</strong>
    						</h4>
    					</div>
    						<div class="modal-body">
    							<input type="hidden" name="no" id="no" />
    							<div class="form-horizontal">
    								<div class="row">
    									<div class="form-group">
    										<label class="col-sm-2 control-label">姓名</label>
    										<div class="col-sm-4">
    											<div class="col-md-10">
    												<input class="form-control" type="text" name="name"
    													id="name" />
    											</div>
    											<div class="col-md-2">
    												<span style="color: #F00; fontsize: 30px">*</span>
    											</div>
    										</div>
    										<label class="col-sm-2 control-label">年龄</label>
    										<div class="col-sm-4">
    											<div class="col-md-10">
    												<input class="form-control" type="text" name="age" id="age" />
    											</div>
    										</div>
    									</div>
    									<div class="form-group">
    										<label class="col-sm-2 control-label">专业</label>
    										<div class="col-sm-4">
    											<div class="col-md-10">
    												<select style="width: 100%" class="form-control"
    													name="major" id="major">
    													<option>物联网工程</option>
    													<option>计算机技术</option>
    													<option>电子信息工程</option>
    												</select>
    											</div>
    											<div class="col-md-2">
    												<span style="color: #F00; fontsize: 30px">*</span>
    											</div>
    										</div>
    										<label class="col-sm-2 control-label">性别</label>
    										<div class="col-sm-4">
    											<div class="col-md-6">
    												<input class="radioIterm" type="radio" name="sex" id="sex1"
    													value="male" checked="checked" /></div>
    											<div class="col-md-6">
    												<input class="radioIterm" type="radio" name="sex" id="sex2"
    													value="female" /></div>
    										</div>
    									</div>
    
    								</div>
    							</div>
    						</div>
    					<div class="modal-footer">
    							<button type="button" class="btn btn-primary saveBtn">保存</button>
    							<button type="button" class="btn btn-default"
    								data-dismiss="modal">返回</button>
    					</div>
    				</form>
    			</div>
    
    		</div>
    	</div> 
    	<!-- 学生信息弹窗 -->
    	</div>
    	
    
    	<!-- jQuery 2.1.4 -->
    	<script
    		src="<%=request.getContextPath()%>/resource/jQuery/jQuery-2.1.4.min.js"></script>
    	<!-- Bootstrap 3.3.5 -->
    	<script
    		src="<%=request.getContextPath()%>/resource/bootstrap/js/bootstrap.min.js"></script>
    		
    	<script type="text/javascript">
    	    //加载页面自动获得所有学生信息
    		jQuery(document).ready(function() {
    			findStudent("");
    		})
    		//打开增加学生信息的弹窗
    		$('.addBtn').on('click',function(){
    			jQuery("#no").val('');
    			jQuery("#name").val('');
    			jQuery("#age").val('');
    			jQuery('#sex').prop("checked", true);//默认选中文
    			jQuery("#major").val('');
    			jQuery("#studentModal").modal('show');
    		});
    		//保存学生信息
    		$('.saveBtn').on('click',function(){
    			saveStudent();
    		});
    		//查询学生信息
    	    $('.searchBtn').on('click',function(){
    	    	var key=$('#keyword').val();
    	    	findStudent(key);	
    	    })
    	    //刷新表格
    	    $('.resetBtn').on('click',function(){
    	    	findStudent("");	
    	    })
    	    ///保存学生信息
    		function saveStudent(){
    			var url='<%=request.getContextPath()%>/StudentInsertServlet';
    			var no = $('#no').val();
    			var name = $('#name').val();
    			var age = $('#age').val();
    
    			确定选择的性别
    			var sex;
    			var option = jQuery('input:radio[name="sex"]:checked').val();
    			if (option == "male") {
    				sex = '男';
    			}
    			if (option == "female") {
    				sex = '女';
    			}
    			///获得专业
    			var major = $('#major').val();
    			///传到后台保存的JSON数据
    			var data = {
    				'no' : no,
    				'name' : name,
    				'age' : age,
    				'sex' : sex,
    				'major' : major
    			}
    			$.ajax({
    				type : "post",
    				url : url,
    				dataType : "json",
    				data:data,
    				success : function(data) {
    					if (data.code == 1) {
    						findStudent('');
    						jQuery("#studentModal").modal('hide');
    					} else {
    						alert('保存失败')
    					}
    				}
    			})
    		}
    		//查找学生信息
    		function findStudent(key){
    			var url='<%=request.getContextPath()%>/StudentQuery?key='+key;
    			var t1=document.getElementById("dataTable");
    			$.ajax({
    				type : "get",
    				url : url,
    				dataType : "json",
    				contentType: "application/x-www-form-urlencoded; charset=utf-8",
    				success : function(data) {//根据返回的数据画出表格
                        if(data!=null){
                        	/*加载表格前先删除除第一行的所有行 */
    			            var rows=t1.rows;
                        	for(var i=rows.length-1;i>0;i--){
                        		rows[i].remove();
                        	}
                        	for(var i=0;i<data.students.length;i++){
                        		var row=document.createElement('tr');
                        		row.innerHTML="<td>"+(i+1)+"</td>"+"<td>"
                        		+ data.students[i].no
    							+ "</td>"
    							+ "<td>"
    							+ data.students[i].name
    							+ "</td>"
    							+ "<td>"
    							+ data.students[i].age
    							+ "</td>"
    							+ "<td>"
    							+ data.students[i].sex
    							+ "</td>"
    							+ "<td>"
    							+ data.students[i].major
    							+ "</td>"
                        		+"<td><button class='btn btn-sm btn-default delBtn' οnclick='deleteStudent(this)' value='"+data.students[i].no+"'>删除</button>"
                        		+"<button class='btn btn-sm btn-default editBtn' οnclick='editStudent(this)' value='"+(i+1)+"'>修改</button></td>";
                        		t1.appendChild(row);
                        	}
                        	
    					} 
                    }
    		   })
    		}
    		//编辑学生信息
    		function editStudent(d) {
    			jQuery("#studentModal").modal('show');
    			var i = d.value;
    			var table = document.getElementById("dataTable");
    			var rows = table.rows;
    			var no = rows[i].cells[1].innerHTML;
    			var name = rows[i].cells[2].innerHTML;
    			var age = rows[i].cells[3].innerHTML;
    			var sex=rows[i].cells[4].innerHTML;
    			var major=rows[i].cells[5].innerHTML;
    			$('#no').val(no);
    			$('#name').val(name);
    			$('#age').val(age);
    			单选按钮显示性别
    			var sex = rows[i].cells[4].innerHTML;
    			if (sex == "男") {
    				jQuery("#sex1").prop('checked', true);
    			}
    			if (sex == "女") {
    				jQuery("#sex2").prop('checked', true);
    			}
    			///下拉框显示学生的专业
    			showSelectOption('#major', selectValue);
    		}
    		//删除学生信息
    		function deleteStudent(d){
    			if(!confirm("是否删除该学生信息")) return;
    			var no=d.value
    			var url='<%=request.getContextPath()%>/StudentDelServlet?no='+ no;
    			$.ajax({
    				type : "get",
    				url : url,
    				dataType : "json",
    				success : function(data) {
    					if (data.code == 1) {
    						var row = d.parentNode.parentNode;//得到当前元素父节点的父节点(tr)
    						row.parentNode.removeChild(row);//删除当前行
    					} else {
    						alert("学生有选课信息不能删除!")
    					}
    				}
    			})
    		}
    	</script>
    </body>
    </html>
    

    学习信息界面的效果如下所示:
    在这里插入图片描述
    到这里,我们的服务器端的学生信息的相关操作我们也全部介绍完成。这个项目我们值得注意的是,大家一定要保证手机端的网络和电脑的网络处在同一局域网中,所以大家最好用手机开热点吧,然后电脑连接手机的热点进行此项目的操作。感谢大家收看林君的博客,往后我会持续发布相关的博客,包括我们如何处理某java中的某些错误,谢谢大家!

    展开全文
  • Android StudioTomcat 交互案例(新)

    千次阅读 2020-08-05 22:08:41
    参考androidtomcat数据交互 移动端输入两个数,点击按钮,在web端计算结果并返回,最后在页面弹出 Web端: web项目名:WebProject_war 只写了个Servlet进行逻辑的运算,Servlet名为:Servlet package ...

    首先默认已经装了Tomcat了,这方面的教程网上一大堆。

    github地址

    两数求和

    参考android与tomcat数据交互所写

    移动端输入两个数,点击按钮,在web端计算结果并返回,最后在页面弹出
    在这里插入图片描述
    Web端:

    在这里插入图片描述

    web项目名:WebProject_war

    只写了个Servlet进行逻辑的运算,Servlet名为:Servlet

    package com.Servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class Servlet
     */
    @WebServlet("/Servlet")
    public class Servlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public Servlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		 // TODO Auto-generated method stub
            //避免使用super.doPost(request,response)
    		
            PrintWriter out = response.getWriter();
            
            String n1 = request.getParameter("n1").trim();
            
            String n2 = request.getParameter("n2").trim();
            
            if(n1!=null && n2 != null && !"".equals(n1) && !"".equals(n2)) {
            	int a = Integer.parseInt(n1);
            	
            	int b = Integer.parseInt(n2);
            	
            	out.print(Integer.toString(a+b));
                out.flush();
                out.close();
            }
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    
    }
    
    

    接着导出改项目的war包,不管是IDEA还是Eclipse导出War包的博客有很多,这里不在讲了。
    导出后,将war包放在tomcat根目录下的webapps文件夹下。并且在根目录的bin文件夹中点击startup.bat启动tomcat。

    移动端:
    新建项目TomcatTest

    编写一个简单的页面,有两个输入框和一个按钮。

    activtiy_main.xml 代码

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:padding="10dp"
        android:orientation="vertical">
    
        <EditText
            android:id="@+id/shuju1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="input n1"/>
    
        <EditText
            android:id="@+id/shuju2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="input n2"/>
    
        <Button
            android:id="@+id/sum"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="Sum"/>
    
    </LinearLayout>
    

    然后是MainActivity.java的代码:

    package com.example.tomcattest;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.os.Looper;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.ProtocolException;
    import java.net.URL;
    
    public class MainActivity extends AppCompatActivity {
    
        private EditText shuju1;
        private EditText shuju2;
    
        String n1,n2;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Button button = (Button) findViewById(R.id.sum);
            shuju1 = (EditText) findViewById(R.id.shuju1);
            shuju2 = (EditText) findViewById(R.id.shuju2);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
    //                    Log.d("MainActivity","Start");
                        final String URL="http://10.0.2.2:8080/WebProject_war/Servlet";//根据自己的项目需要修改
    
                        new Thread(new Runnable() {
                            public void run()
                            {
                                String msg = "";
    
                                n1 = shuju1.getText().toString();//获取输入框的值
                                n2 = shuju2.getText().toString();
    
                                try {
    
    //                                Log.d("MainActivity","Continue");
                                    URL url = new URL(URL);//生成一个URL实例,指向我们刚才设定的地址URL
    
                                    /*
                                    openConnection()方法只是创建了一个HttpURLConnection实例,
                                       并不是真正连接,在连接之前可以设置一些属性
                                     */
                                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
                                    conn.setRequestMethod("POST"); //设置请求方式为post
    
                                    conn.setReadTimeout(5000);//设置超时信息
                                    conn.setConnectTimeout(5000);//设置超时信息
    
                                    conn.setDoInput(true);//设置输入流,允许输入
                                    conn.setDoOutput(true);//设置输出流,允许输出
                                    conn.setUseCaches(false);//设置POST请求方式不能够使用缓存
    
                                    /*
                                    定义我们要传给servlet的参数,格式好像一定要xxx=xxx,代表键值对,
                                      如果有多组,要加一个&,                                                                                         //如“cmd1=version&cmd2=value”
                                     */
                                    String data = "n1=" + n1 + "&n2=" + n2;
    
    //                                System.out.println("shuju" +" " +  n1 +" "+n2);
    
                                    /*
                                    获取输出流,其实在这之前还应该有一个操作:conn.connect();
                                      意思为建立HttpURLConnection连接,只不过//getOutputStream()方法会隐含
                                         进行连接,所以不调用connect()也可以建立连接
                                     */
                                    OutputStream out = conn.getOutputStream();
    
                                    //把data里的数据以字节的形式写入out流中
                                    out.write(data.getBytes());
    
                                    //刷新,将数据缓冲区中的数据全部输出,并清空缓冲区
                                    out.flush();
    
                                    //关闭输出流并释放与流相关的资源
                                    out.close();
    
                                    /*
                                    这里是将conn.getInputStream中的数据包装在字符流的缓冲流reader中
                                    这里值得一说的是:无论是post还是get,http请求实际上直到HttpURLConnection
                                       的getInputStream()这个函数
                                    里面才正式发出去,同时getInputStream返回的值就是servlet返回的数据
                                     */
                                    BufferedReader reader = new BufferedReader(new InputStreamReader(
                                            conn.getInputStream()));
                                    String line = null;
                                    if ((line = reader.readLine()) != null) {
                                        /*
                                        如果数据比较多的话要把if换成while,循环体代码也要小改一下,
                                        由于我当时只是测试,就没改
                                         */
                                        msg = line;
                                    }
                                    Looper.prepare();//为了在子线程中使用Toast
    
                                    Toast.makeText(MainActivity.this, "The answer is " +
                                            msg, Toast.LENGTH_SHORT).show();
    
                                    Looper.loop();
    
                                    conn.disconnect();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
    
                        }).start();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
    

    最后在AndroidManifest.xml中声明网页权限,并且允许使用未加密网络

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.tomcattest">
    
        <uses-permission android:name="android.permission.INTERNET"/>
    
        <application
         	 ....
            android:usesCleartextTraffic="true">
          	 ....
        </application>
    
    </manifest>
    

    关于URL="http://10.0.2.2:8080/WebProject_war/Servlet"中链接的写法,就是你的ip:端口/项目名/访问文件

      在一般的JavaWeb程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到我们的服务,这是为什么呢?
      我们可以这样来理解:Android的底层是Linux kernel,包括Android本身就是一个操作系统,因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是Android模拟器(Android虚拟机),而不是你的电脑,明白了吗?这就是为什么你在模拟器中使用localhost时会报“Web
    page not available”的原因。
      那到底要如何才能访问到本地电脑上的Web应用呢?在Android中,默认将我们本地电脑的地址映射为10.0.2.2,因此,只需要将原先的localhost或者127.0.0.1换成10.0.2.2,就可以在模拟器上访问本地计算机上的Web资源了。

    这样,一个简单的求和计算机就生成了。

    账户登录与注册

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    数据库用的MySQL ,数据库名为login,表名为user_table,字段如上图所示,其实这里演示只需要user和pwd两个属性就够了。

    web后端:
    用Eclipse写的
    项目名为LoginTest,结构如下
    在这里插入图片描述
    这里主要是访问LoginCheckServlet,里面实现登录和注册的逻辑,而具体实现在Dao下。

    接着导出改项目的war包,不管是IDEA还是Eclipse导出War包的博客有很多,这里不在讲了。
    导出后,将war包放在tomcat根目录下的webapps文件夹下。并且在根目录的bin文件夹中点击startup.bat启动tomcat。

    代码如有需要,去github自取。

    android前端:
    项目名LoginTest
    页面两个输入框两个按钮,activity_main.xml代码如下

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="13dp"
        android:orientation="vertical">
    
        <EditText
            android:id="@+id/admin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="账户"/>
    
        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="密码"
            android:inputType="textPassword"/>
    
        <Button
            android:id="@+id/regist"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="注册"/>
    
        <Button
            android:id="@+id/login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="登录"/>
    
    
    </LinearLayout>
    

    然后在MainActivity.java中实现具体逻辑

    package com.example.logintest;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.os.Looper;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    
        private EditText admin;
        private EditText password;
        private Button login;
        private Button regist;
    
        final String URL_LOGIN ="http://10.0.2.2:8080/LoginTest/loginCheckServlet";//根据自己的项目需要修改
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            admin = (EditText)findViewById(R.id.admin);
            password = (EditText) findViewById(R.id.password);
            login = (Button) findViewById(R.id.login);
            regist = (Button) findViewById(R.id.regist);
    
            login.setOnClickListener(this);
            regist.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.login:
                    Log.d("Main","Start");
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            String ad = admin.getText().toString();
                            String pw = password.getText().toString();
                            String flag = "";
    
                            try {
                                Log.d("Main","Continue");
                                URL url =new URL(URL_LOGIN);
    
                                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
                                conn.setRequestMethod("POST"); //设置请求方式为post
    
                                conn.setReadTimeout(5000);//设置超时信息
                                conn.setConnectTimeout(5000);//设置超时信息
    
                                conn.setDoInput(true);//设置输入流,允许输入
                                conn.setDoOutput(true);//设置输出流,允许输出
                                conn.setUseCaches(false);//设置POST请求方式不能够使用缓存
    
                                String data = "admin=" + ad + "&password=" + pw + "&flag=login";
    
                                OutputStream out = conn.getOutputStream();
    
                                out.write(data.getBytes());
    
                                out.flush();
    
                                out.close();
    
                                BufferedReader reader = new BufferedReader(new InputStreamReader(
                                        conn.getInputStream()));
                                String line = null;
                                if ((line = reader.readLine()) != null) {
                                     /*
                                       如果数据比较多的话要把if换成while,循环体代码也要小改一下,
                                        由于我当时只是测试,就没改
                                      */
                                     flag = line;
    
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            String msg = "";
                            if(flag.equals("true")) msg = "登录成功";
                            else msg = "失败";
    
                            Log.d("Main",msg);
                            Looper.prepare();
                            Toast.makeText(MainActivity.this, msg,
                                    Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        }
                    }).start();
    
                    break;
                case R.id.regist:
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            String ad = admin.getText().toString();
                            String pw = password.getText().toString();
                            String flag = "";
    
                            try {
                                URL url =new URL(URL_LOGIN);
    
                                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    
                                conn.setRequestMethod("POST"); //设置请求方式为post
    
                                conn.setReadTimeout(5000);//设置超时信息
                                conn.setConnectTimeout(5000);//设置超时信息
    
                                conn.setDoInput(true);//设置输入流,允许输入
                                conn.setDoOutput(true);//设置输出流,允许输出
                                conn.setUseCaches(false);//设置POST请求方式不能够使用缓存
    
                                String data = "admin=" + ad + "&password=" + pw + "&flag=regist";
    
                                OutputStream out = conn.getOutputStream();
    
                                out.write(data.getBytes());
    
                                out.flush();
    
                                out.close();
    
                                BufferedReader reader = new BufferedReader(new InputStreamReader(
                                        conn.getInputStream()));
                                String line = null;
                                if ((line = reader.readLine()) != null) {
                                     /*
                                       如果数据比较多的话要把if换成while,循环体代码也要小改一下,
                                        由于我当时只是测试,就没改
                                      */
                                    flag = line;
    
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            String msg = "";
                            if(flag.equals("true")) msg = "注册成功";
                            else msg = "注册失败";
    
                            Looper.prepare();
                            Toast.makeText(MainActivity.this, msg,
                                    Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        }
                    }).start();
    
                    break;
                default:
    
    
            }
        }
    }
    

    最后在AndroidManifest.xml中声明网页权限,并且允许使用未加密网络

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.tomcattest">
    
        <uses-permission android:name="android.permission.INTERNET"/>
    
        <application
         	 ....
            android:usesCleartextTraffic="true">
          	 ....
        </application>
    
    </manifest>
    

    关于URL="http://10.0.2.2:8080/WebProject_war/Servlet"中链接的写法,就是你的ip:端口/项目名/访问文件

      在一般的JavaWeb程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到我们的服务,这是为什么呢?
      我们可以这样来理解:Android的底层是Linux kernel,包括Android本身就是一个操作系统,因此,这时我们在模拟器的浏览器中输入的localhost或127.0.0.1所代表的是Android模拟器(Android虚拟机),而不是你的电脑,明白了吗?这就是为什么你在模拟器中使用localhost时会报“Web
    page not available”的原因。
      那到底要如何才能访问到本地电脑上的Web应用呢?在Android中,默认将我们本地电脑的地址映射为10.0.2.2,因此,只需要将原先的localhost或者127.0.0.1换成10.0.2.2,就可以在模拟器上访问本地计算机上的Web资源了。

    展开全文
  • Android Studio连接云服务器数据库

    千次阅读 2020-04-16 22:35:21
    Android Studio连接云服务器数据库写在开始1.Navicat连接云服务器数据库2.MyEclipse开发服务端servlet的相关步骤Android Studio端代码编写 写在开始 这篇教程用于记录一下我的一次Android Studio连接数据库的过程。...

    写在开始

    这篇教程用于记录一下我的一次Android Studio连接数据库的过程。在网上找别人的教程的时候看到了一篇很详细的教程,链接附在下方了,这里想针对在按照这篇链接制作的时候的一些问题做一些解释。
    按步骤一共可以分为五步(其实是六步,最开始还要去申请自己的云服务器,这里我用的是阿里云的学生的服务器,比较便宜哈哈,服务器系统选择的是ubuntu,官网注册完后就可以开始下面的步骤了):

    1. Xshell及Xftp配置连接到服务器Xshell及Xftp配置连接到服务器.
    2. 安装配置JDK以及Tomcat服务器安装配置JDK以及Tomcat服务器.
    3. 安装MySQL数据库的相关内容安装MySQL数据库的相关内容.
    4. MyEclipse开发服务端servlet的相关步骤
    5. Android Studio端代码编写Android Studio端代码编写.

    这个项目需要的jar文件和安装包在:(来自于网络,仅供学习使用)
    https://pan.baidu.com/s/1maw3apyoqpZcABf6HV3_MQ
    提取码:mp5p

    前三个步骤和第五个步骤那位大神的教程已经讲的很详细了,点击链接照做就可以了。PS:第三步需要去下载一个Navicat软件,用于可视化数据库管理。一般你在本地下载的MySQL安装包会包括这个软件在内的,直接安装即可。安装完后要连接你在第三步安装到阿里云服务器的数据库,教程如下:

    1.Navicat连接云服务器数据库

    这一步我也是遇到了一些问题,所以在这里也记录一下:
    注意要用SSH的方式进行连接,直接连接是连接不上的。这跟数据库连接的权限有关。
    在这里插入图片描述
    连接上数据库后就可以在这个软件里面直接对自己的数据库进行可视化操作啦,就不用麻烦的去打代码了。

    在这里再讲一下Navicat的一些基础配置,红框内的为系统一些初始的数据库,你需要右键新建一个新的数据库来使用,蓝色框内的就是我新建的数据库。双击进去,就可以在里面新建自己的表,来存放数据了。

    为了后面步骤的进行,这里需要先把你的表给构建起来,需要什么属性都先建好,再进行后面的步骤。
    ps:如果要在数据库中插入中文字符,需要将编码方式更改为utf8(数据库、表、属性三个地方都要更改!)
    在这里插入图片描述

    2.MyEclipse开发服务端servlet的相关步骤

    接下来就是要在写服务器端的代码了,这里选用任意一款 java IDE 都行,本教程用的是 MyEcilpse 进行代码的编写。

    开始吧:

    点击左上角的 File -> New -> Web Project 创建一个web项目,这里注意创建的时候要点击next进入下一步,不要直接点击finish
    在这里插入图片描述
    点击两下next后:注意勾选上Generate web.xml deployment descriptor 这样创建完后你的目录里面才会有web.xml文件
    在这里插入图片描述
    创建后目录组织如下:(红框内的即为web.xml项目,后面创建的servlet java文件都需要在里面进行声明,一般新建servlet是系统会自动帮你在web.xml里面进行声明)
    在这里插入图片描述

    接下来就是编写代码了:
    一般需要创建两种类型的文件,(两种文件均在src文件夹下创建即可。)

    1. 一种是普通的java class文件(不需要对数据库进行访问的基础配置文件)
    2. 一种是servlet.java项目,里面用于放置访问云端数据库的相关代码。

    具体的服务端代码我也是copy那位大神的改了一下:大神代码.
    有几个地方需要注意的是,他的DBManager这个用于连接数据库的代码(如下图)有获取web.xml中的字符,需要提前配置好:

    且每次重启tomca运行时需要先运行这个文件来初始化连接数据库,才能运行其他的文件。(这句话这里看不懂没关系,后面就知道了)
    在这里插入图片描述
    在这里插入图片描述

    代码中会涉及到部分jar的包需要在MyEclipse中导入:
    方法如下:
    第一步:将jar文件直接拖到在WebRoot/WEB-INF/lib下
    在这里插入图片描述
    第二步:右键项目 Build Path -> Configure Build Path,在弹出框左侧中选择Java Build Path -> 点击右侧Libraries -> 点击Add External JARs…将jar包导入即可
    在这里插入图片描述
    在这里插入图片描述

    编写好相关项目之后,(要记得解决完项目的warning,右键warning会有quick fix,按照quick fix能自动解决掉很多问题)需要将web项目导出。

    建议先在本地服务器测试自己的代码,看看能不能正常运行。

    需要提前下载java.jdk和tomcat压缩包,并将它们解压。解压完后就OK了,不需要进行安装什么的。

    本地测试教程:
    MyEclipse在本地的web上面测试的话,需要配置java.jdk和tomcat。 配置方法:window->Preferences->在搜索框里搜索java或tomacat,将路径指向解压后的文件夹的位置即可。
    如:
    在这里插入图片描述
    本地基础配置完后,可以用浏览器登录http://localhost:8080看一下有没有Tomcat配置成功页面(注意要先启动Tomcat,如下:
    在MyExclipse下方,选中Servers选择Tomact后,点击下图按钮Add Deployment将项目部署到本地的Tomacat上后点击运行

    在这里插入图片描述

    点击下图按钮就可以打开MyEclipse 自带的web浏览器了,在里面输入框里面输入url即可实现测试。Url格式为:http://localhost:8080/项目名/servlet项目路径名称

    在这里插入图片描述
    本地测试无误后,然后将web项目导出:(导出教程图来自百度)
    在这里插入图片描述
    在这里插入图片描述

    接下来需要将导出的项目部署到云服务器端:
    方法:通过Xftp连接上数据库之后将刚刚那一步骤生成的war文件发送到/usr/java/tomcat/apache-tomcat-8.5.51/webapps路径下(即安装tomcat的地方)
    在这里插入图片描述
    此时在浏览器输入 http://你的IP/项目名称/要打开的java文件名称 即可运行对应的java文件。
    注意:下图红框内的url即你要在《要打开的java文件名称》处填写的
    在这里插入图片描述

    预览效果:
    在这里插入图片描述
    账户存在:
    在这里插入图片描述
    在这里插入图片描述
    注册后数据库更新:
    在这里插入图片描述

    一些错误预告:

    1. 如果访问后网页显示404,说明是路径不正确,按照上面步骤检查一下自己的路径是否正确。
    2. 如果你的url里有中文字符需要更换低版本的Tomcat(版本在6及以下就可以了),且不要使用IE浏览器测试,用其他浏览器测试。(将中文的字符插入数据库也是需要进行一系列的配置的,要将数据库的编码方式更改为utf8,具体百度吧)

    Android Studio端代码编写

    具体可以看大神教程,这一步骤没有什么问题,代码根据自己的需要来改就好了。Android Studio端代码编写.

    注意,要使编写的代码能运行,需要先让Android Studio获取上网权限:
    向AndroidManifest.xml文件中加入:

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

    如图所示:
    在这里插入图片描述

    展开全文
  • 1--电脑ip连接正确(手机连接WiFi时,以下两个都可以) 2--电脑防火墙关闭(一定要关闭,我的就是防火墙原因)

    1--电脑ip连接正确(手机连接WiFi时,以下两个都可以)

    2--电脑防火墙关闭(一定要关闭,我的就是防火墙原因)

    展开全文
  • 1.myeclipae将项目部署在tomacate上,浏览器可以访问,Android模拟器访问不了,也不报错 ``` public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle ...
  • 用myeclipse将项目部署在tomcate上,浏览器可以访问,android studio模拟器访问不了,也不报错 2.代码 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle ...
  • Android模拟器访问本地tomcat服务器下的web应用(webservice),localhost换成10.0.2.2 安装tomcat后,在浏览器中输入http://localhost:9090/(默认端口为8080,可根据自己情况更改)就能出现tomcat界面 在一般的...
  • <p>i heard that the ...<p>-android studio <p>-sql server management studio <p>-php written in notepad (?) <p>-apache tomcat? <p>anything else?</p></li> <p>Sorry for bad english, Thanks </div>
  • Android连接Tomcat服务器

    千次阅读 2015-11-18 20:23:22
    在保证服务器是正常状态时,将从Android模拟器上发送请求给服务端并接收服务端返回来的响应。 保证HttpServlet配置正常。可以通过在浏览器输入配置的地址,若能正常响应,那么在Android中去请求的话也是能正常响应...
  • Android Studio找不到连接的手机完全解决办法 1、问题背景 现在Android大多都用谷歌的Android Studio来开发 但是 一开始使用Android Studio都不会那么顺利 总要踩坑 其中踩得最多的坑就是 Android Studio里找不到...
  • 知道大家是否想试一下用Android模拟器如何访问自己建的Web站点呢?  下面我将讲一下如何实现  Step 1:我用的Tomcat作为本地服务器,在Webapps这个目录里,把我的名为kankong的Web工程放进来,启动Tomcat服务器....
  • 实现客户端服务端的连接(eclipese和androidstudio连接) 1.Manifest网络权限 <uses-permission android:name="android.permission.INTERNET" /> 2.定义ConfigUtil存放数据类 SERVER_ADDR存放 ip地址 + ...
  • Android直接连接tomcat? 这个实现比较简单,先建立一个工作目录为tomcat。打开命令行切换到该目录。如果是win7需要用管理员身份打开命令行。? 1 生成服务器端私钥(or 公钥?)? keytool -genkey -alias ...
  • android真机连接pc上的服务器,不需要路由器,只需打开pc自带的wifi功能即可
  • 由于内网无法连接到外部网络,在使用Gradle编译Android Studio项目时就会面临一些问题:1.Gradle安装文件无法下载2.Gradle Android插件无法下载3.项目依赖文件无法下载苦心人天不负,通过摸索,找到了一些解决方法,...
  • 文章目录准备工作AndroidStudio虚拟设备连接本机服务器自己手机连接本机服务器 准备工作 我们在安装了Tomcat之后,一般都能做到在浏览器输入localhost:8080看到这样的界面: 那如果我们想在客户端连接到自己电脑上...
  • android studio手机连接本地服务器测试

    万次阅读 2017-10-20 10:22:37
     作为一名Android开发者,不管怎么说,都会经历使用Android真机来测试连接本地服务器这样的事情。这里所说的“本地服务器”大多数时候指的是:搭载有某种服务器软件的PC,例如搭载有Tomcat服务器的PC,就可以拿来...
  • 于是各种查阅资料,百度之后实现了一个简单的demo(由于本篇不是关于即时通讯的所以就不贴代码了),服务端代码能正常的在本地运行(在android studio中运行一个带有main函数的类),在同一局域网的客户端可以访问到...
  • System.out.println("连接数据库成功!"); // 创建statement类对象,用来执行SQL语句 Statement stat = dbConn.createStatement(); stat.executeUpdate("Insert into Xuxing values (925,'dddd','...
  • 解决retrofit在Android Studio模拟器上无法访问本地的tomcat服务器问题 近来突发奇想在本地搭建一个Tomcat服务器,使用retrofit来访问,结果却出现一直访问失败的问题,但是请求网上服务器却可以成功请求到,因此...
  • Android Studio实现多媒体播放器

    千次阅读 多人点赞 2020-06-23 19:55:04
    这次的网络版音乐视频播放器是在前面讲到的音乐播放器项目(Android Studio如何实现音乐播放器)基础上,将音乐文件与项目文件独立开,放在服务器的文件夹里面进行访问,除此之外还添加了视频播放器功能。...
  • 在使用android真机试图连接本地的tomcat的时候,发现一直没有反应.网上搜了很多资料,加上自己不断测试,后来发现模拟器访问tomcat的时候,ip的概念跟在pc上访问tomcat用的ip,根本就不同,更不用说真机了.怎么说呢?如果...
  • android studio连接本地tomcat项目,连接失败。 可以将127.0.0.1更换成10.0.2.2 如果更换过tomcat的端口,在url中加入端口号即可
  • Android真机连接本地部署的Tomcat问题

    千次阅读 2017-05-10 11:41:48
    Tomcat
  • 得一边用 Eclipse 开发web server 一边用 Android Studio 写Anroid . 第一想法:这也造成了一些部署 调试 webserver的麻烦. 所以用 vollery 框架 配合 web端 jsp脚本,就比较方便了. 这样就可以方便在项目...
  • 不,应该是这几天都在弄的登录响应问题,连接一直有问题: 1、首先是服务器一直接收不到我传递过去的数据,是因为我的Person类中没有toString()方法,值根本没传过去。 2、移动端显示响应代码为400,是因为我的...
  • android 如何使用tomcat搭建服务器

    热门讨论 2013-03-13 10:25:55
    初学者,想尝试着做一个完整的程序么?那么tomcat必不可少

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,145
精华内容 458
关键字:

androidstudio连接tomcat