当前位置:   article > 正文

11、Javaweb_JSP&MVC&EL&JSTL&三层架构&用户列表案例_javaweb jstl案例设计

javaweb jstl案例设计

JSP:

1. 指令
    * 作用:用于配置JSP页面,导入资源文件
    * 格式:
        <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
    * 分类:
        1. page        : 配置JSP页面的
            * contentType:等同于response.setContentType()
                1. 设置响应体的mime类型以及字符集
                2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
            * import:导包
            * errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
            * isErrorPage:标识当前也是是否是错误页面。
                * true:是,可以使用内置对象exception
                * false:否。默认值。不可以使用内置对象exception

发生异常,跳转错误页面

  1. <%@ page import="java.util.ArrayList" %>
  2. <%@ page import="java.util.List" %>
  3. <%@ page contentType="text/html;charset=gbk" errorPage="500.jsp" pageEncoding="GBK" language="java" buffer="16kb" %>
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  5. <html>
  6. <head>
  7. <title>$Title$</title>
  8. </head>
  9. <body>
  10. <%
  11. List list = new ArrayList();
  12. int i = 3/0;
  13. %>
  14. </body>
  15. </html>

被跳转的错误页面:
 

  1. <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>服务器正忙...</h1>
  8. <%
  9. String message = exception.getMessage();
  10. out.print(message);
  11. %>
  12. </body>
  13. </html>

2. include    : 页面包含的。导入页面的资源文件
            * <%@include file="top.jsp"%>
        3. taglib    : 导入资源
            * <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
                * prefix:前缀,自定义的
2. 注释:
    1. html注释:
        <!-- -->:只能注释html代码片段,并且注释信息会发送到响应体中
    2. jsp注释:推荐使用
        <%-- --%>:可以注释所有,并且注释信息不回发送到响应体中

导入资源文件

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@include file="top.jsp"%>
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <!--
  9. <h1>hello</h1>
  10. -->
  11. <%--
  12. <%
  13. System.out.println("hi~~~~");
  14. %>
  15. --%>
  16. <%--
  17. <input>
  18. --%>
  19. <%
  20. pageContext.setAttribute("msg","hello");
  21. %>
  22. <%=pageContext.getAttribute("msg")%>
  23. </body>
  24. </html>

被导入资源文件:top.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <h1>页面logo页面标题</h1>

3. 内置对象
    * 在jsp页面中不需要创建,直接使用的对象
//C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.3\tomcat\bc4f368a-2989-4a92-9ce4-f5e65d925d89\work\Catalina\localhost\ROOT\org\apache\jsp\_500_jsp.java
    * 一共有9个:
            变量名                    真实类型                        作用
        * pageContext                PageContext                    当前页面共享数据,还可以获取其他八个内置对象
        * request                    HttpServletRequest            一次请求访问的多个资源(转发)
        * session                    HttpSession                    一次会话的多个请求间
        * application                ServletContext                所有用户间共享数据
        * response                    HttpServletResponse            响应对象
        * page                        Object                        当前页面(Servlet)的对象  this
        * out                        JspWriter                    输出对象,数据输出到页面上
        * config                    ServletConfig                Servlet的配置对象
        * exception                    Throwable                    异常对象

MVC:开发模式

1. jsp演变历史
    1. 早期只有servlet,只能使用response输出标签数据,非常麻烦
    2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,有写html表,造成难于维护,难于分工协作
    例如:在jsp中把HTML,CSS,JavaScript,Java代码写在一个页面,并且html嵌套在Java代码中,html还嵌套在for循环中,前端人员不易读懂代码,只有开发人员自己能够维护. 只有开发人员自己写的时候方便,不利于分工协作
    3. 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性

2. MVC:
    1. M:Model,模型。JavaBean
        * 完成具体的业务操作,如:查询数据库,封装对象
    2. V:View,视图。JSP
        * 展示数据
    3. C:Controller,控制器。Servlet
        * 获取用户的输入
        * 调用模型
        * 将数据交给视图进行展示

* 优缺点:
        1. 优点:
            1. 耦合性低,方便维护,可以利于分工协作
            2. 重用性高

        2. 缺点:
            1. 使得项目架构变得复杂,对开发人员要求高

EL表达式

1. 概念:Expression Language 表达式语言
2. 作用:替换和简化jsp页面中java代码的编写
3. 语法:${表达式}
4. 注意:
    * jsp默认支持el表达式的。如果要忽略el表达式
        1. 设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
        2. \${表达式} :忽略当前这个el表达式

5. 使用:
    1. 运算:
        * 运算符:
            1. 算数运算符: + - * /(div) %(mod)
            2. 比较运算符: > < >= <= == !=
            3. 逻辑运算符: &&(and) ||(or) !(not)
            4. 空运算符: empty
                * 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
                * ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
                * ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

  1. <%@ page import="java.util.List" %>
  2. <%@ page import="java.util.ArrayList" %>
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. ${3 > 4}
  10. \${3 > 4}
  11. <hr>
  12. <h3>算数运算符</h3>
  13. ${3 + 4}<br>
  14. ${3 / 4}<br>
  15. ${3 div 4}<br>
  16. ${3 % 4}<br>
  17. ${3 mod 4}<br>
  18. <h3>比较运算符</h3>
  19. ${3 == 4}<br>
  20. <h3>逻辑运算符</h3>
  21. ${3 > 4 && 3 < 4}<br>
  22. ${3 > 4 and 3 < 4}<br>
  23. <h4>empty运算符</h4>
  24. <%
  25. String str = "";
  26. request.setAttribute("str",str);
  27. List list = new ArrayList();
  28. request.setAttribute("list",list);
  29. %>
  30. ${not empty str}
  31. ${not empty list}
  32. </body>
  33. </html>


    2. 获取值
        1. el表达式只能从域对象中获取值
        2. 语法:
            1. ${域名称.键名}:从指定域中获取指定键的值
                * 域名称:
                    1. pageScope        --> pageContext
                    2. requestScope     --> request
                    3. sessionScope     --> session
                    4. applicationScope --> application(ServletContext)
                * 举例:在request域中存储了name=张三
                * 获取:${requestScope.name}

            2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

  1. <%@ page import="java.util.List" %>
  2. <%@ page import="java.util.ArrayList" %>
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <title>el获取域中的数据</title>
  7. </head>
  8. <body>
  9. <%
  10. //在域中存储数据
  11. session.setAttribute("name","李四");
  12. request.setAttribute("name","张三");
  13. session.setAttribute("age","23");
  14. request.setAttribute("str","");
  15. %>
  16. <h3>el获取值</h3>
  17. ${requestScope.name}
  18. ${sessionScope.age}
  19. ${sessionScope.haha}
  20. ${name}
  21. ${sessionScope.name}
  22. </body>
  23. </html>

    3. 获取对象、List集合、Map集合的值
                1. 对象:${域名称.键名.属性名}
                    * 本质上会去调用对象的getter方法

                2. List集合:${域名称.键名[索引]}

                3. Map集合:
                    * ${域名称.键名.key名称}
                    * ${域名称.键名["key名称"]}

  1. <%@ page import="cn.itcast.domain.User" %>
  2. <%@ page import="java.util.*" %>
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <html>
  5. <head>
  6. <title>el获取数据</title>
  7. </head>
  8. <body>
  9. <%
  10. User user = new User();
  11. user.setName("张三");
  12. user.setAge(23);
  13. user.setBirthday(new Date());
  14. request.setAttribute("u",user);
  15. List list = new ArrayList();
  16. list.add("aaa");
  17. list.add("bbb");
  18. list.add(user);
  19. request.setAttribute("list",list);
  20. Map map = new HashMap();
  21. map.put("sname","李四");
  22. map.put("gender","男");
  23. map.put("user",user);
  24. request.setAttribute("map",map);
  25. %>
  26. <h3>el获取对象中的值</h3>
  27. ${requestScope.u}<br>
  28. <%--
  29. * 通过的是对象的属性来获取
  30. * setter或getter方法,去掉set或get,在将剩余部分,首字母变为小写。
  31. * setName --> Name --> name
  32. --%>
  33. ${requestScope.u.name}<br>
  34. ${u.age}<br>
  35. ${u.birthday}<br>
  36. ${u.birthday.month}<br>
  37. ${u.birStr}<br>
  38. <h3>el获取List值</h3>
  39. ${list}<br>
  40. ${list[0]}<br>
  41. ${list[1]}<br>
  42. ${list[10]}<br>
  43. ${list[2].name}
  44. <h3>el获取Map值</h3>
  45. ${map.gender}<br>
  46. ${map["gender"]}<br>
  47. ${map.user.name}
  48. </body>
  49. </html>

3. 隐式对象:
        * el表达式中有11个隐式对象
        * pageContext:
            * 获取jsp其他八个内置对象
                * ${pageContext.request.contextPath}:动态获取虚拟目录

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>el隐式对象</title>
  5. </head>
  6. <body>
  7. ${pageContext.request}<br>
  8. <h4>在jsp页面动态获取虚拟目录</h4>
  9. ${pageContext.request.contextPath}
  10. <%
  11. %>
  12. </body>
  13. </html>

JSTL

1. 概念:JavaServer Pages Tag Library  JSP标准标签库
    * 是由Apache组织提供的开源的免费的jsp标签        <标签>

2. 作用:用于简化和替换jsp页面上的java代码        

3. 使用步骤:
    1. 导入jstl相关jar包

jstl-impl.jar
javax.servlet.jsp.jstl.jar

    2. 引入标签库:taglib指令:  <%@ taglib %>
    3. 使用标签

4. 常用的JSTL标签
    1. if:相当于java代码的if语句
        1. 属性:
            * test 必须属性,接受boolean表达式
                * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
                * 一般情况下,test属性值会结合el表达式一起使用
            2. 注意:
                * c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签

  1. <%@ page import="java.util.List" %>
  2. <%@ page import="java.util.ArrayList" %>
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  5. <html>
  6. <head>
  7. <title>if标签</title>
  8. </head>
  9. <body>
  10. <%--
  11. c:if标签
  12. 1. 属性:
  13. * test 必须属性,接受boolean表达式
  14. * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
  15. * 一般情况下,test属性值会结合el表达式一起使用
  16. 2. 注意:c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
  17. --%>
  18. <c:if test="true">
  19. <h1>我是真...</h1>
  20. </c:if>
  21. <br>
  22. <%
  23. //判断request域中的一个list集合是否为空,如果不为null则显示遍历集合
  24. List list = new ArrayList();
  25. list.add("aaaa");
  26. request.setAttribute("list",list);
  27. request.setAttribute("number",4);
  28. %>
  29. <c:if test="${not empty list}">
  30. 遍历集合...
  31. </c:if>
  32. <br>
  33. <c:if test="${number % 2 != 0}">
  34. ${number}为奇数
  35. </c:if>
  36. <c:if test="${number % 2 == 0}">
  37. ${number}为偶数
  38. </c:if>
  39. </body>
  40. </html>


    2. choose:相当于java代码的switch语句
        1. 使用choose标签声明                     相当于switch声明
        2. 使用when标签做判断                     相当于case
        3. 使用otherwise标签做其他情况的声明        相当于default

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <html>
  4. <head>
  5. <title>choose标签</title>
  6. </head>
  7. <body>
  8. <%--
  9. 完成数字编号对应星期几案例
  10. 1.域中存储一数字
  11. 2.使用choose标签取出数字 相当于switch声明
  12. 3.使用when标签做数字判断 相当于case
  13. 4.otherwise标签做其他情况的声明 相当于default
  14. --%>
  15. <%
  16. request.setAttribute("number",51);
  17. %>
  18. <c:choose>
  19. <c:when test="${number == 1}">星期一</c:when>
  20. <c:when test="${number == 2}">星期二</c:when>
  21. <c:when test="${number == 3}">星期三</c:when>
  22. <c:when test="${number == 4}">星期四</c:when>
  23. <c:when test="${number == 5}">星期五</c:when>
  24. <c:when test="${number == 6}">星期六</c:when>
  25. <c:when test="${number == 7}">星期天</c:when>
  26. <c:otherwise>数字输入有误</c:otherwise>
  27. </c:choose>
  28. </body>
  29. </html>

    3. foreach:相当于java代码的for语句

  1. <%@ page import="java.util.ArrayList" %>
  2. <%@ page import="java.util.List" %>
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  5. <html>
  6. <head>
  7. <title>foreach标签</title>
  8. </head>
  9. <body>
  10. <%--
  11. foreach:相当于java代码的for语句
  12. 1. 完成重复的操作
  13. for(int i = 0; i < 10; i ++){
  14. }
  15. * 属性:
  16. begin:开始值
  17. end:结束值
  18. var:临时变量
  19. step:步长
  20. varStatus:循环状态对象
  21. index:容器中元素的索引,从0开始
  22. count:循环次数,从1开始
  23. 2. 遍历容器
  24. List<User> list;
  25. for(User user : list){
  26. }
  27. * 属性:
  28. items:容器对象
  29. var:容器中元素的临时变量
  30. varStatus:循环状态对象
  31. index:容器中元素的索引,从0开始
  32. count:循环次数,从1开始
  33. --%>
  34. <c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
  35. ${i} <h3>${s.index}<h3> <h4> ${s.count} </h4><br>
  36. </c:forEach>
  37. <hr>
  38. <%
  39. List list = new ArrayList();
  40. list.add("aaa");
  41. list.add("bbb");
  42. list.add("ccc");
  43. request.setAttribute("list",list);
  44. %>
  45. <c:forEach items="${list}" var="str" varStatus="s">
  46. ${s.index} ${s.count} ${str}<br>
  47. </c:forEach>
  48. </body>
  49. </html>

5. 练习:
    * 需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中

  1. <%@ page import="cn.itcast.domain.User" %>
  2. <%@ page import="java.util.List" %>
  3. <%@ page import="java.util.ArrayList" %>
  4. <%@ page import="java.util.Date" %>
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  7. <html>
  8. <head>
  9. <title>test</title>
  10. </head>
  11. <body>
  12. <%
  13. List list = new ArrayList();
  14. list.add(new User("张三",23,new Date()));
  15. list.add(new User("李四",24,new Date()));
  16. list.add(new User("王五",25,new Date()));
  17. request.setAttribute("list",list);
  18. %>
  19. <table border="1" width="500" align="center">
  20. <tr>
  21. <th>编号</th>
  22. <th>姓名</th>
  23. <th>年龄</th>
  24. <th>生日</th>
  25. </tr>
  26. <%--数据行--%>
  27. <c:forEach items="${list}" var="user" varStatus="s">
  28. <c:if test="${s.count % 2 != 0}">
  29. <tr bgcolor="red">
  30. <td>${s.count}</td>
  31. <td>${user.name}</td>
  32. <td>${user.age}</td>
  33. <td>${user.birStr}</td>
  34. </tr>
  35. </c:if>
  36. <c:if test="${s.count % 2 == 0}">
  37. <tr bgcolor="green">
  38. <td>${s.count}</td>
  39. <td>${user.name}</td>
  40. <td>${user.age}</td>
  41. <td>${user.birStr}</td>
  42. </tr>
  43. </c:if>
  44. </c:forEach>
  45. </table>
  46. </body>
  47. </html>

三层架构:软件设计架构

1. 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
2. 业务逻辑层:处理业务逻辑的。
3. 数据访问层:操作数据存储文件。

案例:用户信息列表展示

1. 需求:用户信息的增删改查操作

导入包

bootstrap.css
bootstrap-theme.css
bootstrap.js
bootstrap.min.js
jquery-2.1.0.min.js

glyphicons-halflings-regular.eot
glyphicons-halflings-regular.svg
glyphicons-halflings-regular.ttf
glyphicons-halflings-regular.woff
glyphicons-halflings-regular.woff2

导入jar包
spring-tx-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-beans-4.2.4.RELEASE.jar
mysql-connector-java-8.0.18.jar
mysql-connector-java-5.1.18-bin.jar
jstl-impl.jar
javax.servlet.jsp.jstl.jar
druid-1.0.9.jar
commons-logging-1.1.1.jar
commons-beanutils-1.8.3.jar
c3p0-0.9.1.2.jar
2. 设计:
    1. 技术选型:Servlet+JSP+MySQL+JDBCTempleat+Duird+BeanUtilS+tomcat
    2. 数据库设计:
        create database day17; -- 创建数据库
        use day17;                -- 使用数据库

  create table user(   -- 创建表
            id int primary key auto_increment,
            name varchar(20) not null,
            gender varchar(5),
            age int,
            address varchar(32),
            qq    varchar(20),
            email varchar(50),
            username varchar(32),
            password varchar(32)
        );

insert into user(name,gender,age,address,qq,email,username,password) values
("张三","男",27,"广东","2345857","123@qq.com","zhangsan","123456"),
("李四","男",37,"北京","23458572","1223@qq.com","lisi","123456"),
("王五","男",29,"上海","2345817","1883@qq.com","wangwu","123456"),
("小七","女",22,"广东","2345257","1111@qq.com","xiaoqi","123456"),
("小九","女",23,"四川","23225257","x666@qq.com","xiaojiu","123456"),
("大九","女",23,"四川","23225257","d666@qq.com","dajiu","123456"),
("三九","女",23,"四川","23225257","s666@qq.com","sanjiu","123456"),
("四九","女",23,"四川","23225257","ss666@qq.com","sijiu","123456"),
("五九","女",23,"四川","23225257","w666@qq.com","wujiu","123456"),
("六九","女",23,"四川","23225257","l666@qq.com","liujiu","123456"),
("七九","女",23,"四川","23225257","q666@qq.com","qijiu","123456"),
("八九","女",23,"四川","23225257","b666@qq.com","bajiu","123456");

3. 开发:
    1. 环境搭建
        1. 创建数据库环境
        2. 创建项目,导入需要的jar包

    2. 编码

4. 测试
5. 部署运维

 视图资源

index.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="zh-CN">
  4. <head>
  5. <meta charset="utf-8"/>
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  7. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  8. <title>首页</title>
  9. <!-- 1. 导入CSS的全局样式 -->
  10. <link href="css/bootstrap.min.css" rel="stylesheet">
  11. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  12. <script src="js/jquery-2.1.0.min.js"></script>
  13. <!-- 3. 导入bootstrap的js文件 -->
  14. <script src="js/bootstrap.min.js"></script>
  15. <script type="text/javascript">
  16. </script>
  17. </head>
  18. <body>
  19. <div align="center">
  20. <a
  21. href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
  22. </a>
  23. </div>
  24. </body>
  25. </html>

list.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <!DOCTYPE html>
  4. <!-- 网页使用的语言 -->
  5. <html lang="zh-CN">
  6. <head>
  7. <!-- 指定字符集 -->
  8. <meta charset="utf-8">
  9. <!-- 使用Edge最新的浏览器的渲染方式 -->
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  11. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  12. width: 默认宽度与设备的宽度相同
  13. initial-scale: 初始的缩放比,为1:1 -->
  14. <meta name="viewport" content="width=device-width, initial-scale=1">
  15. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  16. <title>用户信息管理系统</title>
  17. <!-- 1. 导入CSS的全局样式 -->
  18. <link href="css/bootstrap.min.css" rel="stylesheet">
  19. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  20. <script src="js/jquery-2.1.0.min.js"></script>
  21. <!-- 3. 导入bootstrap的js文件 -->
  22. <script src="js/bootstrap.min.js"></script>
  23. <style type="text/css">
  24. td, th {
  25. text-align: center;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="container">
  31. <h3 style="text-align: center">用户信息列表</h3>
  32. <table border="1" class="table table-bordered table-hover">
  33. <tr class="success">
  34. <th>编号</th>
  35. <th>姓名</th>
  36. <th>性别</th>
  37. <th>年龄</th>
  38. <th>籍贯</th>
  39. <th>QQ</th>
  40. <th>邮箱</th>
  41. <th>操作</th>
  42. </tr>
  43. <c:forEach items="${users}" var="user" varStatus="s">
  44. <tr>
  45. <td>${s.count}</td>
  46. <td>${user.name}</td>
  47. <td>${user.gender}</td>
  48. <td>${user.age}</td>
  49. <td>${user.address}</td>
  50. <td>${user.qq}</td>
  51. <td>${user.email}</td>
  52. <%-- <td><a class="btn btn-default btn-sm" href="update.jsp">修改</a>&nbsp;--%>
  53. <td><a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/userFindServlet?name=${user.name}">修改</a>&nbsp;
  54. <a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/userDeleteServlet?name=${user.name}">删除</a></td>
  55. </tr>
  56. </c:forEach>
  57. <tr>
  58. <td colspan="8" align="center"><a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加联系人</a></td>
  59. </tr>
  60. </table>
  61. </div>
  62. </body>
  63. </html>

add.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!-- HTML5文档-->
  3. <!DOCTYPE html>
  4. <!-- 网页使用的语言 -->
  5. <html lang="zh-CN">
  6. <head>
  7. <!-- 指定字符集 -->
  8. <meta charset="utf-8">
  9. <!-- 使用Edge最新的浏览器的渲染方式 -->
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  11. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  12. width: 默认宽度与设备的宽度相同
  13. initial-scale: 初始的缩放比,为1:1 -->
  14. <meta name="viewport" content="width=device-width, initial-scale=1">
  15. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  16. <title>添加用户</title>
  17. <!-- 1. 导入CSS的全局样式 -->
  18. <link href="css/bootstrap.min.css" rel="stylesheet">
  19. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  20. <script src="js/jquery-2.1.0.min.js"></script>
  21. <!-- 3. 导入bootstrap的js文件 -->
  22. <script src="js/bootstrap.min.js"></script>
  23. </head>
  24. <body>
  25. <div class="container">
  26. <center><h3>添加联系人页面</h3></center>
  27. <form action="${pageContext.request.contextPath}/userAddServlet" method="post">
  28. <div class="form-group">
  29. <label for="name">姓名:</label>
  30. <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
  31. </div>
  32. <div class="form-group">
  33. <label>性别:</label>
  34. <input type="radio" name="gender" value="男" checked="checked"/>
  35. <input type="radio" name="gender" value="女"/>
  36. </div>
  37. <div class="form-group">
  38. <label for="age">年龄:</label>
  39. <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
  40. </div>
  41. <div class="form-group">
  42. <label for="address">籍贯:</label>
  43. <select name="address" class="form-control" id="address">
  44. <option value="广东">广东</option>
  45. <option value="广西">广西</option>
  46. <option value="湖南">湖南</option>
  47. </select>
  48. </div>
  49. <div class="form-group">
  50. <label for="qq">QQ:</label>
  51. <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
  52. </div>
  53. <div class="form-group">
  54. <label for="email">Email:</label>
  55. <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
  56. </div>
  57. <div class="form-group" style="text-align: center">
  58. <input class="btn btn-primary" type="submit" value="提交" />
  59. <input class="btn btn-default" type="reset" value="重置" />
  60. <input class="btn btn-default" type="button" value="返回" />
  61. </div>
  62. </form>
  63. </div>
  64. </body>
  65. </html>

update.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <!DOCTYPE html>
  4. <!-- 网页使用的语言 -->
  5. <html lang="zh-CN">
  6. <head>
  7. <%-- <base href="<%=basePath%>"/>--%>
  8. <!-- 指定字符集 -->
  9. <meta charset="utf-8">
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  11. <meta name="viewport" content="width=device-width, initial-scale=1">
  12. <title>修改用户</title>
  13. <link href="css/bootstrap.min.css" rel="stylesheet">
  14. <script src="js/jquery-2.1.0.min.js"></script>
  15. <script src="js/bootstrap.min.js"></script>
  16. </head>
  17. <body>
  18. <div class="container" style="width: 400px;">
  19. <h3 style="text-align: center;">修改联系人</h3>
  20. <form action="${pageContext.request.contextPath}/userUpdateServlet" method="post">
  21. <div class="form-group">
  22. <label for="name">姓名:</label>
  23. <input type="text" class="form-control" id="name" name="name" readonly="readonly" value="${user.name}" placeholder="${user.name}" />
  24. </div>
  25. <div class="form-group">
  26. <label>性别:</label>
  27. <input type="radio" name="gender" value="男" <c:if test="${user.gender=='男'}">checked</c:if>/>男
  28. <input type="radio" name="gender" value="女" <c:if test="${user.gender=='女'}">checked</c:if> />女
  29. </div>
  30. <div class="form-group">
  31. <label for="age">年龄:</label>
  32. <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄" value="${user.age}" />
  33. </div>
  34. <div class="form-group">
  35. <label for="address">籍贯:</label>
  36. <select id="address" name="address" class="form-control" >
  37. <option value="广东">广东</option>
  38. <option value="广西">广西</option>
  39. <option value="湖南">湖南</option>
  40. <option value="北京">北京</option>
  41. <option value="上海">上海</option>
  42. </select>
  43. </div>
  44. <div class="form-group">
  45. <label for="qq">QQ:</label>
  46. <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码" value="${user.qq}"/>
  47. </div>
  48. <div class="form-group">
  49. <label for="email">Email:</label>
  50. <input type="text" class="form-control" id="email" name="email" value="${user.email}" placeholder="请输入邮箱地址"/>
  51. </div>
  52. <div class="form-group" style="text-align: center">
  53. <input class="btn btn-primary" type="submit" value="提交" />
  54. <input class="btn btn-default" type="reset" value="重置" />
  55. <input class="btn btn-default" type="button" value="返回"/>
  56. </div>
  57. </form>
  58. </div>
  59. </body>
  60. </html>

login.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <!DOCTYPE html>
  3. <html lang="zh-CN">
  4. <head>
  5. <meta charset="utf-8"/>
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  7. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  8. <title>管理员登录</title>
  9. <!-- 1. 导入CSS的全局样式 -->
  10. <link href="css/bootstrap.min.css" rel="stylesheet">
  11. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  12. <script src="js/jquery-2.1.0.min.js"></script>
  13. <!-- 3. 导入bootstrap的js文件 -->
  14. <script src="js/bootstrap.min.js"></script>
  15. <script type="text/javascript">
  16. </script>
  17. </head>
  18. <body>
  19. <script>
  20. window.onload = function(){
  21. document.getElementById("img").onclick = function(){
  22. this.src="${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();
  23. }
  24. }
  25. </script>
  26. <div class="container" style="width: 400px;">
  27. <h3 style="text-align: center;">管理员登录</h3>
  28. <form action="${pageContext.request.contextPath}/loginServlet" method="post">
  29. <div class="form-group">
  30. <label for="user">用户名:</label>
  31. <input type="text" name="user" class="form-control" id="user" placeholder="请输入用户名"/>
  32. </div>
  33. <div class="form-group">
  34. <label for="password">密码:</label>
  35. <input type="password" name="password" class="form-control" id="password" placeholder="请输入密码"/>
  36. </div>
  37. <div class="form-inline">
  38. <label for="vcode">验证码:</label>
  39. <input type="text" name="verifycode" class="form-control" id="verifycode" placeholder="请输入验证码" style="width: 120px;"/>
  40. <a href="javascript:refreshCode()"><img id="img" src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/></a>
  41. </div>
  42. <hr/>
  43. <div class="form-group" style="text-align: center;">
  44. <input class="btn btn btn-primary" type="submit" value="登录">
  45. </div>
  46. </form>
  47. <!-- 出错显示的信息框 -->
  48. <div class="alert alert-warning alert-dismissible" role="alert">
  49. <button type="button" class="close" data-dismiss="alert" >
  50. <span>&times;</span></button>
  51. <strong>登录失败!</strong>
  52. <div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div>
  53. <div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div>
  54. </div>
  55. </div>
  56. </body>
  57. </html>

druid.properties        jdbc配置文件

  1. #driverClassName=com.mysql.jdbc.Driver
  2. driverClassName=com.mysql.cj.jdbc.Driver
  3. #url=jdbc:mysql:///day17
  4. url=jdbc:mysql:///db?serverTimezone=UTC
  5. username=root
  6. password=123456
  7. initialSize=5
  8. maxActive=10
  9. maxWait=3000

JDBCUtils        工具类

  1. /**
  2. * JDBC工具类 使用Durid连接池
  3. */
  4. public class JDBCUtils {
  5. private static DataSource ds ;
  6. static {
  7. try {
  8. //1.加载配置文件
  9. Properties pro = new Properties();
  10. //使用ClassLoader加载配置文件,获取字节输入流
  11. InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
  12. pro.load(is);
  13. //2.初始化连接池对象
  14. ds = DruidDataSourceFactory.createDataSource(pro);
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. /**
  22. * 获取连接池对象
  23. */
  24. public static DataSource getDataSource(){
  25. return ds;
  26. }
  27. /**
  28. * 获取连接Connection对象
  29. */
  30. public static Connection getConnection() throws SQLException {
  31. return ds.getConnection();
  32. }
  33. }

User类

  1. public class User {
  2. private int id;
  3. private String name;
  4. private String gender;
  5. private int age;
  6. private String address;
  7. private String qq;
  8. private String email;
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public String getGender() {
  22. return gender;
  23. }
  24. public void setGender(String gender) {
  25. this.gender = gender;
  26. }
  27. public int getAge() {
  28. return age;
  29. }
  30. public void setAge(int age) {
  31. this.age = age;
  32. }
  33. public String getAddress() {
  34. return address;
  35. }
  36. public void setAddress(String address) {
  37. this.address = address;
  38. }
  39. public String getQq() {
  40. return qq;
  41. }
  42. public void setQq(String qq) {
  43. this.qq = qq;
  44. }
  45. public String getEmail() {
  46. return email;
  47. }
  48. public void setEmail(String email) {
  49. this.email = email;
  50. }
  51. @Override
  52. public String toString() {
  53. return "User{" +
  54. "id=" + id +
  55. ", name='" + name + '\'' +
  56. ", gender='" + gender + '\'' +
  57. ", age=" + age +
  58. ", address='" + address + '\'' +
  59. ", qq='" + qq + '\'' +
  60. ", email='" + email + '\'' +
  61. '}';
  62. }
  63. }

UserDao 接口

  1. /**
  2. * 用户操作的DAO
  3. */
  4. public interface UserDao {
  5. public List<User> findAll();
  6. public User userAdd(User u);
  7. public String userDelete(String name);
  8. public Map<String, Object> userFind(String name);
  9. public boolean userUpdate(User user);
  10. }

UserDaoImpl        实现类

  1. public class UserDaoImpl implements UserDao {
  2. private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
  3. @Override
  4. public List<User> findAll() {
  5. //使用JDBC操作数据库...
  6. //1.定义sql
  7. String sql = "select * from user";
  8. List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
  9. return users;
  10. }
  11. @Override
  12. public Map<String, Object> userFind(String name) {
  13. String sql="select name,gender,age,address,qq,email from user where name = ?";
  14. Map<String, Object> map = template.queryForMap(sql, name);
  15. return map;
  16. }
  17. @Override
  18. public User userAdd(User adduser) {
  19. String sql = "insert into user (name,gender,age,address,qq,email) values(?,?,?,?,?,?)";
  20. template.update(sql, adduser.getName(),adduser.getGender(),adduser.getAge(),
  21. adduser.getAddress(),adduser.getQq(),adduser.getEmail());
  22. return null;
  23. }
  24. @Override
  25. public String userDelete(String name) {
  26. String sql="delete from user where name = ?";
  27. template.update(sql,name);
  28. return null;
  29. }
  30. @Override
  31. public boolean userUpdate(User user) {
  32. String sql = "update user set gender = ?,age=?,address=?,qq=?,email=? where name = ?";
  33. template.update(sql,user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getName());
  34. return true;
  35. }
  36. }

UserService 业务接口

  1. /**
  2. * 用户管理的业务接口
  3. */
  4. public interface UserService {
  5. /**
  6. * 查询所有用户信息
  7. * @return
  8. */
  9. public List<User> findAll();
  10. public User userAdd(User u);
  11. public String userDelete(String name);
  12. public Map<String, Object> userFind(String name);
  13. public boolean userUpdate(User user);
  14. }

UserServiceImpl       实现类

  1. public class UserServiceImpl implements UserService {
  2. private UserDao dao = new UserDaoImpl();
  3. @Override
  4. public List<User> findAll() {
  5. //调用Dao完成查询
  6. return dao.findAll();
  7. }
  8. @Override
  9. public User userAdd(User u) {
  10. return dao.userAdd(u);
  11. }
  12. @Override
  13. public String userDelete(String name) {
  14. return dao.userDelete(name);
  15. }
  16. @Override
  17. public Map<String, Object> userFind(String name) {
  18. return dao.userFind(name);
  19. }
  20. @Override
  21. public boolean userUpdate(User user) {
  22. return dao.userUpdate(user);
  23. }
  24. }

UserListServlet 查询所有

  1. @WebServlet("/userListServlet")
  2. public class UserListServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. //1.调用UserService完成查询
  5. UserService service = new UserServiceImpl();
  6. List<User> users = service.findAll();
  7. //2.将list存入request域
  8. request.setAttribute("users",users);
  9. //3.转发到list.jsp
  10. request.getRequestDispatcher("/list.jsp").forward(request,response);
  11. HttpSession session = request.getSession();
  12. Cookie c = new Cookie("JSESSIONID", session.getId());
  13. c.setMaxAge(60*30);
  14. response.addCookie(c);
  15. session.setAttribute("users",users);
  16. }
  17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. this.doPost(request, response);
  19. }
  20. }

UserAddServlet         添加联系人

  1. @WebServlet("/userListServlet")
  2. public class UserListServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. //1.调用UserService完成查询
  5. UserService service = new UserServiceImpl();
  6. List<User> users = service.findAll();
  7. //2.将list存入request域
  8. request.setAttribute("users",users);
  9. //3.转发到list.jsp
  10. request.getRequestDispatcher("/list.jsp").forward(request,response);
  11. HttpSession session = request.getSession();
  12. Cookie c = new Cookie("JSESSIONID", session.getId());
  13. c.setMaxAge(60*30);
  14. response.addCookie(c);
  15. session.setAttribute("users",users);
  16. }
  17. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  18. this.doPost(request, response);
  19. }
  20. }

UserDeleteServlet
 

  1. @WebServlet(name = "userAddServlet", value = "/userAddServlet")
  2. class UserAddServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. doPost(request, response);
  6. }
  7. @Override
  8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. request.setCharacterEncoding("utf-8");
  10. Map<String, String[]> map = request.getParameterMap();
  11. User u = new User();
  12. try {
  13. BeanUtils.populate(u,map);
  14. } catch (IllegalAccessException e) {
  15. e.printStackTrace();
  16. } catch (InvocationTargetException e) {
  17. e.printStackTrace();
  18. }
  19. UserServiceImpl service = new UserServiceImpl();
  20. service.userAdd(u);
  21. }
  22. }

UserFindServlet         查询单个联系人
 

  1. @WebServlet(name = "userFindServlet", value = "/userFindServlet")
  2. public class UserFindServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. doPost(request, response);
  6. }
  7. @Override
  8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. request.setCharacterEncoding("utf-8");
  10. String name = request.getParameter("name");
  11. //1.调用UserService完成查询
  12. HttpSession session = request.getSession();
  13. List<User> users =(List<User>) session.getAttribute("users");
  14. if (users != null){
  15. for (User u:users){
  16. if(name.equals(u.getName())){
  17. request.setAttribute("user",u);
  18. request.getRequestDispatcher("/update.jsp").forward(request,response);
  19. return ;
  20. }
  21. }
  22. }else{
  23. UserServiceImpl service = new UserServiceImpl();
  24. Map<String, Object> map = service.userFind(name);
  25. User user = new User();
  26. try {
  27. BeanUtils.populate(user,map);
  28. } catch (IllegalAccessException e) {
  29. e.printStackTrace();
  30. } catch (InvocationTargetException e) {
  31. e.printStackTrace();
  32. }
  33. request.setAttribute("user",user);
  34. request.getRequestDispatcher("/index.jsp").forward(request,response);
  35. }
  36. }
  37. }

UserUpdateServlet        修改联系人信息
 

  1. @WebServlet(name = "userUpdateServlet", value = "/userUpdateServlet")
  2. public class UserUpdateServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. doPost(request, response);
  6. }
  7. @Override
  8. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. request.setCharacterEncoding("utf-8");
  10. Map<String, String[]> map = request.getParameterMap();
  11. User u = new User();
  12. try {
  13. BeanUtils.populate(u,map);
  14. } catch (IllegalAccessException e) {
  15. e.printStackTrace();
  16. } catch (InvocationTargetException e) {
  17. e.printStackTrace();
  18. }
  19. UserServiceImpl service = new UserServiceImpl();
  20. service.userUpdate(u);
  21. request.getRequestDispatcher("/index.jsp").forward(request,response);
  22. }
  23. }

LoginServlet         登录        登录未连数据库,只有验证码刷新

  1. @WebServlet("/loginServlet")
  2. public class LoginServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. //1.设置request编码
  5. request.setCharacterEncoding("utf-8");
  6. //2.获取参数
  7. String username = request.getParameter("username");
  8. String password = request.getParameter("password");
  9. String checkCode = request.getParameter("checkCode");
  10. //3.先获取生成的验证码
  11. HttpSession session = request.getSession();
  12. String checkCode_session = (String) session.getAttribute("checkCode_session");
  13. //删除session中存储的验证码
  14. session.removeAttribute("checkCode_session");
  15. //3.先判断验证码是否正确
  16. if(checkCode_session!= null && checkCode_session.equalsIgnoreCase(checkCode)){
  17. //忽略大小写比较
  18. //验证码正确
  19. //判断用户名和密码是否一致
  20. if("zhangsan".equals(username) && "123".equals(password)){//需要调用UserDao查询数据库
  21. //登录成功
  22. //存储信息,用户信息
  23. session.setAttribute("user",username);
  24. //重定向到success.jsp
  25. response.sendRedirect(request.getContextPath()+"/success.jsp");
  26. }else{
  27. //登录失败
  28. //存储提示信息到request
  29. request.setAttribute("login_error","用户名或密码错误");
  30. //转发到登录页面
  31. request.getRequestDispatcher("/login.jsp").forward(request,response);
  32. }
  33. }else{
  34. //验证码不一致
  35. //存储提示信息到request
  36. request.setAttribute("cc_error","验证码错误");
  37. //转发到登录页面
  38. request.getRequestDispatcher("/login.jsp").forward(request,response);
  39. }
  40. }
  41. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  42. this.doPost(request, response);
  43. }
  44. }

CheckCodeServlet        验证码
 

  1. @WebServlet("/checkCodeServlet")
  2. public class CheckCodeServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. int width = 100;
  5. int height = 50;
  6. //1.创建一对象,在内存中图片(验证码图片对象)
  7. BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  8. //2.美化图片
  9. //2.1 填充背景色
  10. Graphics g = image.getGraphics();//画笔对象
  11. g.setColor(Color.PINK);//设置画笔颜色
  12. g.fillRect(0,0,width,height);
  13. //2.2画边框
  14. g.setColor(Color.BLUE);
  15. g.drawRect(0,0,width - 1,height - 1);
  16. String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
  17. //生成随机角标
  18. Random ran = new Random();
  19. StringBuilder sb = new StringBuilder();
  20. for (int i = 1; i <= 4; i++) {
  21. int index = ran.nextInt(str.length());
  22. //获取字符
  23. char ch = str.charAt(index);//随机字符
  24. sb.append(ch);
  25. //2.3写验证码
  26. g.drawString(ch+"",width/5*i,height/2);
  27. }
  28. String checkCode_session = sb.toString();
  29. //将验证码存入session
  30. request.getSession().setAttribute("checkCode_session",checkCode_session);
  31. //2.4画干扰线
  32. g.setColor(Color.GREEN);
  33. //随机生成坐标点
  34. for (int i = 0; i < 10; i++) {
  35. int x1 = ran.nextInt(width);
  36. int x2 = ran.nextInt(width);
  37. int y1 = ran.nextInt(height);
  38. int y2 = ran.nextInt(height);
  39. g.drawLine(x1,y1,x2,y2);
  40. }
  41. //3.将图片输出到页面展示
  42. ImageIO.write(image,"jpg",response.getOutputStream());
  43. }
  44. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  45. this.doPost(request,response);
  46. }
  47. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/805043
推荐阅读
相关标签
  

闽ICP备14008679号