zoukankan      html  css  js  c++  java
  • 网上书城小工具(也适用于其他项目)

    工欲善其事,必先利其器小工具底层使用了:

    · c3p0数据库连接池;

    · common-beanutils

    ·common-dbutils

    · javaMail

    1 CommonUtils(通用工具类)

    CommonUtils类就两个方法:

     ·String uuid():生成长度32的随机字符,通常用来做实体类的ID。底层使用了UUID类完成;

     ·T toBean(Map, Class<T>):把Map转换成指定类型的Bean对象。通常用来获取表单数据(request.getParameterMap())封装到JavaBean中,底层使用了common-beanutils注意,本方法要求map中键的名称要与Bean的属性名称相同才能完成映射,否则不能完成映射。

    /**
         * 随机生成32位长的字符串,通常用来做实体类的ID
    * 或者是订单号
    */ @Test public void testUuid() { String s = CommonUtils.uuid();//生成随机32位长的字符串 System.out.println(s); } /** * 把Map类型映射成Bean类型。 * 要求map中键的名称与Person类的属性名称相同。 * 即map的key分别为:pid、name、age、birthday,person的属性名称也是pid、name、age、birthday
    * map的key与属性名一一对应
    */ @Test public void testToBean() { Map<String,String> map = new HashMap<String,String>(); /* * map的key:pid、age、birthday、myname * person的属性:pid、age、birthday、name * map中没有名为name的键值,而多出一个名为myname的键值,所以映射后的person对象的name属性值为null。 * map中的age和birthday都是字符串类型,而person的age是int类型、birthday是Date类型,但toBean()方法会自动对Map中值进行类型转换。 */ map.put("pid", CommonUtils.uuid()); map.put("age", "23"); map.put("birthday", "2014-01-30"); map.put("myname", "张三"); Person p = CommonUtils.toBean(map, Person.class); System.out.println(p); }



    2 JdbcUtils

    JdbcUtils用来获取Connection对象,以及开启关闭事务。

    · Connection getConnection():从c3p0连接池获取Connection对象,所以需要提供c3p0-config.xml配置文件

    · beginTransaction():为当前线程开启事务;

    · commitTransaction():提交当前线程的事务;

    · rollbackTransaction():回滚当前线程的事务;

    · releaseConnection(Connection):如果参数连接对象不是当前事务的连接对象,那么关闭它,否则什么都不做;《.close方法是一定关》

    c3p0-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <c3p0-config>
        <default-config> 
            <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="user">root</property>
            <property name="password">123</property>
            
            <property name="acquireIncrement">3</property>
            <property name="initialPoolSize">10</property>
            <property name="minPoolSize">2</property>
            <property name="maxPoolSize">10</property>
        </default-config>
    </c3p0-config>

    JdbcUtilsTest.java

    /**
     * 测试JdbcUtils类
     * @author qdmmy6
     *
     */
    public class JdbcUtilsTest {
        /**
         * 通过C3P0连接池获取连接对象
         * @throws SQLException
         */
        @Test
        public void testGetConnection() throws SQLException {
            Connection con = JdbcUtils.getConnection();//获取连接
            System.out.println(con);
            JdbcUtils.releaseConnection(con);//如果参数con不是当前线程的连接对象,那么关闭之
        }
        
        /**
         * 当开始事务后,调用getConnection()会为当前线程创建Connection,而且多次调用getConnection()返回的是同一个对象
         * @throws SQLException 
         */
        @Test
        public void testTansaction() throws SQLException {
            JdbcUtils.beginTransaction();//开启事务
            Connection c1 = JdbcUtils.getConnection();//第一次获取当前线程的事务连接对象
            Connection c2 = JdbcUtils.getConnection();//第二次获取当前线程的事务连接对象
            Assert.assertEquals(true, c1 == c2);//比较两次是否相同
            JdbcUtils.commitTransaction();//提交事务
        }
    }

    3 TxQueryRunner

    TxQueryRunner类是common-dbutilsQueryRunner类的子类(用法与其父类相似,区别是其支持事务),用来简化JDBC操作TxQueryRunner类内部使用了JdbcUtils.getConnection()类来获取连接对象,以及使用JdbcUtils.releaseConnection()关闭连接。

    三种方法:update()

           query()

           batch() 

    · int[] batch(String sql, Object[][] params):执行批处理,参数sqlSQL语句模板,params为参数;

    · T query(String sql, ResultSetHandler<T> rh):执行查询,执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果;

    · T query(String sql, ResultSetHandler<T> rh, Object… params):执行查询,参数sql为要执行的查询语句模板,rh是结果集处理,用来把结果集映射成你想要的结果,paramssql语句的参数;

    · int update(String sql):执行增、删、改语句,参数sql是要执行的SQL语句;

    · int update(Stringsql, Object param):执行增、删、改语句,参数sql是要执行的SQL语句,参数param是参数(一个参数);

    · int update(String sql, Object… params):执行增、删、改语句,参数sql是要执行的SQL语句,参数params是参数(多个参数);

    为了测试TxQueryRunner,我们在mydb1数据库下创建t_person表,然后再创建Person实体类,以及PersonDao类,最后测试PersonDao类中的方法。

    t_person

    字段

    说明

    pid

    主键

    name

    姓名

    age

    年龄

    birthday

    生日

     

    Person.java

    public class Person {
        private String pid;
        private String name;
        private int age;
        private Date birthday;
    …
    }

    PersonDao.java

    /**
     * 测试TxQueryRunner
     * @author qdmmy6
     *
     */
    public class PersonDao {
        private QueryRunner qr = new TxQueryRunner();
        
        public void add(Person person) throws SQLException {
            String sql = "insert into t_person values(?,?,?,?)";
            Object[] params = {person.getPid(), 
                    person.getName(), 
                    person.getAge(), 
                    new java.sql.Date(person.getBirthday().getTime())};
            qr.update(sql, params);
        }
        
        public void edit(Person person) throws SQLException {
            String sql = "update t_person set name=?,age=?,birthday=? where pid=?";
            Object[] params = { 
                    person.getName(), 
                    person.getAge(), 
                    new java.sql.Date(person.getBirthday().getTime()),
                    person.getPid()};
            qr.update(sql, params);
        }
        
        public void delete(String pid) throws SQLException {
            String sql = "delete from t_person where pid=?";
            qr.update(sql, pid);
        }
        
        public Person load(String pid) throws SQLException {
            String sql = "select * from t_person where pid=?";
            return qr.query(sql, new BeanHandler<Person>(Person.class), pid);
        }
        
        public List<Person> findAll() throws SQLException {
            String sql = "select * from t_person";
            return qr.query(sql, new BeanListHandler<Person>(Person.class));
        }
    }

    PersonDaoTest.java

    public class PersonDaoTest {
        @Test
        public void testAdd() throws SQLException {
            Person p1 = new Person(CommonUtils.uuid(), "张三", 18, new Date());
            Person p2 = new Person(CommonUtils.uuid(), "李四", 81, new Date());
            Person p3 = new Person(CommonUtils.uuid(), "王五", 66, new Date());
            
            PersonDao dao = new PersonDao();
            dao.add(p1);
            dao.add(p2);
            dao.add(p3);
        }
        
        @Test
        public void testEdit() throws SQLException {
            PersonDao dao = new PersonDao();
            Person person = dao.load("2F371BE415984DE89781CCCA7B8734CB");
            person.setAge(88);
            dao.edit(person);
        }
        
        @Test
        public void testDelete() throws SQLException {
            PersonDao dao = new PersonDao();
            dao.delete("2F371BE415984DE89781CCCA7B8734CB");
        }
        
        @Test
        public void testFindAll() throws SQLException {
            PersonDao dao = new PersonDao();
            List<Person> list = dao.findAll();
            System.out.println(list);
        }
    }

    4 MailUtils

    MailUtils是用来发邮件的小工具,底层使用JavaMail完成,所以它这件事mail.jaractivaion.jar

    MailUtilsTest.java

        /**
         * 测试发送普通邮件
         * @throws IOException 
         * @throws MessagingException 
         */
        @Test
        public void fun() throws MessagingException, IOException {
            Session session = MailUtils.createSession("smtp.163.com", "itcast_cxf", "itcastitcast");[创建session]
            Mail mail = new Mail("itcast_cxf@163.com", "itcast_cxf@126.com", "测试MailUtils", "这是正文!");[创建邮箱对象,参数分别为:发件人、收件人、主题、正文]
            MailUtils.send(session, mail);[发送邮件]
        }

    5 BaseServlet

    BaseServlet是用来作为其它Servlet父类的,它有如下两个优点:

    一个Servlet多个处理方法

    BaseServlet的作用是用来简化Servlet。通过我们需要为每个功能编写一个Servlet,例如用户注册写一个RegistServlet,用户登录写一个LoginServlet。如果使用BaseServlet,那么我们可以只写一个UserServlet,然后让UserServlet去继承BaseServlet,然后在UserServlet给出两个请求处理方法,一个方法叫regist(),一个叫login()

    BaseServlet来简化了Servlet中请求转发和重定向的代码。

    简化了请求转发和重定向的代码 

    BaseServlet中的请求处理方法有一个String类型的返回值,返回值表示转发或重定向的目标页面。例如:

    · f:/index.jsp:其中f:表示转发,即forward的意思,/index.jsp表示转发到/index.jsp页面;

    · r:/index.jsp:其中r:表示重定向,即redirect的意思,/index.jsp表示重定向到/index.jsp页面。

    · null:表示不转发也不重定向;

    因为BaseServlet中可以有多个请求处理方法,所以在访问BaseServlet时一定要给出名为method的参数来指定要请求的方法名称。

    AServlet.java

    public class AServlet extends BaseServlet {
        /**
         * 请求处理方法的参数都与doGet()和doPost()相同,即request和response
         * 但请求处理方法有String类型的返回值,而doGet()和doPost()没有返回值。
         * 在请求本方法时需要给出method=regist参数!
         */
        public String regist[访问本方法的URL为http://localhost:8080/day01/AServlet?method=regist](HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("AServlet regist()...");
            return "f:/index.jsp";[转发到/index.jsp页面]
        }
        
        /**
         * 在请求本方法时需要给出method=login参数!
         */
        public String login[访问本方法的URL为http://localhost:8080/day01/AServlet?method=login](HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("AServlet login()...");
            return "r:/index.jsp"[重定向到/index.jsp];
        }
    }

    6 EncodingFilter

    EncodingFilter用来处理请求编码问题。

    我们知道,如果是POST请求,我们需要调用request.setCharacterEncoding(“utf-8”)方法来设计编码;如果是GET请求,我们需要自己手动来处理编码问题。如果我们使用了EncodingFilter,那么就处理了POSTGET请求的编码问题。

    web.xml

    <filter>
        <filter-name>EncdoingFilter</filter-name>
        <filter-class>cn.itcast.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncdoingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    index.jsp

    <a href="<c:url value='/EncodingServlet?method=test[请求EncdoingServlet的test方法]&name=张三'/>">点击这里发出GET请求</a><br/>
    <form action="<c:url value='/EncodingServlet'/>" method="post">
      <input type="hidden" name="method" value="test"/>[请求EncodingServlet的test方法]
      <input type="text" name="name" value="李四"/>
      <input type="submit" value="请求这里发出POST请求"/>
    </form>

    EncodingServlet

    /**
     * 测试EncodingFilter
     * @author qdmmy6
     *
     */
    public class EncodingServlet [因为添加了EncodingFilter过滤器,那么所有的Servlet都不用再去处理请求编码的问题了。]extends BaseServlet {
        /**
         * 可以使用POST和GET两种方式请求test()方法!查看输出是否为乱码!
         */
        public String test(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String name = request.getParameter("name");
            System.out.println(name);
            return null;
        }
    }

    7 VerifyCodeServlet(一次性验证码)

    通过在表单中总是需要使用一次性验证码,这一问题可以使用VerifyCodeServlet来处理。让<img>元素的src指向VerifyCodeServlet即可在页面中生成一次性验证码。而且VerifyCodeServlet还会把验证码保存到session中,名称为:vCode,也就是说,你可以通过session来获取验证码文本:session.getAttribute(“vCode”)

    web.xml

    <servlet>
      <servlet-name>VerifyCodeServlet</servlet-name>
      <servlet-class>cn.itcast.vcode.servlet.VerifyCodeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>VerifyCodeServlet</servlet-name>
      <url-pattern>/VerifyCodeServlet</url-pattern>
    </servlet-mapping>

    MyJsp.jsp

    <form action="<c:url value='/UserServlet'/>" method="post">
        <input type="hidden" name="method" value="regist"/>
        验证码:<input type="text" name="verifyCode"/>
        <img src="<c:url value='/VerifyCodeServlet'/>"[让<img>的src指向VerifyCodeServlet即可生成一次性验证码] border="1"/><br/>
        <input type="submit" value="注册"/>
    </form>

      因为用户可能看不清楚图片上的文本,所以我们需要给用户提供一个“换一张”超链接。其实实现这一步很简单,只需要使用javascript<img>元素src指向VerifyCodeServlet即可。但因为浏览器可能会缓存上一次生成的图片,所以我们还需要使用时间为参数“强迫”浏览器访问服务器,而不是使用缓存。

    MyJsp.jsp

        <script type="text/javascript" src="<c:url value='/js/jquery-1.5.1.js'/>"></script>[导入jquery]
        <script type="text/javascript">
            function change[在点击“换一张”时会调用本方法]() {
                $("#img").attr("src", "<c:url value='/VerifyCodeServlet?'/>" + new Date().getTime());[指定<img>元素的src属性值为VerifyCodeServlet,并且追加参数为当前时间毫秒,它是不会重复的值,所以浏览器不会使用缓存,而是访问服务器。]
            }
        </script><form action="<c:url value='/UserServlet'/>" method="post">
        <input type="hidden" name="method" value="regist"/>
        验证码:<input type="text" name="verifyCode"/>
        <img id="img"[指定id为img,方法使用jquery来查找该元素。] src="<c:url value='/VerifyCodeServlet'/>" border="1"/>
        <a href="javascript:change();">换一张</a>[点击该超链接会调用change()方法]
        <br/>
        <input type="submit" value="注册"/>
    </form>

    当用户在表单中填写了验证码,而且提交了表单,到达UserServletregist()方法,在regist() 方法中需要比较用户在表单中输入的验证码,与验证码图片上的文本是否相同。

    · 获取用户输入的验证码:request.getParameter(“verifyCode”)

    · 获取图片上的验证码:session.getAttribute(“vCode”);

     

     

  • 相关阅读:
    基础篇
    模块,包
    初识面向对象
    linux在线安装jdk
    热点链接(img map area)
    oracle temp 临时表
    ajax基础代码
    Java编译执行带包名java文件
    oracle spool 用法小结
    Hadoop NameNode safemode
  • 原文地址:https://www.cnblogs.com/zjfjava/p/5954379.html
Copyright © 2011-2022 走看看