精华内容
下载资源
问答
  • 管理员添加用户 + 查看所有用户信息
    千次阅读
    2019-11-30 19:47:10

    一、最终实现样式

    1、输入信息后点击“添加用户” → 可将信息加入数据库中
    在这里插入图片描述
    2、点击“查看已注册的用户” → 跳转到Admin_user_show.jsp界面,即可查看所有用户的信息:包括刚添加的用户信息(但还未解决乱码问题)
    在这里插入图片描述
    3、点击“返回添加用户” → 即可回到开始的添加用户信息界面

    二、代码展示

    userDao.java
    //管理员Admin_user界面显示全部用户信息
    public List<user> selectAllUser();
    //管理员在Admin_user.jsp界面添加用户 + 注册:查询用户名是否重复
    public user getUserByUsername(String user_name);
    
    userDaoImpl.java
    //管理员Admin_user界面显示全部用户信息
    public List<user> selectAllUser() {
       List<user> show_user = new ArrayList<user>();
       try {
            Connection con = connectionUtils.getCon();
       	String sql = "select user_id,user_name,user_password,user_num,user_phone,user_sex,user_school,user_identify,user_intro from user";
      	PreparedStatement ps = con.prepareStatement(sql);
       	ResultSet rs = ps.executeQuery();
       	while(rs.next()) {
       	    user user = new user();
        	    user.setUser_id(rs.getInt("user_id"));
       	    user.setUser_name(rs.getString("user_name"));        
       	    user.setUser_password(rs.getString("user_password"));
                user.setUser_num(rs.getString("user_num"));
                user.setUser_phone(rs.getString("user_phone"));
        	    user.setUser_sex(rs.getString("user_sex"));
        	    user.setUser_school(rs.getString("user_school"));
        	    user.setUser_identify(rs.getString("user_identify"));
        	    user.setUser_intro(rs.getString("user_intro"));
        	    show_user.add(user);
           }
           return show_user;
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           try {
               connectionUtils.closeCon();
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
       return null;
    }
    //管理员在Admin_user.jsp界面添加用户 + 注册:查询用户名是否重复(里面内容几乎一样,删除其中的password)
    @Override
    public user getUserByUsername(String user_name) {
       user u = null;
       //JDBC步骤:获取连接、编写SQL、预编译SQL、设置占位符参数、执行SQL、封装结果、关闭连接
       //选中后右键surround with再选try/catch block
    //1.获取连接:首先,添加驱动包mysql-connector-java-5.1.48-bin.jar,会自动build path
       try {
       /*
        * Class.forName("com.mysql.jdbc.Driver"); String
        * url="jdbc:mysql://localhost:3306/syj"; String sql_user="root"; String
        * sql_pwd="syjsql"; Connection con =
        * DriverManager.getConnection(url,sql_user,sql_pwd);
        */  
           Connection con = connectionUtils.getCon();
           String sql = "select user_id,user_name,user_password from user where user_name = ?";
           PreparedStatement ps = con.prepareStatement(sql);
           ps.setString(1,user_name);
           ResultSet rs = ps.executeQuery();
           if(rs.next()) {
        	  u = new user();
       	  u.setUser_id(rs.getInt("user_id"));
       	  u.setUser_name(rs.getString("user_name"));
        	  u.setUser_password(rs.getString("user_password"));
           }
           return u;
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           try {
               connectionUtils.closeCon();
           } catch(Exception e) {
               e.printStackTrace();
           }
       }
       return null;
    }
    
    AddUserServlet.java
    package com.syj.login.servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.syj.login.beans.user;
    import com.syj.login.dao.userDao;
    import com.syj.login.dao.userDaoImpl;
    
    public class AddUserServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//确认请求是否获取到
    		System.out.println("添加用户请求过来了!");
    		//1、获取到管理员输入的用户信息
    		String user_name = request.getParameter("user_name");
    		String user_password = request.getParameter("user_password");
    		String user_num = request.getParameter("user_num");
    		String user_phone = request.getParameter("user_phone");
    		String user_sex = request.getParameter("user_sex");
    		String user_school = request.getParameter("user_school");
    		String user_identify = request.getParameter("user_identify");
    		String user_intro = request.getParameter("user_intro");
    		
    		/**
    		 * 1.不验证用户名是否重复的过程
    		 * */
    		//2、将活动信息插入到数据库中
    		//userDao userDao = new userDaoImpl();
    		//userDao.insertUser(user_name,user_password,user_num,user_phone,user_sex,user_school,user_identify,user_intro);
    		//3、发布成功返回当前页面
    		//response.sendRedirect("Admin_user.jsp");
    		
    		/**
    		 * 2.验证用户名是否重复的过程
    		 * */
    		//2、将活动信息插入到数据库中
    		userDao userDao = new userDaoImpl();
    		user user = userDao.getUserByUsername(user_name);
    		if(user!=null) {
    			//注册失败回到注册页面并显示提示信息   →   转发
    			request.setAttribute("AddUser_msg", "用户名已经存在!若输入本人姓名依旧重复,请修改为‘年级+姓名’,例如‘16张三’");
    			request.getRequestDispatcher("Admin_user.jsp").forward(request,response);
    		}else {
    			//可以注册
    			//3、将用户注册的信息插入到数据库中
    			userDao.insertUser(user_name,user_password,user_num,user_phone,user_sex,user_school,user_identify,user_intro);
    			//4、注册成功去往登录页面
    			response.sendRedirect("Admin_user.jsp");
    		}
    	}
    }
    
    Admin_user.jsp
    <div id="content_middle">
    	<div id="content_middle_shang">
    		<br/>
    		<div id="content_middle_title">
    			<h2>添加用户</h2>
    			<h5>请按照下列要求输入内容进行用户的添加</h5>
    		</div>
    		<!-- action="AddNewsServlet" -->
    		<form name="SubmitUser" id="AddUserServlet">
    			用户名称:
    			<span id="AddUserMsg">${AddUser_msg}</span>
    			<br/>
    			<input type="text" id="user_name" name="user_name" style="width:800px;height:25px;size:100%;" placeholder="社团成员请输入您的名字"/>
    			<br/>
    			用户密码:<br/><input type="password" id="user_password" name="user_password" style="width:800px;height:25px;size:100%;" placeholder="请输入您的用户密码"/>
    			<br/>
    			用户学号:<br/><input type="text" name="user_num" style="width:800px;height:25px;size:100%;" placeholder="社团成员请输入您的学号"/>
    			<br/>
    			联系方式:<br/><input type="text" name="user_phone" style="width:800px;height:25px;size:100%;" placeholder="请输入您的联系方式"/>
    			<br/>
    			用户性别:<br/>
    			<input type="text" name="user_sex" style="width:800px;height:25px;size:100%;" placeholder="请输入您的性别"/>
    			<br/>
    			学校社团:<br/><input type="text" name="user_school" style="width:800px;height:25px;size:100%;" placeholder="请输入您的学校及社团名"/>
    			<br/>
    			用户身份:<br/>
    			<input type="text" name="user_identify" style="width:800px;height:25px;size:100%;" placeholder="请输入您的性别"/>
    			<br/><br/>
    			<div id="submit_user">
    				<input type="button" onclick="AddUser()" id="add_user" value="添加用户" style="width:120px;height:40px;font-size:18px;"/>
    				<input type="button" onclick="ShowUser()" id="show_user" value="查看已注册的用户" style="width:180px;height:40px;font-size:18px;"/>
    			</div>
    		</form>
    	</div>
    </div>
    
    Admin_User_Show.jsp
    <script>
    	function Admin_DeleteUser(user_name){
    		//用户安全提示
    		if(confirm("您确定要删除么?")){
    			//访问路径
    			//location.href="${pageContext.request.contextPath}/DeleteUserServlet?user_name= " + user_name;
    			//location.href="${pageContext.request.contextPath}/DeleteUserServlet?user_name=${user.user_name};
    		}
    	}
    			
    	function AddUser(){
    		//document.SubmitUser.method="post"; 
    		//document.SubmitUser.action="AddUserServlet";
    		//document.SubmitUser.submit();
    		/* 返回添加用户信息界面不需要触发servlet */
    		document.location="Admin_news.jsp";
    	}
    	function ShowUser(){
    		document.SubmitUser.method="post"; 
    		document.SubmitUser.action="ShowUserServlet";
    		document.SubmitUser.submit();
    	}
    </script>
    
    <div id="content">
    	<%@include file="Admin_content_left.jsp" %>
    	<div id="content_middle">
    		<div id="content_middle_shang">
    			<!-- 管理员添加用户信息 -->
    			<br/>
    			<div id="content_middle_title">
    				<h1>已注册的用户信息</h1>
    				<h4>可审核后进行修改和删除</h4>
    			</div>
    			<!-- cellspacing:td之间的距离 -->
    			<form name="SubmitUser" id="ShowUserServlet">
    				<table border="1px" width="70%" align="center" cellspacing="0px">
    					<tr>
    						<th>user_id</th>
    						<th>user_name</th>
    						<th>user_password</th>
    						<th>user_num</th>
    						<th>user_phone</th>
    						<th>user_sex</th>
    						<th>user_school</th>
    						<th>user_identify</th>
    						<th>user_intro</th>
    						<th>operation</th>
    					</tr>
    							
    					<%-- 原方法 --%>
    					<%
    						//添加如下一行代码时,(List<user>)request.getAttribute("show_user");不报黄错
    						@SuppressWarnings("unchecked")
    						//获取所有的员工数据:alt+/导包
    						List<user> show_user = (List<user>)request.getAttribute("show_user");
    						for(user user :show_user) {
    					 %>
    							<tr align="center">
    								<td><%=user.getUser_id() %></td>
    								<td id="user_name"><%=user.getUser_name() %></td>
    								<td><%=user.getUser_password() %></td>
    								<td><%=user.getUser_num() %></td>
    								<td><%=user.getUser_phone() %></td>
    								<td><%=user.getUser_sex() %></td>
    								<td><%=user.getUser_school() %></td>
    								<td><%=user.getUser_identify() %></td>
    								<td><%=user.getUser_intro() %></td>
    								<!-- <td>user.getSex()==0?"女":"男"</td> -->
    								<td>
    									<a href="#">编辑</a>
    									<a href="#">删除</a>
    								</td>
    							</tr>
    					<%
    						}
    					 %>
    				</table>
    			</form>
    			<br/>
    			<div id="submit_user">
    				<input type="button" onclick="AddUser()" id="add_user" value="返回添加用户" style="width:120px;height:40px;font-size:18px;"/>
    				<input type="button" onclick="ShowUser()" id="show_user" value="查看已注册的用户" style="width:180px;height:40px;font-size:18px;"/>
    			</div>
    		</div>
    	</div>
    </div>
    
    AddUserServlet.java
    package com.syj.login.servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.syj.login.beans.user;
    import com.syj.login.dao.userDao;
    import com.syj.login.dao.userDaoImpl;
    
    public class AddUserServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doPost(request, response);
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//确认请求是否获取到
    		System.out.println("添加用户请求过来了!");
    		//1、获取到管理员输入的用户信息
    		String user_name = request.getParameter("user_name");
    		String user_password = request.getParameter("user_password");
    		String user_num = request.getParameter("user_num");
    		String user_phone = request.getParameter("user_phone");
    		String user_sex = request.getParameter("user_sex");
    		String user_school = request.getParameter("user_school");
    		String user_identify = request.getParameter("user_identify");
    		String user_intro = request.getParameter("user_intro");
    		
    		/**
    		 * 1.不验证用户名是否重复的过程
    		 * */
    		//2、将活动信息插入到数据库中
    		//userDao userDao = new userDaoImpl();
    		//userDao.insertUser(user_name,user_password,user_num,user_phone,user_sex,user_school,user_identify,user_intro);
    		//3、发布成功返回当前页面
    		//response.sendRedirect("Admin_user.jsp");
    		
    		/**
    		 * 2.验证用户名是否重复的过程
    		 * */
    		//2、将活动信息插入到数据库中
    		userDao userDao = new userDaoImpl();
    		user user = userDao.getUserByUsername(user_name);
    		if(user!=null) {
    			//注册失败回到注册页面并显示提示信息   →   转发
    			request.setAttribute("AddUser_msg", "用户名已经存在!若输入本人姓名依旧重复,请修改为‘年级+姓名’,例如‘16张三’");
    			request.getRequestDispatcher("Admin_user.jsp").forward(request,response);
    		}else {
    			//可以注册
    			//3、将用户注册的信息插入到数据库中
    			userDao.insertUser(user_name,user_password,user_num,user_phone,user_sex,user_school,user_identify,user_intro);
    			//4、注册成功去往登录页面
    			response.sendRedirect("Admin_user.jsp");
    		}
    	}
    
    }
    
    ShowUserServlet.java
    package com.syj.login.servlet;
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.syj.login.beans.user;
    import com.syj.login.dao.userDao;
    import com.syj.login.dao.userDaoImpl;
    
    public class ShowUserServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    	
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//确认请求是否获取到
    		System.out.println("查看全部用户信息的请求过来了!");
    		//1、获取到管理员输入的活动信息
    		//String user_name = request.getParameter("user_name");
    		//String user_password = request.getParameter("user_password");
    		//String user_num = request.getParameter("user_num");
    		//String user_phone = request.getParameter("user_phone");
    		//String user_sex = request.getParameter("user_sex");
    		//String user_school = request.getParameter("user_school");
    		//String user_identify = request.getParameter("user_identify");
    		//String user_intro = request.getParameter("user_intro");
    		/**
    		 * -查看活动信息时不需要获取管理员输入的信息,因为刚刚输入过的信息已经在数据库中了,即使取也获取到的为空值null
    		 * */
    		//2、将活动信息插入到Admin_news_show.jsp活动信息展示页面
    		userDao userDao = new userDaoImpl();
    		//userDao.selectAllNews();
    		List<user> show_user = userDao.selectAllUser();
    		//转发之前绑定数据
    		request.setAttribute("show_user", show_user);
    		//再转发到管理员页面
    		//response.sendRedirect("Admin_news_show.jsp");
    		request.getRequestDispatcher("Admin_user_show.jsp").forward(request,response);
    			
    	}
    }
    

    三、过程解析

    1、所遇问题:
    (1)进行“添加用户信息”和“查看用户信息”两个操作的跳转时,使用了两个submit的提交方式,但是form表单只能提交一个submit

    解决措施:
    将submit改为button,分别设置onclick为AddUser()和ShowUser(),通过js中的function AddUser()和function ShowUser()方法触发对应的servlet(AddUserServlet和ShowUserServlet)

    2、整体过程:
    (1)添加用户:输入信息后,点击“添加用户”,通过js方法中的AddUser触发对应的AddUserServlet,通过userDao中的getUserByUsername类提取用户名,并使用if的条件语句验证用户名是否存在,若存在则不能插入并报红色提示(AddUser_msg),若用户名不存在则调用userDao中的insertUser类将数据插入到数据库中,插入成功后使用response.sendRedirect跳转到Admin_user.jsp界面。

    更多相关内容
  • Android添加联系信息并读取

    千次阅读 2017-03-05 12:55:59
    Android添加联系信息并读取 效果图 题目 1. 创建一个File文件,路径为/mnt/sdcard/temp/zhiyuan.txt 2. 进入主页面后自动从File文件中读取联系数据,每个item只显示,姓名和电话。如果,你在添加联系...
    Android添加联系人信息并读取
    效果图

    题目
    1. 创建一个File文件,路径为/mnt/sdcard/temp/zhiyuan.txt
    2. 进入主页面后自动从File文件中读取联系人数据,每个item只显示,姓名和电话。如果,你在添加联系人时,填写了备注,那么item的姓名显示成你保存的备注。否则显示姓名。
    3.  添加联系人功能,布局最上方有一个添加联系人按钮,下面是ListView, 当点击添加联系人按钮时,跳转至新页面,输入姓名,电话,备注(电话和 姓名不能为空,电话只能为数字)。确定后保存File文件,并且直接回退到 主页面
    4. 当点击每个item时,跳转至详细页面,显示当前联系人的名字、电话、 备注。

    代码演示
    1. 新建一个Module命名为AndroidContact
    在XML布局文件activity_main中添加一个Button按钮命名为添加联系人信息
    再添加一个ListView用于显示接收的联系人信息

    2.新建一个activity_item行布局文件用于将联系人信息以行布局的形式显示在ListView列表上
    并添加两个TextView用于显示联系人姓名和电话

    3.新建一个AddActivity类用于跳转添加联系人信息
    再新建一个DetialActivity类用于跳转显示联系人信息详情

    4.在XML布局文件activity_add中添加三个EditText用于输入联系人姓名,电话,备注
    再添加一个Button用于将输入的联系人信息保存到File文件中

    5.在AddActivity中实例化EditText控件,Button控件,并给Button添加监听
    在监听中实例化File对象,参数为路径名
    判断文件是否存在,如果存在则存储数据并且追加数据属性
    把文件 保存置为追加,true为追加
    添加一个判断,如果联系人姓名,电话的内容不为空,则存储,备注信息可以为空
    使用Toast提示存储是否成功
    使用Finish();属性销毁页面返回主类
    package com.example.cxy.androidcontact;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class AddActivity extends AppCompatActivity implements View.OnClickListener {
        private EditText ed_Name, ed_Phone, ed_Remark;
        private Button btn_Save;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add);
            initView();
        }
    
        private void initView() {
            ed_Name = (EditText) findViewById(R.id.editName);
            ed_Phone = (EditText) findViewById(R.id.editPhone);
            ed_Remark = (EditText) findViewById(R.id.editRemark);
            btn_Save = (Button) findViewById(R.id.btn_save);
            btn_Save.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            //判断文件是否存在,如果存在则存入数据,且为追加属性
            try {
                File file = new File("/mnt/sdcard/contact/contact.txt");
                if (!file.exists()) {
                    file = new File("/mnt/sdcard/contact");
                    file.mkdir();
                    file = new File("/mnt/sdcard/contact/contact.txt");
                    file.createNewFile();
                }
                //把你的文件保存置为追加。true则为追加
                FileOutputStream out = new FileOutputStream(file, true);
                //如果文本内容不为空,则存储
                if (!(TextUtils.isEmpty(ed_Name.getText().toString()) || TextUtils.isEmpty(ed_Phone.getText().toString()))) {
                    String person = ed_Name.getText().toString() + "," + ed_Phone.getText().toString() + "," + ed_Remark.getText().toString() + "#";
                    out.write(person.getBytes());
                    out.close();
                    Toast.makeText(AddActivity.this, "存储成功", Toast.LENGTH_SHORT).show();
                    //页面销毁,返回主类
                    finish();
                } else {
                    Toast.makeText(AddActivity.this, "存储失败", Toast.LENGTH_SHORT).show();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    6.新建一个Package包命名为adapter
    在包中新建一个MyAdapter类用于给列表添加适配器

    7.在MyAdapter类中 编写一个私有的上下文对象(Context)和一个私有的List<Map<String,String>>mList;集合
    构造一个List<Map<String,String>>mList;集合和Context上下文对象的有参构造方法
    并使本类继承于 BaseAdapter类(public class MyAdapter extends BaseAdapter
    将获取列表总长度的getCount()方法的返回值改为mList.size()返回全局的列表总长度
    将获取当前整个Item的getItem()方法的返回值改为mList.get(position)返回一个当前视图中所有数据的下标
    将获取当前Item的id的getItemId()方法的返回值改为position()返回Id的下标
    将获取视图的getView()方法的返回值改为converView()返回当前视图给用户看
    创建一个ViewHolder内部类对象 用于声明activity_item行布局的TextView控件
    创建ViewHodler类对象
    添加判断当前converView是否为空如果为空则加载新的Item行布局
    实例化ViewHodler并通过视图寻找控件Id
    设置converView缓存标签,并传入控件
    从converView视图中获取缓存标签
    将对应下标的值赋给对应位置
    添加判断如果联系人备注为空则显示电话,如果不为空则在电话位置显示备注
    package com.example.cxy.androidcontact.adapter;
    
    import android.content.Context;
    import android.text.TextUtils;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    
    import com.example.cxy.androidcontact.R;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by admin on 2017/3/5.
     */
    public class MyAdapter extends BaseAdapter {
        private Context mContext;
        private List<Map<String, String>> mList;
    
        //有参构造方法
        public MyAdapter(Context context, List<Map<String, String>> list) {
            mContext = context;
            mList = list;
        }
    
        //获取列表总长度
        @Override
        public int getCount() {
            //返回一个全局的列表的总长度
            return mList.size();
        }
    
        //获取当前整个item(一整行)返回一个当前视图中的所有数据
        @Override
        public Object getItem(int position) {
            //返回下标
            return mList.get(position);
        }
    
        //获取当前itemID
        @Override
        public long getItemId(int position) {
            //返回下标
            return position;
        }
    
        //获取视图              当前视图下标     指当前视图           上级父容器
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //创建一个ViewHodler类对象
            ViewHodler viewHodler;
            //判断当前converView是否为空,如果为空
            if (convertView == null) {
                //则加载新的item行布局
                convertView = LayoutInflater.from(mContext).inflate(R.layout.activity_item, null);
                //实例化viewHodler
                viewHodler = new ViewHodler();
                //通过视图寻找控件ID
                viewHodler.tvName = (TextView) convertView.findViewById(R.id.tv_Name);
                viewHodler.tvPhone = (TextView) convertView.findViewById(R.id.tv_Phone);
                //设置convertView缓存标签,传入控件
                convertView.setTag(viewHodler);
            } else {
                //convertView视图中获取缓存的标签
                viewHodler = (ViewHodler) convertView.getTag();
            }
            //将对应下标的值赋给对应位置
            viewHodler.tvName.setText(mList.get(position).get("name"));
            //如果联系人备注为空则显示电话,如果不为空则在电话位置显示备注
            if (TextUtils.isEmpty(mList.get(position).get("remark"))) {
                viewHodler.tvPhone.setText(mList.get(position).get("phone"));
            } else {
                viewHodler.tvPhone.setText(mList.get(position).get("remark"));
            }
            //返回当前converView视图给用户看
            return convertView;
        }
    
        //自定义内部类ViewHolder
        class ViewHodler {
            private TextView tvName, tvPhone;
        }
    }
    8.在主类MainActivity中创建私有的Button控件,ListView控件,List集合,Map集合
    adapter适配器
    使用initView方法初始化控件和List集合
    在initView方法中实例化List数组,实例化Button按钮和ListView控件,并给Button按钮和ListView列表控件添加监听点击事件
    在Button按钮的点击事件中添加跳转,跳转至AddActivity类
    在ListView控件的点击事件中添加跳转,跳转至DetialActivity类,并将联系人信息传输到DetialActivity详情类
    添加一个writeFile方法用于从File文件中读取数据
    实例化File对象,参数为路径名
    添加判断如果文件存在则读取,不存在则不读取
    输出File文件中的内容
    定义byte[]字节数组,使用available方法读取文件中存储的信息长度
    调用read方法将bytes数组中的数据读取
    关闭输出流
    把文件中读取到的内容全部转化为字符串
    先用#号将每个人分割
    使用循环将单个联系人的三个属性分开
    使用split分割将person数组中的信息用逗号分开
    实例化Map集合
    使用循环输出信息
    存放集合
    添加onResume方法使每次进入先清理集合,然后再次获取数据
    并且如果适配器没有实例化,则实例化,否则则刷新
    package com.example.cxy.androidcontact;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ListView;
    
    import com.example.cxy.androidcontact.adapter.MyAdapter;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {
        private Button btn_add;
        private ListView mListView;
        private List<Map<String, String>> mList;
        private Map<String, String> mMap;
        private MyAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //初始化控件和List集合的方法
            initview();
        }
    
        //从文件中读取数据的方法
        private void writeFile() {
            try {
                //实例化File对象,参数为路径名
                File file = new File("/mnt/sdcard/contact/contact.txt");
                //判断文件是否存在,存在则读取,不存在的不读取
                if (file.exists()) {
                    //File文件输出
                    FileInputStream input = new FileInputStream(file);
                    //定义byte[]字节数组,使用available方法读取文件中存储的信息长度
                    byte[] bytes = new byte[input.available()];
                    //调用read方法将bytes数组中的数据读取
                    input.read(bytes);
                    //关闭输出流
                    input.close();
                    //把文件中读取到的内容全部转化为字符串
                    String content = new String(bytes);
                    //先以#号分割为每一个人
                    String[] person = content.split("#");
                    //使用循环把每一个人的三个属性分开
                    for (int i = 0; i < person.length; i++) {
                        //使用split分割将person数组中的信息用逗号分隔开
                        String[] split = person[i].split(",");
                        mMap = new HashMap<>();
                        //使用循环输出信息
                        for (int x = 0; x < split.length; x++) {
                            if (x == 0) {
                                mMap.put("name", split[x]);
                            } else if (x == 1) {
                                mMap.put("phone", split[x]);
                            } else if (x == 2) {
                                mMap.put("remark", split[x]);
                            }
                        }
                        //存放集合
                        mList.add(mMap);
                    }
    
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private void initview() {
            mList = new ArrayList<>();
            btn_add = (Button) findViewById(R.id.btn_add);
            mListView = (ListView) findViewById(R.id.listView);
            btn_add.setOnClickListener(this);
            mListView.setOnItemClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setClass(this, AddActivity.class);
            startActivity(intent);
        }
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent intent = new Intent();
            intent.setClass(this, DetialActivity.class);
            //将联系人信息传到DetialActivity类中
            intent.putExtra("name", mList.get(position).get("name"));
            intent.putExtra("phone", mList.get(position).get("phone"));
            intent.putExtra("remark", mList.get(position).get("remark"));
            startActivity(intent);
        }
    
        //此方法,每次进入先清理集合,然后再次获取数据,
        //并且如果适配器没有实例化,则实例化,否则则刷新
        @Override
        protected void onResume() {
            super.onResume();
            mList.clear();
            writeFile();
            if (adapter != null) {
                adapter.notifyDataSetChanged();
            } else {
                adapter = new MyAdapter(this, mList);
                mListView.setAdapter(adapter);
            }
        }
    }
    9.在XML布局文件activity_detial中添加三个TextView用于展示联系人姓名,电话,备注

    10.在DetialActivity类中实例化TextView
    添加initView方法,初始化控件
    在initView方法中实例化TextView控件
    接收跳转
    定义一个字符串接收MainActivity所传输的联系人姓名,电话,备注
    将接收的联系人姓名,电话,备注显示在TextView中
    package com.example.cxy.androidcontact;
    
    import android.content.Intent;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class DetialActivity extends AppCompatActivity {
        private TextView tv_Name, tv_Phone, tv_Remark;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_detial);
            initView();
        }
    
        private void initView() {
            tv_Name = (TextView) findViewById(R.id.tvName);
            tv_Phone = (TextView) findViewById(R.id.tvPhone);
            tv_Remark = (TextView) findViewById(R.id.tvRemark);
            Intent intent = getIntent();
            String name = intent.getStringExtra("name");
            String phone = intent.getStringExtra("phone");
            String remark = intent.getStringExtra("remark");
            tv_Name.setText(name);
            tv_Phone.setText(phone);
            tv_Remark.setText(remark);
        }
    }
    展开全文
  • android批量添加联系工具

    千次阅读 2015-08-18 21:18:14
    研究生期间就没写过Java代码了,这几天由于想做一个统计网页词频的工具,...记得当初做这个批量添加联系的工具是刚来读研时,一大堆新同学的手机号码需要添加,班长整理出来同学们的通讯录后就得一个一个输入联系

    研究生期间就没写过Java代码了,这几天由于想做一个统计网页词频的工具,但是使用C++不是很方便,于是又用Java做了一个小工具。翻开电脑中以前的文件,发现之前还做过一个android中批量添加联系人的工具,瞬间感觉好亲切,也感叹时间过得好快,一眨眼研究生就快要过完了。


    记得当初做这个批量添加联系人的工具是刚来读研时,一大堆新同学的手机号码需要添加,班长整理出来同学们的通讯录后就得一个一个输入联系人和号码到手机中,想想这罪可有的受,于是就想能不能让手机直接读取xls格式(Excel格式)的文件到通讯录中,在网上查了下发现一般管理类的软件都没有这个小工具,想想可能是由于这个工具对excel文件的格式有限制吧。于是想干脆自己做一个算了,这个逻辑也不是很复杂,那个时候还懂一点android开发的东西。而且这个东西对android中的特性也不是很高,所以就做了一个批量添加联系人的小工具。现在两年没碰java,好多java的api和特性都忘记了,前两天做哪个网页词频统计的工具都是跌跌撞撞写出来的,android的东西就忘的几乎差不多了,只记得实现这个工具的大致思路。


    一时玩心大起,便想看看当初做的这个东西。可惜电脑换系统了以前android开发的sdk也没了,不过好歹软件的apk文件还在,于是就借了同学的三星的手机将它安装到手机上,发现还能正常运行!!!简直太欣慰了,说明当初编写的代码鲁棒性还是蛮不错的,而且代码中注释也不少,现在看了下代码也能明白大概的思路,要是再花点时间看看Android开发的api可能就很快能上手了。于是在这里整理下。个人觉得这个东西实用性还是蛮强的,虽然没多少技术含量^ ^。


    下面是实现这个工具的基本结构:


    实现往通讯录中添加联系人需要上面基本的三个步骤,但是由于最开始就是为自己和班级同学制作的,所有默认显示的就是我们班同学的通讯录,软件运行的初始化界面如下:



    软件开始运行后会有个提示框,提示软件的操作方法,点击确定后就可以操作,最上面有两个按钮,一个“一键添加”和“选择文件添加”按钮,下面每一行代表一个联系人的信息,从左到右依次是联系人姓名,电话号码,以及是否选择(是否选择添加到通讯录中,默认是全部选择)。


    将不需要添加的联系人的右边的多选框中的勾去掉,然后点击“一键添加”按钮,就可以将选中的联系人全部倒入通讯录中。


    如果要添加自己的通讯录,可以将通讯录存在的excel文件中(excel文件中第一列为联系人姓名,第二列为电话号码),然后点击上面的“选中文件添加”按钮,此时会弹出文件选择对话框,选中需要添加的通讯录对应的xls文件,此时下面的列表中就会显示你选中的通讯录中的联系人和号码,然后点击“添加”就可以将选中的联系人添加到通讯录中了。





    上面就是程序的基本设计思路,具体的实现代码如下,我现在也只能根据注释看出那些函数式是什么的,以及程序的逻辑结构是怎么组织的,至于编程的细节都忘得长不多了。

    真是囧啊。


    存放联系人信息的类:

    package com.example.bean;
    
    public class PhoneRecord {
    	private int id;
    	private String name;
    	private String number;
    	private boolean isChecked;
    	
    	
    	public PhoneRecord() {
    		super();
    	}
    	
    	
    	public PhoneRecord(String name, String number) {
    		super();
    		this.name = name;
    		this.number = number;
    	}
    
    
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getNumber() {
    		return number;
    	}
    	public void setNumber(String number) {
    		this.number = number;
    	}
    
    
    	public boolean isChecked() {
    		return isChecked;
    	}
    
    
    	public void setChecked(boolean isChecked) {
    		this.isChecked = isChecked;
    	}
    	
    	
    }
    

    主要的Activity,程序的处理逻辑都在这个类里面。里面同时有一些按钮的响应代码。

    package com.example.activity;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import jxl.Sheet;
    import jxl.Workbook;
    import android.app.Activity;
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.content.ContentProviderOperation;
    import android.content.OperationApplicationException;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.os.RemoteException;
    import android.provider.ContactsContract;
    import android.provider.ContactsContract.CommonDataKinds.Phone;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.example.bean.PhoneRecord;
    import com.example.contract.R;
    
    /**
     * 
     * @author xiaxiongfeng
     * @date 2013/9/1
     * @version 1.0
     */
    
    public class MainActivity extends Activity {
    	
    	//保存从excel文件中读取进来的数据
    	private List<PhoneRecord> lists;
    	//保存去除掉某些用户后的联系人数据
    	private List<PhoneRecord> records;
    	//用来显示excel中联系人和联系电话的控件
    	private ListView listView;
    	//将数据映射到listView的适配器
    	private SimpleAdapter adapter;
    	//映射到控件中的数据
    	private List<Map<String, Object>> maps;
    	//当用户点击“选择添加文件”按钮后弹出的对话框
    	private ProgressDialog mpDialog;
    	//保存选择的xls文件的路径
    	private String filepath;
    	//对话框的标示
    	static private int openfileDialogId = 0;
    
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		listView=(ListView) findViewById(R.id.list);
    		lists=readExcel();
    		mapViewList();
    		enterDialog();
    		
    	}
    
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		// Inflate the menu; this adds items to the action bar if it is present.
    //		getMenuInflater().inflate(R.menu.main, menu);
    		return true;
    	}
    	
    	@Override
    	@Deprecated
    	protected Dialog onCreateDialog(int id) {
    		// TODO Auto-generated method stub
    		 if(id==openfileDialogId){  
    	            Map<String, Integer> xlsFiles = new HashMap<String, Integer>();  
    	            // 下面几句设置各文件类型的图标, 需要你先把图标添加到资源文件夹  
    	            xlsFiles.put(OpenFileDialog.sRoot, R.drawable.filedialog_root);   // 根目录图标  
    	            xlsFiles.put(OpenFileDialog.sParent, R.drawable.filedialog_folder_up);    //返回上一层的图标  
    	            xlsFiles.put(OpenFileDialog.sFolder, R.drawable.filedialog_folder);   //文件夹图标  
    	            xlsFiles.put("xls", R.drawable.filedialog_wavfile);   //wav文件图标  
    	            xlsFiles.put(OpenFileDialog.sEmpty, R.drawable.filedialog_root);  
    	            Dialog dialog = OpenFileDialog.createDialog(id, this, "注意只能选择xls格式的文件", new CallbackBundle() {  
    	                @Override  
    	                public void callback(Bundle bundle) {  
    	                	//选择文件后会进入这个函数,首先将文件路径保存在全局变量中
    	                    filepath = bundle.getString("path");  
    //	                    setTitle(filepath); // 把文件路径显示在标题上  
    	                    //读取excel文件,此时由于filepath不为空,readExcel会从filepath指定的路径中读取数据而不会使用默认的数据
    	                    lists=readExcel();
    	                    //将读取到的数据使用适配器映射到ListView控件中
    	            		mapViewList();
    	            		//将“一键添加”按钮隐藏
    	            		((Button)findViewById(R.id.defaultBtnID)).setVisibility(View.INVISIBLE);
    	            		//将“添加”按钮显示
    	            		((Button)findViewById(R.id.realAddBtn)).setVisibility(View.VISIBLE);
    	            		//让“选择文件添加”按钮失去焦点
    	            		((Button)findViewById(R.id.otherBtnID)).setFocusable(false);
    	                }  
    	            },   
    	            ".xls;",  
    	            xlsFiles);  
    	            return dialog;  
    	        }  
    	        return null;  
    	}
    	
    	/**
    	 * 将从excel中读取到的数据转化到map中,然后将其显示到控件中
    	 */
    	public void mapViewList(){
    		maps=new ArrayList<Map<String,Object>>();
    		Iterator<PhoneRecord> iter=lists.iterator();
    		while(iter.hasNext()){
    			PhoneRecord record=iter.next();
    			Map<String,Object> map=new HashMap<String, Object>();
    			map.put("name", record.getName());
    			map.put("number", record.getNumber());
    			map.put("isChecked", record.isChecked());
    			maps.add(map);
    		}
    		adapter=new SimpleAdapter(this, maps, R.layout.activity_main_item, 
    				new String[]{"name","number"}, new int[]{R.id.name,R.id.number}){
    		
    			@Override
    			public View getView(int position, View convertView,
    					ViewGroup parent) {
    				// TODO Auto-generated method stub
    				View view=super.getView(position, convertView, parent);
    				final HashMap<String,Object> hash=(HashMap<String, Object>) this.getItem(position);
    				
    				CheckBox cb=(CheckBox) view.findViewById(R.id.checked);
    				cb.setChecked((Boolean) hash.get("isChecked"));
    				
    				cb.setOnClickListener(new View.OnClickListener() {
    					
    					@Override
    					public void onClick(View v) {
    						// TODO Auto-generated method stub
    						hash.put("isChecked", ((CheckBox)v).isChecked());
    						
    					}
    				});
    				return view;
    			}
    			
    		};
    		listView.setAdapter(adapter);
    	}
    	
    	//从excel中读取数据保存到PhoneRecord类中
    	public List<PhoneRecord> readExcel(){
    		List<PhoneRecord> lists=new ArrayList<PhoneRecord>();
    		try {
    //            InputStream is = new FileInputStream("mnt/sdcard/test.xls");  
                InputStream is=getAssets().open("contact.xls");
                //只有弹出选择文件对话框并且选择了文件后才会进入这个选择分支,否则默认添加的是系统自带的通讯录
                if (filepath!=null) {
    				is=new FileInputStream(filepath);
    			}
    			Workbook book = Workbook.getWorkbook(is);  
                book.getNumberOfSheets();  
                // 获得第一个工作表对象  
                Sheet sheet = book.getSheet(0);  
                int Rows = sheet.getRows();  
               for (int i = 0; i < Rows; i++) {
            	   PhoneRecord record=new PhoneRecord();
            	   String name=sheet.getCell(0,i).getContents();
            	   String number=sheet.getCell(1,i).getContents();
            	   if (name==null||name.equals("")||number==null||number.equals("")) {
            		   continue;
            	   }
            	   record.setName(name);
            	   record.setNumber(number);
            	   record.setChecked(true);
            	   lists.add(record);
    			}
               
    		} catch (Exception e) {
    			// TODO: handle exception
    			e.printStackTrace();
    		}
    		return lists;
    	}
    	
    	
    	/**
    	 * 将数据保存到通讯录中的方法
    	 * @param list
    	 */
    	public  void CopyPhoneRecords(List<PhoneRecord> list){
    		ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    		int rawContactInsertIndex;
    		if (list==null||list.size()==0) {
    			return ;
    		}
    		for (int i = 0; i < list.size(); i++) {	
    		     	rawContactInsertIndex = ops.size();
    		 
    		    	ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
    		                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
    		                    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
    		                    .withYieldAllowed(true)
    		                    .build());
    		      	ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
    		                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,
    						rawContactInsertIndex)
    		                    .withValue(ContactsContract.Data.MIMETYPE,
    		                            	ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
    		                    .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,list.get(i).getName())
    		                    .withYieldAllowed(true)
    		                    .build());
    		     	ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
    		                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
    		                    .withValue(ContactsContract.Data.MIMETYPE,
    		                            	ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
    		                    .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, list.get(i).getNumber())
    		                    .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_MOBILE)
    		                    .withYieldAllowed(true)
    		                    .build());
    		 
    				} 
    		     	try {
    				//这里才调用的批量添加
    		        	this.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    		        	
    				} catch (RemoteException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (OperationApplicationException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    		 
    			}	
    	
    	//这个handler只有一个作用,接受到消息后关闭提示进度框
    	Handler handler=new Handler(){
    		public void handleMessage(android.os.Message msg) {
    			mpDialog.dismiss();
    		};
    	};
    	
    	Handler toastHandler=new Handler(){
    		public void handleMessage(android.os.Message msg) {
    			switch (msg.what) {
    			case 1:
    				Toast.makeText(getApplicationContext(), "批量添加完成!", Toast.LENGTH_LONG).show();
    				break;
    			case 2:
    				Toast.makeText(getApplicationContext(), "请选择联系人!", Toast.LENGTH_LONG).show();
    				break;
    			default:
    				break;
    			}
    		};
    	};
    	
    	/**
    	 * "一键添加"按钮的响应事件
    	 * @param view
    	 */
    	public void defaultAdds(View view){
    		//默认的添加通讯录得事件
    		adds();
    	}
    	
    	/**
    	 * "选择文件添加"按钮的响应事件
    	 * @param view
    	 */
    	public void otherAdds(View view){
    //		  showDialog(openfileDialogId);
    		//当点击了“选择文件添加”后将“一键添加”按钮设为不可获得焦点
    //		Button bt=(Button)findViewById(R.id.defaultBtnID);
    //		bt.setFocusable(false);
    		//弹出文件选择对话框
    		showDialog(openfileDialogId);
    		
    		
    	}
    	
    	/**
    	 * "添加"按钮的响应事件
    	 * @param view
    	 */
    	public void realAdd(View view){
    		//添加数据
    		adds();
    		//将“一键添加”按钮隐藏
    		((Button)findViewById(R.id.defaultBtnID)).setVisibility(View.INVISIBLE);
    		//将“选择文件添加按钮”可以获得焦点
    		((Button)findViewById(R.id.otherBtnID)).setFocusable(true);
    		
    	}
    	
    	/**
    	 * 真实的添加过程
    	 * 首先需要遍历从excel中读取的数据,判断他们的isChecked属性是否为真
    	 * 默认情况下是为真,但是如果用户点击了ListView中的复选框,将某个用户去除的话这个属性会为假
    	 */
    	public void adds(){
    	
    		int size=maps.size();
    		records=new ArrayList<PhoneRecord>();
    		int i=0;
    		for (; i < size; i++) {
    			PhoneRecord record=new PhoneRecord();
    			Map<String,Object> tmp=maps.get(i);
    			record.setName((String) tmp.get("name"));
    			record.setNumber((String) tmp.get("number"));
    			if((Boolean) tmp.get("isChecked")){
    				records.add(record);
    			}
    			
    		}
    		
    		//弹出提示进度框
    		mpDialog=ProgressDialog.show(this, "提示", "添加通讯录中,请等待...");
    		
    		//开启一个新线程
    		new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				Message msg=new Message();
    				//在新的线程执行添加操作
    				if (records!=null&&records.size()!=0) {
    					CopyPhoneRecords(records);
    					//弹出一句话,提示批量操作完成
    					msg.what=1;
    					toastHandler.sendMessage(msg);
    					//当添加操作完成后,给提示进度框发送一个消息,让进度框关闭
    					handler.sendEmptyMessage(0);
    					
    					
    				}else{
    					msg.what=2;
    					toastHandler.sendMessage(msg);
    					handler.sendEmptyMessage(0);
    					
    				}
    				
    			}
    		}).start();
    		
    	}
    	
    	
    	//最开始启动时的提示界面
    	public void enterDialog(){
    		final Dialog dialog=new Dialog(this,R.style.popupDialog);
    		dialog.setContentView(R.layout.verify_dialog);
    		dialog.setCancelable(false);
    		TextView message=(TextView) dialog.getWindow().findViewById(R.id.messageTxt);
    		message.setText(this.getString(R.string.defaultTxt));
    		Button okBtn=(Button) dialog.getWindow().findViewById(R.id.messageBtn);
    		 okBtn.setOnClickListener(new OnClickListener() {
                 
                 @Override
                 public void onClick(View v) {
                     if(dialog!=null && dialog.isShowing())
                     {
                         dialog.dismiss();
                     }
                 }
             });
             if(dialog!=null && !dialog.isShowing())
             {
                 dialog.show();
             }
    	}
    	
    }
    

    整个工程的 源码下载


    展开全文
  • 我说为什么不创建联系组呢,在他工位上看了半天,没有找到可以批量添加成百个邮箱到联系组的办法,于是回到工位上说是百度一下看看。谁知道百度半天发现大家都没有好的建议,不死心的我就又开始多种研究添加联系...

    由于公司规模比较大,今天一个老师问我想要给300  400人发邮件,问我有没有什么限制。我说为什么不创建联系人组呢,在他工位上看了半天,没有找到可以批量添加成百个邮箱到联系人组的办法,于是回到工位上说是百度一下看看。谁知道百度半天发现大家都没有好的建议,不死心的我就又开始多种研究添加联系人。终于被我找到了,还在为这事发愁的你也可以看看哦!

      

    1. 先找到联系人分类,点击打开(在下面的工具栏或者左侧的分类栏)
    2. 在点击打开的页面中点击新建联系人组

    3. 例如我建一个部门秘书的联系人组(组里面有这些邮箱:A <**@**.cn>; B <**@*.cn>;C<**@*.cn>; D <**@*.cn>; E <**@*.cn>; F<**@*.cn>; G <**@*.cn>; H <**@*.cn>; I <**@*.cn>;J <**@*.cn>; K <**@*.cn>; L<**@*.cn>; M<**@*.cn>; N <**@*.cn>; O <**@*.cn>;P <**@*.cn>; Q<**@*.cn>; R <**@*.cn>

    4、重点来了:选择从通讯簿添加

    将对应人员邮箱粘贴

    点击保存并关闭即可

     

    返回邮件页面,新建电子邮件,在收件人中模糊输入“部门”,便可以看到部门秘书邮件组。

    展开全文
  • 曾经在网上看到过,在程序的快捷方式的“目标”里添加一个参数,双击后该程序便可隐藏在后台运行,屏幕右下角也不会出现图标,只能在任务管理器中关闭。 现在想让一个程序隐藏运行,但是忘了那个参数是什么,网上...
  • 收件地址,附件,选择是否保存,设置自己发送邮件时的昵称就ok了。代码自动匹配设置smtp服务地址和端口。 发送邮件需要邮箱地址和密码,开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。各大邮箱使用外部登录...
  • android activity的关闭处理的几种方式

    千次阅读 2017-05-08 11:32:32
    项目中我们往往要用到关闭程序时销毁所有的activity,而且这也是面试经常遇到的问题,退出程序的方式也有好几种,一下是一些处理关闭程序的方法: 1.最简单的方式就是使用系统的方法exit(0),这是最简单粗暴的方式...
  • jira上面在创建工作流时,希望达到一种效果,就是:只有创建问题的人才有权限关闭问题,经办...4、如果添加了,仅允许报告的话,那么只有创建问题的人才可以关闭问题,如果添加了仅允许经办,只有经办人才可...
  • IOS14nfc怎么用?IOS14NFC开关在哪?...IOS14添加门禁卡方法:1、打开iPhone手机进入后,选择手机的【设置】图标。2、进入后,点击【通用】的选项进入。3、点击后,选择【NFC】的选项。4、之后,点击NF...
  • (建议使用此版本) vscode默认提供的User Installer版,大多数都是用的这个版本。 2.安装 其他: ①将“通过code 打开“操作添加到windows资源管理器文件上下文菜单 ②将“通过code 打开”操作添加到windows资源管理...
  • 今天我主要运用第一种方式,也就是采用站点地图作为TreeView控件的数据源,利用站点地图给大家讲解如何设置在页面打开时所有节点是关闭的,然后点击节点它再显示其他节点的信息 第一步,我们需要创建一个站点地图,...
  • 就是在百度地图的infowindow上添加一个按钮,点击按钮,调用自定义事件。 之前我的解决方案是: 这样是可以的,当我点击“查看详情”时,会调用detailMsg方法,但是后来发现一个问题:就是当我把...
  • 包括联系添加、数量查询和获取系统联系!package cn.hnshangyu.cloudcommunication.utils;import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; ...
  • python3自动发送邮件并添加附件

    千次阅读 热门讨论 2019-09-25 00:50:29
    将本地报表文件以附件形式添加到邮件发送 设置定时任务 代码 import pymysql import pandas as pd import smtplib from email.header import Header from email.mime.text import MIMEText from email.m...
  • 2、双击windows防火墙会弹出新的对话框,对话框默认选中常规标签,通常情况下没必要完全关闭防火墙,确保防火墙已经处于开启状态;3、这一步切换到例外标签,你可以在这里把程序或端口添加为信任,这样防火墙将不再...
  • telegram 新增 删除 联系

    万次阅读 2021-02-08 07:35:59
    目录 找朋友电报帐号方法 使用电话号码 ... 在聚会中集体交换帐号 ...Telegram联络清单(Telegram联系列表) 找朋友电报帐号方法 使用电话号码 有可能因为双方私隐设定问题,所以用电话号码找对方...
  • Opencv依赖库的添加: cmake_minimum_required( VERSION 2.8 ) project( imageBasics ) # 添加c++ 11标准支持 set( CMAKE_CXX_FLAGS "-std=c++11" ) # 寻找OpenCV库 set(OpenCV_DIR /home/chaofan/opt/opencv-...
  • Hexo 博客优化之实用功能添加系列(持续更新)

    万次阅读 多人点赞 2018-12-14 22:05:50
    本文将讲述一些Hexo博客主题的美化、实用功能的添加,不同主题可能方法有些不同(本文以作者 luuman 的 spfk 主题为例)实际效果欢迎访问我的博客:https://trhx.top/ 进行查看,本文章会不定时进行更新。...
  • VSCode一键生成、自动添加注释

    千次阅读 2021-10-24 12:28:09
    以下为此插件的所有配置项,删除原有配置项,全部粘贴过去即可 代码中的提示信息已经很详细了,如果还有问题可以去商店界面查看日志 若自动添加注释,可查看代码的配置规则,在代码45行左右 { "liveServer.settings...
  • 添加企业微信免验证设置

    千次阅读 2020-11-17 16:28:08
    手机端: 我–设置–隐私–加我为联系时需要验证–关闭 2、设置欢迎语  使用管理员企业微信:工作台–客户联系–配置 --欢迎语 3、企业微信管理小程序  电脑端进入 企业微信后台: 应用管理–添加小程序–授权 ...
  • Linux文件打开与关闭

    千次阅读 2021-05-09 06:03:12
    通过组的方式显然是不合适的,因为需要把系统中的所有用户都添加到一个组中。并且系统中添加了新用户该怎么办,每添加一个新用户就把他添加到这个组中吗?这个问题可以通过其他的概念解决。在设置文件的访问权限时...
  • JDBC添加数据

    万次阅读 多人点赞 2019-05-25 13:58:31
    使用DrivergetConnect()取得的连接对象是Connection类型,如果要对数据库中的数据进行操作,我们还需要该...//关闭数据库连接,使用完数据库连接之后必须关闭 boolean isClose();//判断该连接是否关闭 Statement cr...
  • 在这一章中,我们通过添加BlockElement和Image对象添加到RootElement实例的方式来创建PDF文档。RootElement是拥有两个子类的抽象类:Document和Canvas: Document是创建自定义PDF的时候默认的根元素。由它来管理很...
  • Unity的多人游戏与网络

    千次阅读 多人点赞 2019-01-02 21:42:28
    它连接所有客户端,并管理所有客户端共享的游戏对象及部分需要同步的状态(属性) Client:客户端,游戏程序实例。玩家游戏主机运行的程序 Unity 典型的网络游戏结构: 2、实例化与孵化 在一个单机中,...
  • HTML页面中如何按关闭按钮直接关闭页面 1、不带任何提示关闭窗口的js代码 2、自定义提示关闭 3、在即将离开当前页面(刷新或关闭)时 4、onload,onunload,onbeforeunload 5、删除或(卸载)window.onbeforeunload事件
  • WinCE桌面添加应用程序的快捷方式

    千次阅读 2013-02-17 21:40:50
    将可执行程序MyApp.exe放入FAT分区KinglyFlash中,在桌面创建其快捷方式: (1) 创建KinglyApp.lnk 快捷方式文件  使用桌面Windows 自带的记事本创建,保存时将后缀名改为lnk即可。.lnk 文件其实是一个...
  • 现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中。要这样做,我们必须从UE4的GameFramework类继承它。 一. 打开上次创建的关卡 如果你已经关闭了项目,并且保存了上次创建的关卡(假设命名为...
  • zabbix添加邮件报警

    千次阅读 2019-04-10 18:06:39
    一、mailx安装配置(zabbix-server服务器...服务器上如果安装了sendmail及postfix,需要确保是关闭状态并关掉开机自启 (3)配置mailx 以QQ邮箱为例 vim /etc/mail.rc set sendcharsets=iso-8859-1,utf-8 #设置...
  • java小代码(一)捉弄小代码

    千次阅读 多人点赞 2019-09-09 20:41:20
    java小代码(一)捉弄小代码 ...捉弄小代码功能:显示一个窗口,该窗口有一个问题,你点击窗口的叉号时会弹出一个消息框,但无法关闭程序窗口,当鼠标进入“不是”按钮时,按钮的坐标会发生...
  • JIRA在默认情况下,创建问题时是将问题直接分配给项目负责,因为项目负责在默认情况下就是默认经办. 那有没有办法可以选择经办呢? 强大的JIRA告诉你, 这完全没有问题. 下面我们就来看看如何进行设置. 首先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 435,299
精华内容 174,119
关键字:

关闭所有添加方式的人