zoukankan      html  css  js  c++  java
  • java web

       

     

     一个服务器可以设置多个域名来访问  映射同一个IP  监听域名(主机)给出相应的格式

    获取字节码:

     内省:在运行时能够获取JavaBean当中的属性名称和get与set方法

    反射:

    动态获取的信息以及动态调用对象的方法  使用前必须获取字节码文件

    通过反射绕过集合泛型检测:

           内部实现       

     通过类的全名拿到字节码

    动态网页:由程序生成的网页——servlet生成

    什么是servlet?  

    在tomcat中运行的java程序

    <load-on-startup>  优先级

    //2.获取一些初始化参数 web.xml
    String value = config.getInitParameter("myxq");
    System.out.println("getInitParameter = "+value);
    
    web.xml:
    <init-param> <param-name>myxq</param-name> <param-value>123</param-value> </init-param>

    ServletContext:

    一个应用里只有一个ServletContext,里面封装的是web应用信息     一个应用可以创建多个Servlet  但任何一个Servlet拿到的ServletContext都是同一个

    服务器启动创建,关闭销毁

    子类复写config可能找不到

     ServletContext信息的写入与取出:

    写入一些信息到ServletContext:

    取出:

     ServletContext获取绝对地址与字节码目录:

    ServletContext context = this.getServletContext();

        拼接        文件在WebContent中

    String path = OneServlet.class.getClassLoader().getResource("c.txt").getPath();    //使用类加载器获取字节码的路径    文件在包中

     域对象:能够存储数据的对象

     

    Response:

    可设置,不设置会自动设置默认的

    设置response:

     设置重定向:    前提:response.setStatus(302);

     Response响应解决中文乱码问题:  response.setContentType("text/html;charset=UTF-8");

        文件在WebContent中

          

     读取多个字符: 

    读取图片:

    文件下载:

        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            /*******************1.接收请求参数***********************************/
            // 接收文件名参数
            String name = request.getParameter("filename");
            System.out.println(name);
            
            /*******************2.对接收的参数进行编码处理**************************/
            //获取参数  ,默认会对参数进行编码    ISO8859-1
            //把乱码转回二进制位
            byte[] bytes = name.getBytes("ISO8859-1");
            //再去使用UTF-8进行编码
            name = new String(bytes,"UTF-8");
            System.out.println(name);
            
            /*******************3.告诉浏览器响应的文件的类型*************************/
            // 根据文件名来获取mime类型
            String mimeType = this.getServletContext().getMimeType(name);
            // 设置 mimeType
            response.setContentType(mimeType);
            
            /*******************4.告诉浏览器以附件的形式下载*************************/        
            // 获取客户端信息
            String agent = request.getHeader("User-Agent");
            // 定义一个变量记录编码之后的名字
            String filenameEncoder = "";
            if (agent.contains("MSIE")) {
                // IE编码
                filenameEncoder = URLEncoder.encode(name, "utf-8");
                filenameEncoder = filenameEncoder.replace("+", " ");
            } else if (agent.contains("Firefox")) {
                // 火狐编码
                BASE64Encoder base64Encoder = new BASE64Encoder();
                filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(name.getBytes("utf-8")) + "?=";
            } else {
                // 浏览器编码
                filenameEncoder = URLEncoder.encode(name, "utf-8");
            }
            
            // 告诉浏览器是以附件形式来下载 不要解析
            response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
            
            /********************5.加载文件响应给浏览器*************************/
            // 拼接文件的路径
            String path = this.getServletContext().getRealPath("download/" + name);
            // 根据path加载文件
            FileInputStream in = new FileInputStream(path);
            // 获取响应的输出
            ServletOutputStream out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = in.read(buffer)) != -1) {
                // 写到响应当中
                out.write(buffer, 0, len);
            }
            // 关闭文件
            in.close();
        }
    dowmload

    注册验证码:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    
    <script type="text/javascript">
        function change(obj) {
            obj.src = "/26-Servlet/CheckCodeServlet?time=" + new Date().getTime();
        }
    </script>
    
    </head>
    <body>
    
    <form action="/26-Servlet/RegistServlet">
        <img src="/26-Servlet/CheckCodeServlet" onclick="change(this)"><br />
        <input type="text" placeholder="请输入验证码..."  name = "code"><br /><br /> 
        <input type="submit" value="注册">
    </form>
        
    
    </body>
    </html>
    html
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/CheckCodeServlet")
    public class CheckCodeServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        // 集合中保存所有成语
        private List<String> words = new ArrayList<String>();
    
        @Override
        public void init() throws ServletException {
            // 初始化阶段,读取new_words.txt
            // web工程中读取 文件,必须使用绝对磁盘路径
            String path = getServletContext().getRealPath("/WEB-INF/words.txt");
            try {
                BufferedReader reader = new BufferedReader(new FileReader(path));
                String line;
                //把读的成语全部添加到一个集合当中
                while ((line = reader.readLine()) != null) {
                    words.add(line);
                }
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 禁止缓存
            response.setHeader("Cache-Control", "no-cache");
            //设置过期时间为立即过期
            response.setDateHeader("Expires", 0);
            
            int width = 120;
            int height = 30;
            // 步骤一 绘制一张内存中图片
            BufferedImage bufferedImage = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            // 步骤二 图片绘制背景颜色 ---通过绘图对象
            Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
            // 绘制任何图形之前 都必须指定一个颜色
            graphics.setColor(getRandColor(200, 250));
            graphics.fillRect(0, 0, width, height);
            // 步骤三 绘制边框
            graphics.setColor(Color.WHITE);
            graphics.drawRect(0, 0, width - 1, height - 1);
            // 步骤四 四个随机数字
            Graphics2D graphics2d = (Graphics2D) graphics;
            // 设置输出字体
            graphics2d.setFont(new Font("宋体", Font.BOLD, 18));
            Random random = new Random();// 生成随机数
            int index = random.nextInt(words.size());
            String word = words.get(index);// 获得成语
            System.out.println(word);
            // 定义x坐标
            int x = 10;
            for (int i = 0; i < word.length(); i++) {
                // 随机颜色
                graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
                        .nextInt(110), 20 + random.nextInt(110)));
                // 旋转 -30 --- 30度
                int jiaodu = random.nextInt(60) - 30;
                // 换算弧度
                double theta = jiaodu * Math.PI / 180;
    
                // 获得字母数字
                char c = word.charAt(i);
    
                // 将c 输出到图片
                graphics2d.rotate(theta, x, 20);
                graphics2d.drawString(String.valueOf(c), x, 20);
                graphics2d.rotate(-theta, x, 20);
                x += 30;
            }
    
            // 将验证码内容保存session
            //request.getSession().setAttribute("checkcode_session", word);
            //把生成的验证码存放到全局域对象当中
            this.getServletContext().setAttribute("checkCode", word);
            // 步骤五 绘制干扰线
            graphics.setColor(getRandColor(160, 200));
            int x1;
            int x2;
            int y1;
            int y2;
            for (int i = 0; i < 30; i++) {
                x1 = random.nextInt(width);
                x2 = random.nextInt(12);
                y1 = random.nextInt(height);
                y2 = random.nextInt(12);
                graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
            }
            // 将上面图片输出到浏览器 ImageIO
            graphics.dispose();// 释放资源
            //将图片写到response.getOutputStream()中
            ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
        /**
         * 取其某一范围的color
         * 
         * @param fc
         *            int 范围参数1
         * @param bc
         *            int 范围参数2
         * @return Color
         */
        private Color getRandColor(int fc, int bc) {
            // 取其随机颜色
            Random random = new Random();
            if (fc > 255) {
                fc = 255;
            }
            if (bc > 255) {
                bc = 255;
            }
            int r = fc + random.nextInt(bc - fc);
            int g = fc + random.nextInt(bc - fc);
            int b = fc + random.nextInt(bc - fc);
            return new Color(r, g, b);
        }
    
    }
    CheckCodeServlet
    package com.it666.code;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/RegistServlet")
    public class RegistServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //接收请求参数
            String code = request.getParameter("code");
            System.out.println(code);
            
            byte[] bytes = code.getBytes("ISO8859-1");
            code = new String(bytes,"UTF-8");
            System.out.println(code);
            
            //取出一开始存放 的word
            String word = (String)this.getServletContext().getAttribute("checkCode");
            
            
            //设置字符集
            response.setContentType("text/html;charset=UTF-8");
            
            //两个做对比
            if(code.equals(word)) {
                response.getWriter().write("注册 成功 ");
            }else {
                response.getWriter().write("验证码错误  ");
                response.setHeader("refresh","3;url=/26-Servlet/code.html");
            }
            
        }
    
    }
    RegistServlet
    码蚁小强
    行尸走肉
    金蝉脱壳
    百里挑一
    金玉满堂
    背水一战
    霸王别姬
    天上人间
    不吐不快
    海阔天空
    情非得已
    满腹经纶
    兵临城下
    春暖花开
    插翅难逃
    黄道吉日
    天下无双
    偷天换日
    两小无猜
    卧虎藏龙
    珠光宝气
    簪缨世族
    花花公子
    绘声绘影
    国色天香
    相亲相爱
    八仙过海
    金玉良缘
    掌上明珠
    皆大欢喜
    逍遥法外
    生财有道
    极乐世界
    情不自禁
    愚公移山
    龙生九子
    精卫填海
    海市蜃楼
    高山流水
    卧薪尝胆
    壮志凌云
    金枝玉叶
    四海一家
    穿针引线
    无忧无虑
    无地自容
    三位一体
    落叶归根
    相见恨晚
    惊天动地
    滔滔不绝
    相濡以沫
    长生不死
    原来如此
    words

     Request:

    请求头:

    获取请求方式  get post:     request.getMethod();      GET

    请求资源 URL URI:

    • getRequestURL = http://localhost:8080/27-Request/RequestServlet
    • getRequestURI =/27-Request/RequestServlet

    获取get请求参数:request.getQueryString();

    当前web应用名称 :request.getContextPath();      getContextPath = /27-Request

    请求行:

    打印所有的请求头和请求头内容:

        Enumeration<String> headerNames2 = request.getHeaderNames();
            while(headerNames2.hasMoreElements()) {
                //获取请求名称
                String name = headerNames2.nextElement();       //获取所有的请求头名称
                String value = request.getHeader(name);        //根据名称获取指定的头信息
                System.out.println(name +":"+value);
            }    

    请求体:

    获取一个值:     request.getParameter("username");

    获取多个值:     request.getParameterValues("hobby");

    获取所有请求参数名称:

      Enumeration<String> parameterNames = request.getParameterNames();
            while(parameterNames.hasMoreElements()) {
                System.out.println("name="+parameterNames.nextElement());
            }

     获取所有请求参数:

      Map<String, String[]> parameterMap = request.getParameterMap();        //遍历所有请求参数名称与值
            for (Map.Entry<String, String[]> entry: parameterMap.entrySet()) {
                System.out.println(entry.getKey());
                System.out.println(Arrays.toString(entry.getValue()));
            }
        }

    通用方式解决乱码:

         String parameter = request.getParameter("username");
            System.out.println(parameter);              //打印乱码
            byte[] bytes = parameter.getBytes("ISO8859-1");    //转化为二进制位
            String str = new String(bytes,"UTF-8");
            System.out.println(str);                  //输出正常

    post方式设置编码;

            request.setCharacterEncoding("UTF-8");    //现在使用的提交方式  只适用post  get不能用也没有效果
            //获取所有的请求参数
            Map<String, String[]> allP = request.getParameterMap();
            for (Map.Entry<String, String[]> entry : allP.entrySet()) {
                System.out.println("-------");
                System.out.println(entry.getKey() +":"+Arrays.toString(entry.getValue()));
            }

     Request请求参数BeanUtils使用:      把获取的请求参数封装成对象    对象可以直接存到数据库

         Map<String, String[]> allP = request.getParameterMap();      
         User u = new User();
            try {
                BeanUtils.populate(u, allP);
            } catch (IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
            System.out.println(u);

    请求转发:      只需要发送一次请求  地址栏不变

    requeset域对象:

    request.setAttribute("lk", "it666");                  //创建
    String value = (String) request.getAttribute("lk");         //取出
    System.out.println(value);

    Cookie与Session会话:

    cookie:

    设置Cookie在客户端的存储时间:      cookie.setMaxAge(60);      删除为0

    创建Cookie      Cookie cookie = new Cookie("name","it666");

    响应给浏览器:      response.addCookie(cookie);

     通过Cookie获取上次访问时间:

            Date date = new Date();                            //获取当前的日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");    //new日期格式化器
            String formatDate = sdf.format(date);
            Cookie cookie = new Cookie("lastTime",formatDate);            //把日期写到cookie
            cookie.setMaxAge(60*10);                            //设置持久时间
            //响应给浏览器
            response.addCookie(cookie);
            String lastTime = null;
            //取cookie
            Cookie[] cookies = request.getCookies();
            if(cookies != null) {
                for (Cookie c : cookies) {
                    if(c.getName().equals("lastTime")) {
                        lastTime =  c.getValue();            //查找是否有lastTime的Cookie
                    }
                }
            }        
            response.setContentType("text/html;charset=utf-8");      //设置字符集编码
            if(lastTime != null) {
                response.getWriter().write("上次的登录时间为:"+lastTime);
            }else {
                response.getWriter().write("你是第一次登录 ");
            }

    Session:

     获取session对象:     HttpSession session = request.getSession();

     

    JsessioID持久化:      以Cookie形式写到浏览器    浏览器不会存sessionID

          Cookie cookie = new Cookie("JSESSIONID",session.getId());
            cookie.setPath("/29-Cookie-Seesion");
            cookie.setMaxAge(60*2);        //设置持久化时间
            response.addCookie(cookie);

    JSP:    

    java server page  java服务器页面  本质就是一个servlet

       一个

        多个

    out有自己的缓冲区,到最后拿到response缓冲区后面去。所以ddd是第一个。

    pageContext:

    可以向指定的其他域中存取数据:

    setAttribute(“name”,"lk",PageContext.REQUEST_SCOPE);
    
    getAttribute("lk",PageContext.REQUEST_SCOPE)

    可以获得其他8大隐式对象:

    pageContext.getRequest()
    
    pageContext.getSession()

    EL与JSTL

    EL:  取值

    从四大域当中取数据

    EL简写:

    依次从pageContext域,request域,session域,application域中 获取属性
    在某个域中获取后将不在向后寻找(从小到大,找到之后就不会再找了)

    EL执行表达式:内部可以进行运算,只要有结果

     ${1+1}

     ${empty user}

     ${user==null?true:false}

     JSTL:      业务逻辑

    jsp标准标签库

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

    <c:if test="${1==1 }">      
        <h1>myxq</h1>      //满足条件时,中间的内容才会显示出来
    </c:if>

    判断用户是否登陆:

                <c:if test="${empty user }">            //用户不存在
                        <a href="login.jsp">登录</a>
                    <a href="regist.jsp">免费注册</a>
                </c:if>
                 <c:if test="${!empty user }">          //用户存在
                       欢迎: ${user.username }    //可以省略get
                    <a href="#">退出</a>
                </c:if>

     普通循环:                   

                  

    javabean:里面有get、set方法的实体类    

    domain  一个类,符合javabean规范  是用户与数据库交互的核心中转站

  • 相关阅读:
    [css] BFC规则以及解决方法
    [css] 利用border制作三角型
    初学java注解编程 记录错误及解决办法
    springmvc 注解 配置文件解释
    log4net详解(转载)
    数据库的隔离级别
    Arcgis 几何网络分析
    Spring配置文件详解 – applicationContext.xml文件路径
    wpf 线程
    wpf 保存控件中的内容为图片格式
  • 原文地址:https://www.cnblogs.com/zhang1422749310/p/11057322.html
Copyright © 2011-2022 走看看