MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(2)

简介: MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)

生成验证码:

ImgServlet.java:

package cn.hncu.servlets;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 生成验证码!
 * ---4个随机数字,8条随机干扰线-数字,线的颜色随机
 * @author 陈浩翔
 * 2016-8-2
 */
public class ImgServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("imag/jpg");
        int width = 80;
        int height= 30;
        int lines = 8;
        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = img.getGraphics();
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("黑体", Font.BOLD, 18));
        long time = new Date().getTime();
        String realCode="";
        Random r = new Random(time);
        for(int i=0;i<4;i++){
            Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
            g.setColor(c);
            int y=r.nextInt(10);
            int a = r.nextInt(10);
            g.drawString(a+"",5+i*18,y+12);
            realCode+=a;
        }
        Cookie cook = new Cookie("realCode", realCode);
        cook.setMaxAge(60*60);
        cook.setPath(request.getContextPath());
        response.addCookie(cook);
        //request.getServletContext().setAttribute("realCode",realCode);
        //System.out.println("imgServlet:"+realCode);
        for(int i=0;i<lines;i++){
            Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
            g.setColor(c);
            g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
        }
        //刷入img对象
        g.dispose();
        ImageIO.write(img, "jpg", response.getOutputStream());
    }
}

LoginServlet.java:

package cn.hncu.servlets;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.Contact;
import cn.hncu.domain.User;
import cn.hncu.service.UserIService;
import cn.hncu.service.UserServiceImpl;
public class LoginServlet extends HttpServlet {
    //注入service
    UserIService service = new UserServiceImpl();
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //1、收集参数
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        String code = request.getParameter("code");
        String realCode="";
        Cookie[] cs = request.getCookies();
        for(Cookie c:cs){
            if(c.getName().equals("realCode")){
                realCode=c.getValue();
                break;
            }
        }
        //System.out.println("rc="+realCode);
        //判断验证码
        if(!code.equals(realCode)){
            response.getWriter().print("<h1>验证码错误!</h1>");
            return;
        }
        //2组织参数
        User user = new User();
        user.setName(name);
        user.setPwd(pwd);
        //3调用service层
        user = service.login(user);
        //System.out.println(user);
        //4根据service层的返回结果,导向不同的结果页面---直接到前台去防护了
        if(user==null){
            response.getWriter().print("<h1>用户名或密码错误!</h1>");
            return ;
        }
        //System.out.println(request.getLocalAddr());
        List<Contact> contacts = new ArrayList<Contact>();
        //通过user的uuid拿到所有的联系人
        contacts=service.getUserContacts(user.getUuid());
        request.getSession().setAttribute("contacts", contacts);
        request.getSession().setAttribute("user", user);
        request.getSession().setAttribute("userUuid",user.getUuid());
        request.getRequestDispatcher("/jsps/contacts.jsp").forward(request, response);
    }
}

contacts.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <c:if test="${empty sessionScope.user}">
        <c:redirect url="/index.jsp"></c:redirect>
    </c:if>
    <link rel="stylesheet" href='<c:url value="/css/table.css"></c:url>'>
    <script type="text/javascript" src='<c:url value="/js/contact.js"></c:url>'>
    </script>
    <script type="text/javascript">
        var path = '<c:url value="/" />';
    </script>
  </head>
  <body>
    <br/>
    <div>
        <button onclick="_add()">添加联系人</button> &nbsp;&nbsp;
        <button onclick="_del()">删除联系人</button> &nbsp;&nbsp;
        <button onclick="_query()">查询联系人</button>
    </div>
    <br/>
    <div>
    <table id="tb">
        <tr>
            <th>选择<input type="checkbox" id="parentChk" onclick="chk(this)"/></th>
            <th>姓名</th> 
            <th>年龄</th> 
            <th>电话</th>
            <th>ID</th>
        </tr>
        <c:forEach items="${contacts}" var="contact">
            <tr>
            <td><input type="checkbox" name="childChk"  onclick="subchk(this)" /></td>
            <td>${contact.name}</td>   
            <td>${contact.age}</td>    
            <td>${contact.tel}</td>
            <td>${contact.uuid}</td>
        </tr>
        </c:forEach>
    </table>
    <!-- 下面的form和iframe是用于做"_del()"功能的myAjax -->
    <form name="form" target="df" action='<c:url value="/DelServlet" ></c:url>' method="post">
        <input type="hidden" name="ids" id="ids" />
    </form>
    <iframe name="df" style="display: none;"></iframe>
    </div>
  </body>
</html>

contact.js:

function _add(){
    var url = path+"jsps/input.jsp";
    var result = window.showModalDialog(url,"","dialogWidth:400px;dialogHeight:300px;");
    if(result==null){
        return;
    }
    realadd(result);
}
function realadd(obj){
    var oTable = document.getElementById("tb");
    var oTr = oTable.insertRow();
    var oTd = oTr.insertCell();
    oTd.innerHTML='<input type="checkbox" name="childChk"  onclick="subchk(this)" /> ';
    oTr.insertCell().innerHTML=obj.name;
    oTr.insertCell().innerHTML=obj.age;
    oTr.insertCell().innerHTML=obj.tel;
    oTr.insertCell().innerHTML=obj.id; 
}
function chk(obj){
    //监听全部选择的那个复选框
    var allChildChks = document.getElementsByName("childChk");
    for(var i=0;i<allChildChks.length;i++){
        allChildChks[i].checked=obj.checked;
    }
}
function subchk(obj){
    //复选框监听
    if(obj.checked==false){
        document.getElementById("parentChk").checked=false;
    }else{
        var boo = true;
        var allChildChks = document.getElementsByName("childChk");
        for(var i=0;i<allChildChks.length;i++){
            if(allChildChks[i].checked == false ){
                boo=false;
                break;
            }
        }
        if(boo){
            document.getElementById("parentChk").checked=true;
        }
    }
}
function _del(){
    var ids ="";
    var oTable = document.getElementById("tb");
    var allChildChks = document.getElementsByName("childChk");
    for(var i=0;i<allChildChks.length;i++){
        if(allChildChks[i].checked==true){
            var id = oTable.rows[i+1].cells[4].innerHTML;
            if(ids==""){
                ids=id;
            }else{
                ids+=","+id;
            }
        }
    }
    //alert(ids);
    if(ids==""){
        alert("请选择要删除的行!");
    }else{
        document.getElementById("ids").value=ids;
        document.forms["form"].submit();
    }
}
//这里因为每个用户只能操坐自己的联系人。因此,当前用户操作时,没有其他用户对这些联系人进行增删改操作。
//如果要想多用户能够同时对同一集合联系人进行增删改查,那么每个增删改查的动作必须
//实时利用ajax向后台查询(在后台把结果放入list中,然后在前台利用<forEach>显示)
function realdel(boo){
    if(!boo){
        alert("很遗憾,删除失败了!");
        return;
    }
    var oTable = document.getElementById("tb");
    var allChildChks = document.getElementsByName("childChk");
    //因为allChiledChks的长度是随着删除而变短的,所以要用后面先删除、当然,可以从前面删除,不过要防范一下
    for(var i=allChildChks.length-1;i>=0;i--){
        if(allChildChks[i].checked == true){
            var oTr = oTable.rows[i+1];
            oTr.parentNode.removeChild(oTr);
        }
    }
    //对全选框设置为不打勾
    document.getElementById("parentChk").checked=false;
}
function _query(){
    var url = path+"jsps/query.jsp";
    var result = window.showModalDialog(url,"","dialogWidth:650px;dialogHeight:400px;");
    if(result==null){
        return;
    }
    realadd(result);
}

添加联系人和查询联系人页面:

image.png

image.png

总的来说,无论是设计模式,还是框架,其实都需要我们多去做做项目,自己多练习,只看书是远远不够的,需要自己动手才知道不足之处!

大家一起进步吧,O(∩_∩)O哈哈~

目录
相关文章
|
12天前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
|
4月前
|
前端开发 JavaScript API
Ajax技术的秘密揭秘:异步传输,高效交互
Ajax技术的秘密揭秘:异步传输,高效交互
|
4月前
|
XML JSON 前端开发
Ajax技术【Ajax技术详解、 Ajax 的使用、Ajax请求、 JSON详解、JACKSON 的使用 】(一)-全面详解(学习总结---从入门到深化)
Ajax技术【Ajax技术详解、 Ajax 的使用、Ajax请求、 JSON详解、JACKSON 的使用 】(一)-全面详解(学习总结---从入门到深化)
60 1
|
20天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。
|
25天前
|
前端开发 JavaScript
ajax框架格式,每个属性的作用
ajax框架格式,每个属性的作用
16 7
|
1月前
|
XML JSON 前端开发
ajax框架格式,每个属性的作用
ajax框架格式,每个属性的作用
13 2
|
2月前
|
XML 存储 JavaScript
DOM(文档对象模型):理解网页结构与内容操作的关键技术
**DOM摘要:**文档对象模型(DOM)是独立于语言的接口,用于访问和修改HTML或XML文档。HTML DOM用于HTML,XML DOM用于XML。示例展示了如何用JavaScript通过DOM获取和修改元素,如通过ID或标签名。XML DOM涉及加载XML文件或字符串,获取元素值。DOM节点包括文档、元素、文本等,通过属性(如nodeName, nodeValue)和方法(如getElementsByTagName, appendChild)操作。节点树结构允许遍历和修改文档结构。
48 2
DOM(文档对象模型):理解网页结构与内容操作的关键技术
|
2月前
|
XML 存储 JavaScript
深入学习 XML 解析器及 DOM 操作技术
所有主要的浏览器都内置了一个XML解析器,用于访问和操作XML XML 解析器 在访问XML文档之前,必须将其加载到XML DOM对象中 所有现代浏览器都有一个内置的XML解析器,可以将文本转换为XML DOM对象
72 0
|
2月前
|
数据采集 存储 JavaScript
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
|
4月前
|
JSON 前端开发 JavaScript
探秘 AJAX:让网页变得更智能的异步技术(下)
探秘 AJAX:让网页变得更智能的异步技术(下)
探秘 AJAX:让网页变得更智能的异步技术(下)