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规范  是用户与数据库交互的核心中转站

原文地址:https://www.cnblogs.com/zhang1422749310/p/11057322.html