java深入探究07-jsp


RequestDispatcher
是web资源包装类
只能实现固定jsp文件名
他可以翻译为:RequestDispatcher(filename).include(request,response);
这里实现的是:跳转到指定的fileName地址,包含

转发重定向区别:

  requset,response信息一起过去

我们可以把它想成一个web资源的盒子,用来对web资源封装好一起处理

  转发:请求不变只是请求发给服务器后,服务器将请求还了一个给浏览器,所以浏览器的url不变

  重定向:发送请求给服务器,服务器response回一个新的链接给浏览器,让浏览器从新发送一个请求给服务器,这就是重定向,之前的request中的保存的东西也就不在了,我们能看到的区别就是url变了

1.为什么出现JSP

  Servlet是动态开发语音,而jsp是可以htmlServlet结合的不仅能编写java代码可以布局样式,类似于.NET中的cshtml

2.Jsp的执行过程

  a) 找到Tomcatwork目录存放jsp的临时文件-》翻译成java文件-》编译成class文件-》构造类对象-》调用方法

  b) Jsphtml部分被编译到Servletserver方法中,java部分被编译到jsp_server

3.Jsp的生命周期

  a) Servlet生命周期

    构造方法-init方法-service方法-destroy方法

  b) Jsp的生命周期

    翻译jsp->java->编译java-class->构造方法-init方法-service方法-destory方法

4.Jsp语法

  a) Jsp模板:html部分就是jsp模板

  b) Jsp表达式:<%=变量或表达式 %>想浏览器输出变量或表达式结果,out.writer();

  c) Jsp脚本:<% java脚本 %> jsp编译器直接将这部分代码复制到jsp_service()方法

  d) jsp声明:<%!变量或方法%>声明jsp的成员变量和成员方法

  e) Jsp注释:<%!--jsp注释-->

5.Jsp的三大指令

  a) Include指令

  1. 静态引入其他页面,将两个jsp文件翻译为一个java文件,所以不能出现重复的模板html部分代码
  2. 语法:<%include file=”path路径”%>

  b) Page指令

  1. 告诉tomcat怎么将jsp文件翻译为java文件
  2. 例子:

    <% page import=”java.lang.util.*”

                   Language=”java”

         pageEncoding=”utf-8”

       contentType=”text/html; charset=utf-8”

         errorPage=”” //指定当前错误页面的处理页面

       isPageError=false;指定当前页面是否是错误处理页面,是的话可以用jsp内置错误对象exception,反之不可

    %>

      配置全局的错误处理页面方式

      在web.xml中设置:不同的错误代码调到不同的错误页面全局配置

        

         <error-page>

           <error-code>500error-code>

           <location>/common/500.jsplocation>

         error-page>

        <error-page>

           <error-code>404error-code>

           <location>/common/404.htmllocation>

       error-page>

    Session=true;

    Buffer=8kb;   jsp页面的缓存器大小

    isELIngore=false 是否忽略EL

例子:语法例子

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"
    import="java.util.*"%>




jsp语法


    
    <%
        //变量
        String name="xiaoping";
        int a=10;
        int b=20;
    %>
    <%=name %>
    <%=(a-b) %>
    
    <%
        //生成随机数
        Random d=new Random();
        float num=d.nextFloat();
    
    %>
    <%
        for(int i=1;i<6;i++){
    %>
    
        >标题<%=i %>>
    <%
        }
    %>
    
    
    <%
        for(int i=1;i<9;i++){
            for(int j=1;j<9;j++){
    %>
                <%=i %> x <%=j %>=<%=(i*j) %>&nbsp;
        <%
            }
        %>
        
<% } %> <% String age="20"; %> <%! String name="xiaoping"; public String getName(){ return name; } %> <%-- 内置标签 --%> <%-- jsp注释--%>

  c) Taglib指令

  1. 引入标签

6.jsp的内置对象

  a) 内置对象

    在Jsp开发中我们会频繁用到一些对象,一一创建太麻烦,sun提供了内置对象为我们创建好了,目前有8种重要的内置对象

    Responserequest,config(ServletConfig),pageContext,out(jspWriter),application(ServletContext),pageObject this,exception(Throwable)

  b) 内置对象详解

  1. Out对象
    1. jspWriter类型向缓冲区写内容;printWriter向浏览器写内容
    2. 什么情况下缓冲区内容会输出:溢出;刷新;关闭;执行完毕jsp页面
  2. PageContext

    在定义标签的时候pageContext时常使用

  1. 就是ServletContext对象就是PageContext类型可以获取其他八种内置对象

    a) 原因:在将jspjava代码部分翻译到jsp_Service()中去时在这里面创建完8中内置对象,之后又将这8中对象封装到pageContext中了

    b) 调用方法:pageContext.getXXX();

  1. 本身也是域对象下面四个域对象pageContext都能用

    a) ServeltContext context

    b) PageContext; page

    c) HttpSession; session

    d) HttpServletRequest Request

      一:保存数据

        1)默认情况保存的是page域:PageContext.setAttribute(“name”);

        2)可以向四个域中保存对象:PageContext.setAttribute(“name”,域范围常量)

      二:获得数据

        1)默然情况获得page域的:PageContext.getAttribute(“name”);

        2)可以向四个域中保存对象:PageContext.sgetAttribute(“name”,域范围常量)

        3)自动从四个域中查找:pageContext.findAttribute("name");

        4)域范围常量:

          PageContext.PAGE_SCOPE

          PageContext.REQUEST_SCOPE

          PageContext..SESSION_SCOPE

          PageContext.APPLICATION_SCOPE

        5)域顺序:page->request->session->appliction(serlvetContext)

        6)这四个域的作用范围:

        a) Page域:只能在jsp页面当前页面使用

        b) Request域:只能在同一个请求中使用

        c) Session域:只能在同一个回话中使用

        d) Context域:可以在整个web应用中使用

例子:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"
    import="java.util.*"
    session="true"
    isErrorPage="true"
    %>




测试jsp的语法



    
    <%
        /* 1)可以获取其他8种内置对象 */
        response.getWriter().write("是否相等?"+(out==pageContext.getOut())+"
"); %> <% //保存数据,默认情况,保存到page域中 pageContext.setAttribute("message","page's message"); pageContext.setAttribute("message", "session's message", PageContext.SESSION_SCOPE);//保存到session 中 pageContext.setAttribute("message", "request's message", pageContext.REQUEST_SCOPE);//保存到request域中 //request.setAttribute("message", "request's message")//等价于上面一个 %> <% //获取数据,默认情况保存在page域中 String message=(String)pageContext.getAttribute("message"); out.write(message); %> <%=pageContext.getAttribute("message",PageContext.PAGE_SCOPE) %>
<%=pageContext.getAttribute("message",PageContext.REQUEST_SCOPE) %>
<%=pageContext.getAttribute("message",PageContext.SESSION_SCOPE) %>
<%=pageContext.getAttribute("message",PageContext.APPLICATION_SCOPE) %>
<%=pageContext.findAttribute("message") %> <% //装发 request.getRequestDispatcher("/jsp1/index.html"); //从定向 /* response.sendRedirect("/jsp1/index.html"); */ %>

7.JspServlet如何结合

  a) Jsp+Servlet模式

    Jsp通过java代码擅长输出html

    Servlet任务:

      接受参数-》处理逻辑代码-》将结果保存在域对象中-》跳转到jsp界面

    Jsp任务:

      从域对象中获得数据-》把数据显示在浏览器中

例子:百万富翁竞猜游戏

jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"
    import="java.util.*"
    %>




百万富翁竞猜游戏


    <%
        //显示提示信息
        String msg=(String)request.getAttribute("msg");
        if(msg!=null){
            out.write(""+msg+"");
        }
    %>
    <%
        //获取竞猜次数
        Integer times=(Integer)request.getAttribute("times");
        if(times!=null){
            out.write(",你还有"+(5-times)+"次机会!");
        }
    %>
    
    
请输入30以下的整数: <% if(times!=null){ %> <% } %>

Servlet

package Servlet;

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 产生一串幸运数字
 */
public class GuessServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    int answer;
    /**
     * 新游戏方法。产生一个新的幸运数字
     */
    public void newGame(){
        Random random = new Random();
        answer = random.nextInt(30);
    }
    
    public GuessServlet(){
        //第一次访问
        newGame();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
        
        //1.接收输入的数字
        String lucyNoStr = request.getParameter("lucyNo");
        System.out.println("答案:"+answer);
        Integer lucyNo = null;
        //2.判断幸运数字和用户的数字
        //2.1 把用户输入的数字转成整数
        if(lucyNoStr!=null || !lucyNoStr.equals("")){
            lucyNo = Integer.parseInt(lucyNoStr);
        }
        
        //标记记录当前竞猜的次数
        Integer times = 1;//初始值
        
        //接收客户当前竞猜次数
        String timesStr = request.getParameter("times");
        if(timesStr!=null && !timesStr.equals("")){
            times = Integer.parseInt(timesStr)+1;
        }
        
        
        if(times<5){
            String msg = "";
            //比较
            if(lucyNo>answer){
                //大了
                msg = "可惜,大了点";
            }else if(lucyNo<answer){
                //小了
                msg = "可惜,小了点";
            }else if(lucyNo==answer){
                //等于,中奖
                msg = "恭喜你,中得1000000元现金大奖,请带身份证到xxx地方领奖!";
                times = null;
            }
            //把当前竞猜的次数放入域对象
            request.setAttribute("times", times);
            //把信息放入域对象中
            request.setAttribute("msg", msg);
        }else{
            //产生新的幸运数字
            newGame();
            //游戏结束
            response.getWriter().write("游戏结束。再来一盘");
            return;
        }
        //转发
        request.getRequestDispatcher("/05.guess.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

8.EL表达式

  1)出现的原因

    jsp开发的原则:jsp页面少写甚至不写java代码;就出现了EL 来代替jsp中的java部分代码

    作用:想浏览器输出域对象中的变量值或者表达式计算的结果

  2)语法

    a)获取标识符数据${标识符}:内部原理是调用了PageContext.findAttribute(标识符)从request,session,application,page域对象中找对应的值找不到就放回null

    b)获取javabean中的属性,数组,Collection,Map类型的集合中的数据

      ${user.address.city}

      ${user.list[0]}:访问有序集合中的摸个位置元素

  3)11个隐式对象web开发常用对象

    $(隐式对象名称):获得对象的引用

   c)注意事项:

      EL表达式是JSP2.0规范中的一门技术,想要正确解析,需要支持Servlet2.4、JSP2.0技术

      如果Tomcat不能使用EL表达式

、      升级Tomcat6.0;<% page isELIgnored=false%>

例子:

    <%
        String name="xiaoping";
        //放到域对象总
        pageContext.setAttribute("name", name);
    %>
    <%--
    1)从四个域中自动搜索
    EL表达式:${name}
            等级与<%=pageContext.findAttribute("name")%>
    2)从指定与中获取对象:EL有12种隐式对象
            ${pageScope.name}
            等价于:<%=pageContext.getAttribute("name",PageContext.pageScope)%>
     --%>
    ${pageScope.name }
    
    
    
    <%
        Student student=new Student("xiaoping",20);
        pageContext.setAttribute("student", student);
    %>
    <%--使用EL获取对象 --%>
    ${student.name}-${student.age}
    
    
    ${10+5}
    ${10>5 }
    ${true&&false}
    ${empty name}

9.Jsp标签

  1)出现原因:

    替代jsp中java代码,代码简化

  2)标签分类:

    内置标签;自定义标签;jstl(java Standard tag libarary java标准标签库)

    想要使核心标签:需要先将核心标签导入

    a)内置标签:

      //request.getRequestDipsacher("/路径").forward(request,response);

       参数标签 ?name=eric

       包含其他页面,动态包含

    b)jstl:

      使用步骤:

        1)导入包到项目中

        2)在jsp页面中导入标签库

          <%@taglib url="标签库声明文件tld文件的标记" prefix="前缀"%>

        3)使用标签库中的标签

      核心标签库:

             保存数据到域对象中

             从域中取出数据

               单条件判断

         + +  多条件判断

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count“  />

    ${count == 0}">
        对不起,没有符合您要求的记录。
    c:when>
    <c:otherwise>
        符合您要求的记录共有${count}条.
    c:otherwise>
c:choose>

          遍历数据

varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)

          遍历特殊字符串

           重定向

 例子:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"
    import= "java.util.*,Servlet.Student"
    %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>




Insert title here



    <%--转发 --%>
    <%
        //request.getRequestDispatcher("urlpath").forward(request, response);
    %>
    <%--参数--%>
    <%-- 
        
        
     --%>
    <%--包含 --%>
    
        
    
    <%@include file="/common/header.jsp" %>
    


    <%--
        1.需要导入标签连接:<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
        2.if/>
     --%>
     
     ${name }
     <%-- default: 当value值为null时,使用默认值
    escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认) --%>
     default="

标题3

" escapeXml="true">
if test="${empty msg}" var="aaa" >条件成立if> 优秀 优秀 优秀 优秀 <%-- --%> <% //List List list = new ArrayList(); list.add(new Student("rose",18)); list.add(new Student("jack",28)); list.add(new Student("lucy",38)); //放入域中 pageContext.setAttribute("list",list); //Map Map map = new HashMap(); map.put("100",new Student("mark",20)); map.put("101",new Student("maxwell",30)); map.put("102",new Student("narci",40)); //放入域中 pageContext.setAttribute("map",map); %>
序号:${varSta.count }-姓名:${student.name }-年龄:${student.age }
<%-- 循环特殊字符串--%> <% String str="sdfas-df-a-sdf-a"; pageContext.setAttribute("str", str); %> ${s }

    c)自定义标签

      步骤:编写java类继承SimpleTagSupport类,叫标签处理器-》

        在web项目的WEB-INF目录下建立tld文件,这个tld叫标签库的声明文件-》

        在jsp页面头部导入自定义标签:<%@taglib uri="http://gz.itcast.cn" prefix="itcast"%>-》最后再使用

      自定义标签的执行过程:

        访问jsp文件,tomcat把jsp文件编译成class文件-》构造对象,调用_jspService()方法-》

        检查jsp的tablib标签,是否存在tld文件,不存在就报错-》存在后读到子标签查询tld文件中是否有这个对象-》

        找到了就找到了class文件-》构造对象调用方法

        构造ShowIpTag对象,然后调用ShowIpTag里面的方法

      生命周期:

        SimpleTag接口:

          setParent(JspTag parent);    //设置父标签

          setJspContext(JspContext context);//获得PageContext内置对象

          setXXX(值);          //设置属性,前提是在定义一个私有变量

          doTag();            //执行标签时调用的方法

          setJspBody(JspFrament jspBody) //设置标签体内容,内容封装到JspFragment

      输出标签体内容格式:

          JSP   在传统标签中使用的。可以写和执行jspjava代码。

          scriptless:  标签体不可以写jspjava代码

          empty:    必须是空标签。

          tagdependent : 标签体内容可以写jspjava代码,但不会执行

    

例子:

java文件:

public class ShowIpTag extends SimpleTagSupport{

    @Override
    public void doTag()throws JspException, IOException {
        //向浏览器输入客户端ip地址
        PageContext page=(PageContext)this.getJspContext();
        HttpServletRequest request=(HttpServletRequest) page.getRequest();
        String host=request.getRemoteHost();
        JspWriter out=page.getOut();
        out.write("使用自定义标签输出客户的IP地址:"+host);
        
    }

    
}

tld文件

<?xml version="1.0" encoding="UTF-8"?>

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
     
     1.1
     
     <short-name>Mybiaoqianshort-name>
     
     http://xiaoping.com
     
     
     
         showIp
         class>Biaoqian.ShowIpTagclass>
         scriptless
     

jsp文件

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"
    %>
<%@taglib uri="http://xiaoping.com" prefix="Mybiaoqian"%>




自定义标签


    

10.javaBean

  咖啡豆,一种开发规范,也可以说是一种技术

  满足一定条件:

        1)必有有无惨构造函数2)属性私有化3)提供getset方法设置属性

  使用场景

    1)项目中用到实体对象(entity)符合javabean规范

    2EL表达式访问对象属性。${student.name}  调用getName()方法,符合javabean规范。

    3jsp标签中的属性赋值。 setNumInteger num)。符合javabean规范。

    4jsp页面中使用javabean。符合javabean规范

  关于javaBean的动作元素

    1):查找或者实例化一个javaBean对象

    2)标签:设置一个javaBean组件的属性

    3)标签:得到一个javaBean组件的属性

web项目:通讯录的web项目

1.实体
package contact1;
/**
 * 联系人
 * @author Administrator
 *
 */
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.工具类

XmlUtil,JdbcUtil

package contact1;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 对jdbc的操作
 * @author Administrator
 *
 */
public class JdbcUtil {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String driverClass = null;
    
    /**
     * 静态代码块中(只加载一次)
     */
    static{
        try {
            //读取db.properties文件
            Properties props = new Properties();
            /**
             *  . 代表java命令运行的目录
             *  在java项目下,. java命令的运行目录从项目的根目录开始
             *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
             *  所以不能使用点.
             */
            //FileInputStream in = new FileInputStream("./src/db.properties");
            
            /**
             * 使用类路径的读取方式
             *  / : 斜杠表示classpath的根目录
             *     在java项目下,classpath的根目录从bin目录开始
             *     在web项目下,classpath的根目录从WEB-INF/classes目录开始
             */
            InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
            
            //加载文件
            props.load(in);
            //读取信息
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
            driverClass = props.getProperty("driverClass");
            
            
            //注册驱动程序
            Class.forName(driverClass);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("驱程程序注册出错");
        }
    }

    /**
     * 抽取获取连接对象的方法
     */
    public static Connection getConnection(){
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    
    /**
     * 释放资源的方法
     */
    public static void close(Connection conn,Statement stmt){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
    
    public static void close(Connection conn,Statement stmt,ResultSet rs){
        if(rs!=null)
            try {
                rs.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
                throw new RuntimeException(e1);
            }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
}}
package contact1;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 对jdbc的操作
 * @author Administrator
 *
 */
public class JdbcUtil {
    private static String url = null;
    private static String user = null;
    private static String password = null;
    private static String driverClass = null;
    
    /**
     * 静态代码块中(只加载一次)
     */
    static{
        try {
            //读取db.properties文件
            Properties props = new Properties();
            /**
             *  . 代表java命令运行的目录
             *  在java项目下,. java命令的运行目录从项目的根目录开始
             *  在web项目下,  . java命令的而运行目录从tomcat/bin目录开始
             *  所以不能使用点.
             */
            //FileInputStream in = new FileInputStream("./src/db.properties");
            
            /**
             * 使用类路径的读取方式
             *  / : 斜杠表示classpath的根目录
             *     在java项目下,classpath的根目录从bin目录开始
             *     在web项目下,classpath的根目录从WEB-INF/classes目录开始
             */
            InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties");
            
            //加载文件
            props.load(in);
            //读取信息
            url = props.getProperty("url");
            user = props.getProperty("user");
            password = props.getProperty("password");
            driverClass = props.getProperty("driverClass");
            
            
            //注册驱动程序
            Class.forName(driverClass);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("驱程程序注册出错");
        }
    }

    /**
     * 抽取获取连接对象的方法
     */
    public static Connection getConnection(){
        try {
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    
    /**
     * 释放资源的方法
     */
    public static void close(Connection conn,Statement stmt){
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }
    
    public static void close(Connection conn,Statement stmt,ResultSet rs){
        if(rs!=null)
            try {
                rs.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
                throw new RuntimeException(e1);
            }
        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
}}

3.操作通讯录

  1)接口

package contact1;

import java.util.List;
/**
 * 操作联系人接口
 * @author Administrator
 *
 */
public interface ContactDao {
    public void addContact(Contact contact);//添加联系人
    public void updateContact(Contact contact);//修改联系人
    public void deleteContact(String id);//删除联系人
    public List findAll();  //查询所有联系人
    public Contact findById(String id);//根据编号查询联系人
    public boolean checkContact(String name);//根据姓名查询是否重复
}

  2)面向xml存储数据的实现类,面向MySql数据库的实现类

package contact1;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class ContactDaoImpl implements ContactDao {
    /**
     * 添加联系人
     */
    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标签
            /**
             * 
                    eric
                    
                    20
                    1343333
                    eric@qq.com
                    554444
                
             */
            Element contactElem = rootElem.addElement("contact");
            
            /**
             * 由系统自动生成随机且唯一的ID值,赋值给联系人
             */
            String uuid = UUID.randomUUID().toString().replace("-","");
            
            contactElem.addAttribute("id", uuid);
            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);
        }
    }

    /**
     * 删除联系人
     */
    public void deleteContact(String id) {
        try {
            //1.读取xml文件
            Document doc = XMLUtil.getDocument();
            //2.查询需要删除id的contact
            Element contactElem = (Element)doc.selectSingleNode("//contact[@id='"+id+"']");
            //删除标签
            if(contactElem!=null){
                contactElem.detach();
            }
            
            //3.把Document写出到xml文件
            XMLUtil.write2xml(doc);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 查询所有联系人
     */
    public List findAll() {
        //1.读取xml文件
        Document doc = XMLUtil.getDocument();
        
        //2.创建List对象
        List list = new ArrayList();
        //3.读取contact标签
        @SuppressWarnings("unchecked")
        List conList = (List)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;
    }

    /**
     * 根据编号查询联系人
     */
    public Contact findById(String id) {
        Document doc = XMLUtil.getDocument();
        Element e = (Element)doc.selectSingleNode("//contact[@id='"+id+"']");
        
        Contact c = null;
        if(e!=null){
            //创建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"));
        }
        return c;
    }

    /**
     * 修改联系人
     */
    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);
        }
    }
    
    public static void main(String[] args) {
        //测试UUID
        String uuid = UUID.randomUUID().toString().replace("-","");
        System.out.println(uuid);
    }

    /**
     * true:重复
     * false:不重复
     */
    public boolean checkContact(String name) {
        //查询name标签的内容和传入的name值是否一致?
        Document doc = XMLUtil.getDocument();
        Element nameElem = (Element)doc.selectSingleNode("//name[text()='"+name+"']");
        if(nameElem!=null){
            return true;
        }else{
            return false;
        }
    }

}
package contact1;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class ContactDaoMySQLImpl implements ContactDao{
    /**
     * 添加联系人
     */
    public void addContact(Contact contact) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try{
            //获取连接
            conn = JdbcUtil.getConnection();
            
            String sql = "INSERT INTO contact(id,NAME,gender,age,phone,email,qq) VALUES(?,?,?,?,?,?,?)";
            
            //创建PreparedStatement
            stmt = conn.prepareStatement(sql);
            
            String id = UUID.randomUUID().toString().replace("-", "");
            //设置参数
            stmt.setString(1, id);
            stmt.setString(2, contact.getName());
            stmt.setString(3, contact.getGender());
            stmt.setInt(4, contact.getAge());
            stmt.setString(5, contact.getPhone());
            stmt.setString(6, contact.getEmail());
            stmt.setString(7, contact.getQq());
            
            //执行
            stmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt);
        }
    }

    public boolean checkContact(String name) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try{
            //获取连接
            conn = JdbcUtil.getConnection();
            
            String sql = "SELECT * FROM contact where name=?";
            
            //创建PreparedStatement
            stmt = conn.prepareStatement(sql);
            
            stmt.setString(1, name);
    
            //执行
            rs = stmt.executeQuery();
            if(rs.next()){
                return true;
            }else{
                return false;
            }
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt ,rs);
        }
    }

    public void deleteContact(String id) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try{
            //获取连接
            conn = JdbcUtil.getConnection();
            
            String sql = "DELETE FROM contact WHERE id=?";
            
            //创建PreparedStatement
            stmt = conn.prepareStatement(sql);
            
            //设置参数
            stmt.setString(1, id);
            
            //执行
            stmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt);
        }
    }

    public List findAll() {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try{
            //获取连接
            conn = JdbcUtil.getConnection();
            
            String sql = "SELECT * FROM contact";
            
            //创建PreparedStatement
            stmt = conn.prepareStatement(sql);
    
            //执行
            rs = stmt.executeQuery();
            List list = new ArrayList();
            while(rs.next()){
                Contact c = new Contact();
                c.setId(rs.getString("id"));
                c.setName(rs.getString("name"));
                c.setGender(rs.getString("gender"));
                c.setAge(rs.getInt("age"));
                c.setPhone(rs.getString("phone"));
                c.setEmail(rs.getString("email"));
                c.setQq(rs.getString("qq"));
                list.add(c);
            }
            return list;
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt ,rs);
        }
    }

    public Contact findById(String id) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try{
            //获取连接
            conn = JdbcUtil.getConnection();
            
            String sql = "SELECT * FROM contact where id=?";
            
            //创建PreparedStatement
            stmt = conn.prepareStatement(sql);
            
            stmt.setString(1, id);
    
            //执行
            rs = stmt.executeQuery();
            Contact c = null;
            if(rs.next()){
                c = new Contact();
                c.setId(rs.getString("id"));
                c.setName(rs.getString("name"));
                c.setGender(rs.getString("gender"));
                c.setAge(rs.getInt("age"));
                c.setPhone(rs.getString("phone"));
                c.setEmail(rs.getString("email"));
                c.setQq(rs.getString("qq"));
            }
            return c;
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt ,rs);
        }
    }

    /**
     * 修改
     */
    public void updateContact(Contact contact) {
        Connection conn = null;
        PreparedStatement stmt = null;
        try{
            //获取连接
            conn = JdbcUtil.getConnection();
            
            String sql = "UPDATE contact SET NAME=?,gender=?,age=?,phone=?,email=?,qq=? WHERE id=?";
            
            //创建PreparedStatement
            stmt = conn.prepareStatement(sql);

            //设置参数
            stmt.setString(1, contact.getName());
            stmt.setString(2, contact.getGender());
            stmt.setInt(3, contact.getAge());
            stmt.setString(4, contact.getPhone());
            stmt.setString(5, contact.getEmail());
            stmt.setString(6, contact.getQq());
            stmt.setString(7, contact.getId());
            
            //执行
            stmt.executeUpdate();
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally{
            JdbcUtil.close(conn, stmt);
        }

    }

}
XmlUtil
package contact1;

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * xml操作类
 * @author Administrator
 *
 */
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);
        }
    }
}

  3)自定义的重名异常类

package contact1;

public class NameRepeatException extends Exception{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public NameRepeatException(String msg){
        super(msg);
    }
}

4.web项目逻辑层代码

  1)增删改接口:

package contact1;

import java.util.List;
/**
 * Servlet中要操作的接口
 * @author Administrator
 *
 */
public interface ContactService {
    public void addContact(Contact contact)throws NameRepeatException;//添加联系人
    public void updateContact(Contact contact);//修改联系人
    public void deleteContact(String id);//删除联系人
    public List findAll();  //查询所有联系人
    public Contact findById(String id);//根据编号查询联系人
}

  2)实现接口的服务类

package contact1;

import java.util.List;

/**
 * 处理 项目中出现的业务逻辑
 * @author Administrator
 *
 */
public class ContactServiceImpl implements ContactService{
    //ContactDao dao = new ContactDaoImpl();
        ContactDao dao = new ContactDaoMySQLImpl();
        
        public void addContact(Contact contact) throws NameRepeatException {
            //执行业务逻辑判断
            if(dao.checkContact(contact.getName())){
                //重复
                /**
                 * 注意: 如果业务层方法出现任何业务异常,则返回标记(自定义异常)到servlet
                 */
                throw new NameRepeatException("姓名重复,不可使用");
            }
            //如果不重复,才执行添加方法
            dao.addContact(contact);
        }

        public void deleteContact(String id) {
            dao.deleteContact(id);
        }

        public List findAll() {
            return dao.findAll();
        }

        public Contact findById(String id) {
            return dao.findById(id);
        }

        public void updateContact(Contact contact) {
            dao.updateContact(contact);
        }
}

5.Servletweb项目逻辑层

1.AddContactServlet
package 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 contact1.Contact;
import contact1.ContactService;
import contact1.ContactServiceImpl;
import contact1.NameRepeatException;

public class AddContactServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //接受参数
        String name = request.getParameter("name");
        String gender = request.getParameter("gender");
        String age = request.getParameter("age");
        String phone = request.getParameter("phone");
        String email = request.getParameter("email");
        String qq = request.getParameter("qq");
        //调用逻辑
        Contact contact = new Contact();
        contact.setName(name);
        contact.setGender(gender);
        contact.setAge(Integer.parseInt(age));
        contact.setPhone(phone);
        contact.setEmail(email);
        contact.setQq(qq);
        ContactService service = new ContactServiceImpl();
        try {
            service.addContact(contact);//添加的时候可能添加重名的所有生命这个异常
        } catch (NameRepeatException e) {
            //处理自定义业务异常类
            request.setAttribute("msg", e.getMessage());
            //这里跳转是因为有需要保存的
            request.getRequestDispatcher("/addContact.jsp").forward(request, response);
            return;
        }
        //跳转页面不需要保存是么所以是重定向
        response.sendRedirect(request.getContextPath()+"/ListContactServlet");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
DeleContactServelt
package 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 contact1.ContactService;
import contact1.ContactServiceImpl;

public class DeleContactServlet extends HttpServlet {

    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            //1获得参数
            String id = request.getParameter("id");
            //2.处理业务逻辑
            ContactService service = new ContactServiceImpl();
            service.deleteContact(id);
            //3.跳转页面这里是重定向不是跳转了因为这里不需要保存是么东西在request中了用重定向好些
            response.sendRedirect(request.getContextPath()+"/ListContactServlet");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
ListContactServlet
package 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 contact1.Contact;
import contact1.ContactService;
import contact1.ContactServiceImpl;

public class ListContactServlet extends HttpServlet {

    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //从数据库中获得
        ContactService service = new ContactServiceImpl();
        List list = service.findAll();
        //将数据保存到requset域对象
        request.setAttribute("contacts", list);
        //跳转到jsp页面
        request.getRequestDispatcher("/listContact.jsp").forward(request, response);        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request, response);
    }

}
QueryContactServlet
package 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 contact1.Contact;
import contact1.ContactService;
import contact1.ContactServiceImpl;

/**
 * 修改一列时,先获得者列数据
 * @author Administrator
 *
 */
public class QueryContactServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.接收id
        String id=request.getParameter("id");
        //2.调用service根据id查询联系人的方法
        ContactService service = new ContactServiceImpl();
        Contact contact = service.findById(id);
        //3.查询结果放到request对象中去
        request.setAttribute("contact", contact);
        //4.跳转到更新页面
        request.getRequestDispatcher("/updateContact.jsp").forward(request, response);
    }

    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request, response);
    }

}
UpdateContextServlet
package 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 contact1.Contact;
import contact1.ContactService;
import contact1.ContactServiceImpl;

public class UpdateContextServlet extends HttpServlet {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //1.接收参数
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        String gender = request.getParameter("gender");
        String age = request.getParameter("age");
        String phone = request.getParameter("phone");
        String email = request.getParameter("email");
        String qq = request.getParameter("qq");
        
        //封装成Contact对象
        Contact contact = new Contact();
        contact.setId(id);
        contact.setName(name);
        contact.setGender(gender);
        contact.setAge(Integer.parseInt(age));
        contact.setPhone(phone);
        contact.setEmail(email);
        contact.setQq(qq);
        //业务逻辑
        ContactService service = new ContactServiceImpl();
        service.updateContact(contact);
        //跳转不需要保存是么就可以用重定向了
        response.sendRedirect(request.getContextPath()+"/ListContactServlet");
        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request, response);
    }
}

6.连接数据库参数的配置文件

db.properties

url=jdbc:mysql:thin:@127.0.0.1:3306:contactsys_web
user=root
password=mysql
driverClass=com.mysql.jdbc.Driver

7.jsp

addContact.jsp

addContact.jsp
<%@ page language="java" import="java.util.*,contact1.Contact" pageEncoding="utf-8"%>
"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
"http://www.w3.org/1999/xhtml">

"Content-Type" content="text/html; charset=utf-8" />
添加联系人

  
      

添加联系人

"${pageContext.request.contextPath }/AddContactServlet" method="post"> "center" border="1" width="400xp">
姓名 "text" name="name"/>"red">${msg }
性别 "radio" name="gender" value=""/>"radio" name="gender" value=""/>
年龄 "text" name="age"/>
电话 "text" name="phone"/>
邮箱 "text" name="email"/>
QQ "text" name="qq"/>
"2" align="center"> "submit" value="保存"/>&nbsp; "reset" value="重置"/>

listContact.jsp

<%@ page language="java" import="java.util.*,contact1.Contact" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
"http://www.w3.org/1999/xhtml">

"Content-Type" content="text/html; charset=utf-8" />
查询所有联系人


  
      

查询所有人

"center" border="1" width="700px"> "${contacts }" var="con" varStatus="varSta">
编号 姓名 性别 年龄 电话 邮箱 QQ 操作
${varSta.count} ${con.name} ${con.gender} ${con.age} ${con.phone} ${con.email} ${con.qq} "${pageContext.request.contextPath }/QueryContactServlet?id=${con.id}">修改  "${pageContext.request.contextPath }/DeleteContactServlet?id=${con.id}">删除
"8" align="center">"${pageContext.request.contextPath }//addContact.jsp">[添加联系人]
<%@ page language="java" import="java.util.*,contact1.Contact" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
"http://www.w3.org/1999/xhtml">

"Content-Type" content="text/html; charset=utf-8" />
修改联系人

  
    

修改联系人

"${pageContext.request.contextPath }/UpdateContactServlet" method="post"> "hidden" name="id" value="${contact.id }" /> "center" border="" width="300px">
姓名 "text" name="name" value="${contact.name }"/>
性别 "radio" name="gender" value="" if test="${contact.gender=='男' }">checked="checked"if> />"radio" name="gender" value="" if test="${contact.gender=='女' }">checked="checked"if> />
年龄 "text" name="age" value="${contact.age }"/>
电话 "text" name="phone" value="${contact.phone }"/>
邮箱 "text" name="email" value="${contact.email }"/>
QQ "text" name="qq" value="${contact.qq }"/>
"2" align="center"> "submit" value="保存"/>&nbsp; "reset" value="重置"/>