通讯录小程序

需求说明:

  功能:

    添加联系人

    修改联系人

    删除联系人

    查询所有联系人

  要求:

    console控制

    数据保存在xml

1.创建联系人类
/**
* 联系人实体对象
* @author APPle
*
*/
public class Contact { private String id;
private String name;
private String gender;
private int age;
private String phone;
private String email;
private String qq;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
@Override
public String toString() {
return "Contact [age=" + age + ", email=" + email + ", gender="
+ gender + ", id=" + id + ", name=" + name + ", phone=" + phone
+ ", qq=" + qq + "]";
} }

 2.通讯录功能接口,实现类

/**
* 该接口用于存放联系人相关操作的方法。
* @author APPle
*
*/
public interface ContactOperator {
public void addContact(Contact contact);//增加联系人
public void updateContact(Contact contact);//修改联系人
public void deleteContact(String id);//根据ID删除联系人
public List<Contact> findAll();//查询所有联系人
}
/**
* 实现联系人操作接口
* @author APPle
*
*/
public class ContactOperatorImpl implements ContactOperator { /**
* 添加联系人
*/
@Override
public void addContact(Contact contact) { try {
File file = new File("e:/contact.xml");
Document doc = null;
Element rootElem = null;
if(!file.exists()){
/**
* 需求: 把contact对象保存到xml文件中
*/
//如果没有xml文件,则创建xml文件
doc = DocumentHelper.createDocument();
//创建根标签
rootElem = doc.addElement("contactList");
}else{
//如果有xml文件,则读取xml文件
doc = XMLUtil.getDocument();
//如果有xml文件,读取根标签
rootElem = doc.getRootElement();
} //添加contact标签
/**
* <contact id="1">
<name>eric</name>
<gender>男</gender>
<age>20</age>
<phone>1343333</phone>
<email>eric@qq.com</email>
<qq>554444</qq>
</contact>
*/
Element contactElem = rootElem.addElement("contact");
contactElem.addAttribute("id", contact.getId());
contactElem.addElement("name").setText(contact.getName());
contactElem.addElement("gender").setText(contact.getGender());
contactElem.addElement("age").setText(contact.getAge()+"");
contactElem.addElement("phone").setText(contact.getPhone());
contactElem.addElement("email").setText(contact.getEmail());
contactElem.addElement("qq").setText(contact.getQq()); //把Document写出到xml文件
XMLUtil.write2xml(doc);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 修改联系人
*/
@Override
public void updateContact(Contact contact) {
/**
* 需求: 修改id值为2的联系人
* 1)查询id值为2的contact标签
* 2)修改contact标签的内容
*/
try {
//1.读取xml文件
Document doc = XMLUtil.getDocument(); Element contactElem = (Element)doc.selectSingleNode("//contact[@id='"+contact.getId()+"']"); //2.修改contact标签内容
contactElem.element("name").setText(contact.getName());
contactElem.element("gender").setText(contact.getGender());
contactElem.element("age").setText(contact.getAge()+"");
contactElem.element("phone").setText(contact.getPhone());
contactElem.element("email").setText(contact.getEmail());
contactElem.element("qq").setText(contact.getQq()); //3.把Document写出到xml文件
XMLUtil.write2xml(doc);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
} } /**
* 删除联系人
*/
@Override
public void deleteContact(String id) {
try {
//1.读取xml文件
Document doc = XMLUtil.getDocument();
//2.查询需要删除id的contact
Element contactElem = (Element)doc.selectSingleNode("//contact[@id='"+id+"']");
//删除标签
contactElem.detach(); //3.把Document写出到xml文件
XMLUtil.write2xml(doc);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 查询所有联系人
*/
@Override
public List<Contact> findAll() {
//1.读取xml文件
Document doc = XMLUtil.getDocument(); //2.创建List对象
List<Contact> list = new ArrayList<Contact>();
//3.读取contact标签
List<Element> conList = (List<Element>)doc.selectNodes("//contact");
for(Element e:conList){
//创建COntact对象
Contact c = new Contact();
c.setId(e.attributeValue("id"));
c.setName(e.elementText("name"));
c.setGender(e.elementText("gender"));
c.setAge(Integer.parseInt(e.elementText("age")));
c.setPhone(e.elementText("phone"));
c.setEmail(e.elementText("email"));
c.setQq(e.elementText("qq"));
//把Contact放入list中
list.add(c);
}
return list;
} }

3.XML操作工具类

/**
* xml操作的工具类
* @author APPle
*
*/
public class XMLUtil { /**
* 用于读取xml文件
* @return
*/
public static Document getDocument(){
try {
Document doc = new SAXReader().read(new File("e:/contact.xml"));
return doc;
} catch (DocumentException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 写出xml文件
*/
public static void write2xml(Document doc){
try {
FileOutputStream out = new FileOutputStream("e:/contact.xml");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(out,format);
writer.write(doc);
writer.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}

4.主函数

/**
* 主程序
* @author APPle
*
*/
public class MainProgram { public static void main(String[] args) {
try {
/*Scanner scanner = new Scanner(System.in);
String command = scanner.next();*/ BufferedReader br =
new BufferedReader(new InputStreamReader(System.in)); ContactOperator operator = new ContactOperatorImpl();
//不断接收输入
while(true){
//1.看到菜单
printMenu(); //2.接收用户输入的命令
String command = br.readLine(); //3.根据用户的输入执行不同的操作
if("".equals(command)){
//添加联系人
//获取用输入的数据
Contact contact = new Contact();
//获取ID
System.out.println("请输入编号:");
String id = br.readLine();
//获取姓名
System.out.println("请输入姓名:");
String name = br.readLine();
//获取性别
System.out.println("请输入性别:");
String gender = br.readLine();
//获取年龄
System.out.println("请输入年龄:");
String age = br.readLine();
//获取电话
System.out.println("请输入电话:");
String phone = br.readLine();
//获取邮箱
System.out.println("请输入邮箱:");
String email = br.readLine();
//获取QQ
System.out.println("请输入QQ:");
String qq = br.readLine(); contact.setId(id);
contact.setName(name);
contact.setGender(gender);
contact.setAge(Integer.parseInt(age));
contact.setPhone(phone);
contact.setEmail(email);
contact.setQq(qq); operator.addContact(contact);
}else if("".equals(command)){
//修改联系人
//获取用输入的数据
Contact contact = new Contact(); //获取ID
System.out.println("请输入需要修改的编号:");
String id = br.readLine();
//获取姓名
System.out.println("请输入修改后的姓名:");
String name = br.readLine();
//获取性别
System.out.println("请输入修改后的性别:");
String gender = br.readLine();
//获取年龄
System.out.println("请输入修改后的年龄:");
String age = br.readLine();
//获取电话
System.out.println("请输入修改后的电话:");
String phone = br.readLine();
//获取邮箱
System.out.println("请输入修改后的邮箱:");
String email = br.readLine();
//获取QQ
System.out.println("请输入修改后的QQ:");
String qq = br.readLine(); contact.setId(id);
contact.setName(name);
contact.setGender(gender);
contact.setAge(Integer.parseInt(age));
contact.setPhone(phone);
contact.setEmail(email);
contact.setQq(qq); operator.updateContact(contact);
}else if("".equals(command)){
//删除联系人
//获取需要删除的ID
System.out.println("请输入删除的编号:");
String id = br.readLine(); operator.deleteContact(id);
}else if("".equals(command)){
//查询所有联系人
List<Contact> list = operator.findAll();
//打印输出
for (Contact con : list) {
System.out.println(con);
}
}else if("Q".equals(command)){
break;
}else{
System.out.println("输入的命令有误!");
}
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
} } private static void printMenu() {
System.out.println("====================");
System.out.println("[1]添加联系人");
System.out.println("[2]修改联系人");
System.out.println("[3]删除联系人");
System.out.println("[4]查看所有联系人");
System.out.println("[Q]退出系统");
System.out.println("====================");
} }

Servlet编程

1.如何开发一个Servlet程序

  1)步骤

    编写java类,继承HttpServlet类

    重新doGet和doPost方法

    Servlet程序交给tomcat服务器运行!!

       servlet程序的class码拷贝到WEB-INF/classes目录

      在web.xml文件中进行配置

  2)web.xml中配置Servlet

<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>gz.itcast.a_servlet.FirstServlet</servlet-class>
</servlet> <!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>

  3)url如何访问,访问原理

    在day10的web.xml中查找是否有匹配的url-pattern的内容(/first)

    如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的servlet配置

    如果找到,则取出对应的servlet配置信息中的servlet-class内容:

    字符串: gz.itcast.a_servlet.FirstServlet

    通过反射:

      构造FirstServlet的对象

      然后调用FirstServlet里面的方法

2.映射路径

<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>FirstServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/first</url-pattern>
</servlet-mapping>

  1)精确查询

    url-pattern  浏览器输入

    /first      http://localhost:8080/day10/first

    /aaa/first    http://localhost:8080/day10/aaa/frist

  2)模糊查询

    /*       http://loaclhost:8080/day10/任意路径

    /aaa/*      http://localhost:8080/day10/aaa/任意路径

    *.后缀名    http://localhost:8080/day10/任意路径.do

    *.action    

    *.html(伪静态)

  3)注意:

    url-pattren要么以/开头,要么以*开头,例如aaa是非法路径

    不能同时用两种模糊查询。例如/aaa/*.do是非法路径

    当输入的url有多个Servlet同时被匹配的情况下:

      a.精准配备优先(长得像的优先)

      b.以后缀名结尾的模糊url-parttern优先级最低!!

    

3.缺省路径

    缺省路径是在tomacat服务器内置的一个路径。改路径对应的default(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件

    问题:URL输入http://localhost:8080/day10/index.html如何读取文件

    1)先到web.xml文件中查找是否有匹配的url-pattern,-》2)如果没有匹配到就交给tomcat内置的DefaultServlet处理-》3)DefaultServlet程序到day10应用的根目录下查找是否存在一个index.html的静态文件-》4)如果找到,则读取返回给浏览器-》5)找不到就放回404错误页面

    结论:先找动态资源再找静态资源

4.Servlet生命周期

  1)4个重要的生命周期方法

    构造方法:创建servlet对象时调用。默认情况下第一个访问Servlet时创建Servlet对象i只调用一次。证明Servlet对象在tomcat是单列模式。

    init方法:创建servlet对象时候调用,只调用一次。

    service方法:每次发生请求时调用。调用n次

    destroy方法:销毁Servlet对象时调用。停止服务器或者重新部署web应用时销毁Servlet对象。只调用1次

  2)伪代码演示servlet生命周期

    Tomcat内部代码运行:

    a.通过映射找到servlet-class内容-》b.通过反射构造FirstServlet对象

      1.得到字节码对象:Class clazz=class.forName("aa.FirstServlet");

      2.调用无参构造对象:Object obj=class.newInstance()   --、构造方法被调用了

    c.创建ServletConfig对象通过反射调用init方法

      1.Method m=class.getDeclareMethod("init",ServletConfig.class);

      2.m.invoke(obj,cconfig);               --、init方法被调用了

    d.创建request,response对象,通过反射调用service方法

      1.Method m=class.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

      2.m.invoke(obj,request,response);          --、service方法被调用了

    e.当tomcat服务器停止或者web重写部署的时候,通过放射调用destory方法

      1.Method m=class.getDeclareMethod("destory",null);

      2.m.invoke(obj,null);                --、destory方法被调用了

5.自动加载

  默认情况下,第一次访问Servlet时创建Servlet对象,如果Servlet的构造方法或init方法中执行较多的逻辑代码,那么导致用户第一次访问Servlet的时候比较慢降低了用户体验

  改变Servlet创建时间:提前到加载web应用的时候

  在Servlet配置中加上<load-on-startup>即可

<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>gz.itcast.c_life.LifeDemo</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup></load-on-startup> 注意: 整数值越大,创建优先级越低!!
</servlet>

6.servelt的多线程并发问题

  Servlet对象在tomcat服务器是单例多线程的,当多个Servlet对象访问共享资源的时候,可能会发生线程安全问题,

  解决方法:1.sysnchronized关键字进行同步,尽量缩小成员变量,避免因同步而导致的并发效率低下

8.Servlet的学习

  HttpServletRequest,HttpServletResponse,ServletConfig,ServletContext

  1)HttpServletRequest

  2)HttpServletResponse

  3)ServletConfig:servet配置对象

    1.定义:一个servlet对应一servletConfig对象,主要用于加载servlet的初始化参数,一个web应用中可以有多个ServletConfig对象

    2.对象创建和获得

      在创建完Servlet对象后,在调用init方法之前创建-》再从有参数的init方法中获得

    3.初始化参数的配置

  <servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
 <init-param>
    <param-name>path</param-name>
    <param-value>e:/b.txt</param-value>
</init-param>
</servlet>

    注意:Servlet的参数只有当前的Servlet才能获得

    ServletConfig的API:

      java.lang.String getInitParameter(java.lang.String.name):根据参数名获得参数值

      java.util.Enumeration  getInitParameterNames()              获得所有的参数

      java.lang.String getServletName()            获得Servlet的名称

  4)ServletContext:servlet上下文对象

      一个web应用只有一个上下午对象ServletContext对象

    2)对象的创建和获得

      在有参的init方法获得ServletCongfig对象的getServletContext方法得到

      创建ServletConfig对象

        我们自己设计

        public void init(ServletConfig config,ServletContext context){//这里是多加了一个参数

            得到ServletConfig对象,得到ServletContext对象

        }

        sun公司设计

        1.创建ServletContext对象 :ServletContext context=new ServletContext();

        2.创建ServletConfig对象:ServletConfig config=new ServletConfig();

                      config.setServletContext(context);

         class ServletConfig{

            ServletContext context;

            public ServletContext getServletContext(){

              return context;

            }

          }

        public void init(ServletConfig config){  

            得到ServletConfig对象

            再从ServletConfig对象中得到ServletContext对象

            ServletContext context = config.getServletContext();   

        }

    3)核心api

      java.lang.String getContextPath()   --得到当前web应用的路径 用在请求重定向的资源名称中

      java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数

      java.util.Enumeration getInitParameterNames()

      void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法

      java.lang.Object getAttribute(java.lang.String name)

      void removeAttribute(java.lang.String name)

      RequestDispatcher getRequestDispatcher(java.lang.String path)   --转发(类似于重定向)

      java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件

      java.io.InputStream getResourceAsStream(java.lang.String path)

    4)域对象

      作用:就是用于保存数据,获取数据,可以在不同动态资源之间共享数据

      案例:response.sendRedirect("/Servlet?name=eric")--保存到域对象中

         String request.getParameter("name");    --从域中获取对象

         这里例子传递参数只能 字符串;域对象共享数据可以共享   任意类型

         ServletContext就是一个域对象

      保存数据:void setAttribute(String name,Object object)

      获得数据:void getAttribute(String name)

      删除数据:removeAttribute(String name)

      所有的域对象:

          HttpServletRequest域对象;

          ServletContext域对象;

          httpSession 域对象;

          PageContext 域对象;

java深入探究05的更多相关文章

  1. Java 集合系列 05 Vector详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  2. JAVA自学笔记05

    JAVA自学笔记05 1.方法 1)方法就是完成特定功能的代码块,类似C语言中的函数. 2)格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,-){ 函数体; return ...

  3. 058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值

    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值 本文知识点:求数组元素的最大值 案例:求数组元素的最大值 程序代码及其执行过程 ...

  4. 053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结

    053 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 15 流程控制知识总结 本文知识点: 流程控制知识总结 流程控制知识总结 选择结构语句 循环结构语句 ...

  5. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

  6. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

  7. 050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句

    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句 本文知识点:continue语句 continue语句 continue ...

  8. 049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句

    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句 本文知识点:break语句 break语句 break语句前情回顾 1.swi ...

  9. 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和

    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...

随机推荐

  1. Oracle SOA套件12c

    产品概览 随着基于云的应用越来越多的被企业所採用,以及移动技术与企业应用的集成的需求的增多,企业级应用集成的复杂度也前所未有的提升. Oracle SOA套件12c,业内最完整的统一应用集成解决方式的 ...

  2. 求重集的r-组合

    具体的就不在这里说了,如果有兴趣的可以把我的工程包下载下来看,留个URL http://pan.baidu.com/s/1bnes1HX

  3. FILE 创建

    public class CreateDelFileUtils implements Serializable{ /** * */ private static final long serialVe ...

  4. vim-colors-config

    在vim中,主题是以插件形式存在.其中系统自带的主题,存放在$VIMRUNTIME/colors文件夹下,以*.vim命名.(注:查看$VIMRUNTIME请在vim中执行 :echo $VIMRUN ...

  5. openWRT自学计划安排

    目标:充分理解openwrt的框架构成,能够在openwrt框架下实现:开发新程序,修改现有程序,修改内核,修改boot.为此,制定如下计划: 一.如何在openwrt上做开发 1.编译出一个BRCM ...

  6. c#中关于compare比较的一点注意事项

    一直没有太注意,今天发现在compare比较两个字符串的时候出了点小问题 如果我设置了两个字符串 一个是“2”,一个是“12” 那么在比较的时候 第一个会大于第二个: 如果第一个是“02”,第二个是“ ...

  7. Pollard-Rho大整数拆分模板

    随机拆分,简直机智. 关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC ...

  8. 线性同余方程模板( A+C*x=B(mod D) )

    void extendgcd(long long a,long long b,long long &d,long long &x,long long &y) { ){d=a;x ...

  9. HYSBZ - 1799 self 同类分布

    self 同类分布 HYSBZ - 1799 给出a,b,求出[a,b]中各位数字之和能整除原数的数的个数.Sample Input 10 19 Sample Output 3 Hint [约束条件] ...

  10. MATLAB循环结构:for语句+定积分实例

    for语句 格式: for 循环变量=表达式1:表达式2:表达式3 循环体语句 end 表达式1:循环变量初值:表达式2:步长:表达式3:循环变量终值. for 循环变量=矩阵表达式 循环体语句 en ...