一个服务器可以设置多个域名来访问 映射同一个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中
读取多个字符:
读取图片:
文件下载:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(); }
注册验证码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!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>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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"); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
码蚁小强
行尸走肉
金蝉脱壳
百里挑一
金玉满堂
背水一战
霸王别姬
天上人间
不吐不快
海阔天空
情非得已
满腹经纶
兵临城下
春暖花开
插翅难逃
黄道吉日
天下无双
偷天换日
两小无猜
卧虎藏龙
珠光宝气
簪缨世族
花花公子
绘声绘影
国色天香
相亲相爱
八仙过海
金玉良缘
掌上明珠
皆大欢喜
逍遥法外
生财有道
极乐世界
情不自禁
愚公移山
龙生九子
精卫填海
海市蜃楼
高山流水
卧薪尝胆
壮志凌云
金枝玉叶
四海一家
穿针引线
无忧无虑
无地自容
三位一体
落叶归根
相见恨晚
惊天动地
滔滔不绝
相濡以沫
长生不死
原来如此
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规范 是用户与数据库交互的核心中转站