验证码案列

昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键。这两个键搞混了,所以获取不到验证码。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title> <script>
window.onload = function(){
document.getElementById("img").onclick = function(){
this.src="/day14/checkCodeDemo4?time="+new Date().getTime();
}
} </script>
<style>
div{
color: red;
} </style>
</head>
<body> <form action="/day14/loginServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>验证码</td>
<td><input type="text" name="checkCode"></td>
</tr>
<tr>
<td colspan="2"><img id="img" src="/day14/checkCodeDemo4"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table> </form> <div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div>
<div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div> </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> <h1><%=request.getSession().getAttribute("user")%>,欢迎您</h1> </body>
</html>
package com.data;

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;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; @WebServlet("/checkCodeDemo4")
public class checkCode extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width = 100;
int height = 50;
//创建对象,该对象可以在内存中生成图片
//BufferedImage是Image的一个子类,Image和BufferedImage的主要作用就是将一副图片加载到内存中。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//这个类第一次接触,好陌生,好抽象
//图片加载进内存了,就尽情的虐待他吧
//美化图片
//填充背景色
Graphics g = image.getGraphics();
g.setColor(Color.PINK);
g.fillRect(0,0,width,height);
//画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 写验证码
Random ran = new Random();
StringBuilder sb = new StringBuilder();//初始容量为16字节
//随机生成4个字符
for(int i = 1;i<=4;i++){
int index = ran.nextInt(str.length());
char ch = str.charAt(index);
sb.append(ch);//这个方法可以接收任意类型的数据
g.drawString(ch+"",width/5*i,height/2);//ch代表要绘制的字符,x,y代表绘制的坐标
}
String value_checkCode_session = sb.toString();//把字符变成字符串
System.out.println(value_checkCode_session);
//创建对象,使用方法将验证码存入session
req.getSession().setAttribute("key_checkCode_session",value_checkCode_session);//把数据放入共享域
g.setColor(Color.GREEN);//线条的颜色
//画10条干扰线
for (int i = 0 ; i< 10 ;i++){
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width); int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1,y1,x2,y2);//参数是坐标
} //将图片输出到页面上
ImageIO.write(image,"jpg",resp.getOutputStream()); }
}
package com.data;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; @WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//根据键获取值
String username = request.getParameter("username");
String password = request.getParameter("password");
String checkCode = request.getParameter("checkCode");//这里的checkCode是用户输入的验证码
//要先看看获取的验证码是否正确
//先得取得内存中生成的验证码,
HttpSession session = request.getSession();//创建HttpSession对象
String checkCode1 = (String)session.getAttribute("key_checkCode_session");//这里的checkCode是内存中获得的验证码
//把获得的验证码删除,确保只使用一次
session.removeAttribute("checkCode_session");
//判断验证码是否正确,忽略大小写
if(checkCode1!=null&&checkCode1.equalsIgnoreCase(checkCode)){
//验证码正确
//判读用户名和密码是否一致
if("zhangsan".equals(username)&&"123".equals(password)){
//存储信息,
session.setAttribute("user",username);
//重定向到success.jsp页面
response.sendRedirect(request.getContextPath()+"/success.jsp"); }else{
//储存信息到request
request.setAttribute("login_error","用户名或密码错误");
//转发都登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
} else{
//验证码不一致
//存储提示信息到request
request.setAttribute("cc_error","验证码错误,请重试");
//转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
} } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
JSP:

1.指令

作用:用于配置JSP页面,导入资源文件

格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ...%>

指令分类:

1.page :配置JSP页面的

  • contentType:等同于response.setContentType(),设置响应体的mime类型
  • import:导包
  • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
  • isErrorPage:标识当前是否是错误页面,true,是,可以使用内置对象exception,false:否,默认值,不可以设置内置对象exception

2.include:页面包含的,导入页面的资源文件

  • <% @include file="要导入的资源文件名称"%>

3.taglib :导入资源

  • <%@ taglib prefix="c" uri="文件的地址" %>
  • prefix :前缀,自定义的

2.注释:

  • html注释:只能注释html代码片段
  • jsp注释:<%-- --%>可以注释所有
3.内置对象

在jsp页面中不需要创建,直接使用的对象,一共有9个

变量名 真实类型 作用
pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
request HttpServletRequest 一次请求访问的多个资源
session HttpSession 一次会话的多个请求间
application ServletContext 所有用户间共享数据
response HttpServletResponse 响应对象
page Object 当前页面的对象
out jspWriter 输出对象,数据输出到页面上
config ServletConfig Servlet的配置对象
exception Throwable 异常对象
MVC:开发模式 模型视图控制器

M:Model,模型。JavaBean,完成具体的业务操作,如,查询数据库,封装对象

V:view,视图,JSP,展示数据

C:Controller,控制器。Servlet,获取用户输入,调用模型,将数据交给视图进行展示

EL表达式:

1.概念:Expression Language 表达式语言

2.作用:替换和简化jsp页面中java代码的编写

3.语法:${表达式}

4.注意:jsp默认支持el表达式,浏览器会解析el表达式,如果让浏览器忽略jsp页面中所有的el表达式可以设置jsp中page指令中:isELIgnored="true"会 忽略当前jsp页面中所有的el表达式,或者使用${表达式}:会忽略当前这个el表达式。

EL_表达式获取域中的值

1.el表达式只能从域对象中获取值

2.语法:

  1. ${域名称.键名}:从指定域中获取指定键的值

    • 有四种域
    • 1.pageScope 2.requestScope 3.sessionScope 4.applicationScope
  2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,知直到找到为止,如果域有多个同名的键,则从小范围的域开始找起。
获取对象,List集合,Map集合的值

对象格式:${域名称.键名.属性名}

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

Map集合格式:${域名称.键名.key名称}或者${域名称.键名["key名称"]}

package com.data.jsp;
import java.text.SimpleDateFormat;
import java.util.Date; public class User {
private String name;
private int age;
private Date birthday;
//逻辑视图
//需要显示年月日的日期格式需要创建一个方法
public String getBirStr(){
//格式化日期
if(birthday !=null){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//返回字符串
return sdf.format(birthday);
}else{
return "";
}
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
<%@ page import="com.data.jsp.User" %>
<%@ page import="java.util.*" %><%--
Created by IntelliJ IDEA.
User: Yuan
Date: 2019/6/11
Time: 18:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--给User设置值--%>
<%
User user = new User();
user.setName("张三");
user.setAge(23);
user.setBirthday(new Date());
// 共享域
request.setAttribute("u",user);
//创建List集合
List list = new ArrayList();
list.add("云想衣裳花想容");
list.add("春风扶槛露华浓");
// 添加对象进去看看
list.add(user);
request.setAttribute("list",list); //创建Map集合
Map map = new HashMap();
map.put("sname","李四");
map.put("gender","男");
//添加用户进去看看
map.put("user",user);
request.setAttribute("map",map);
%>
<h3>el获取对象中的值</h3>
<%--获取对象的值需要通过对象的方法来获取--%>
<%--setter或getter方法,去掉set或get,在将剩余部分,首字母变小写--%>
${requestScope.u.name}<br>
${requestScope.u.age}<br>
${requestScope.u.birthday}<br>
${requestScope.u.birStr}<br>
<h3>el获取List集合中的值</h3>
${requestScope.list}<br><%--获取的是整个集合--%>
${requestScope.list[0]}<br>
${requestScope.list[1]}<br>
${requestScope.list[2].name}<br>
${requestScope.list[2].age}<br>
<h3>el获取Map集合中的值</h3>
${requestScope.map}<br>
${requestScope.map.sname}<br>
${requestScope.map.gender}<br>
${requestScope.map.user.name}<br>
</body>
</html>

空运算符:empty

功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0

格式:{empty list}

3.隐式对象:

el表达式中有11个隐式对象

pageContext:获取jsp其他八个内置对象

${pageContext.request.contextPath}:动态获取虚拟目录

笔记-JavaWeb学习之旅13的更多相关文章

  1. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  2. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  3. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  4. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

  5. 笔记-JavaWeb学习之旅17

    1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...

  6. 笔记-JavaWeb学习之旅16

    增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...

  7. 笔记-JavaWeb学习之旅15

    Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...

  8. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

  9. 笔记-JavaWeb学习之旅10

    Servlet server applet运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到的规则(Java类重写这个接口,就可以被浏览器(tomcat)识别) Ser ...

随机推荐

  1. [Phoenix] 七、如何使用自增ID

    摘要: 在传统关系型数据库中设计主键时,自增ID经常被使用.不仅能够保证主键的唯一,同时也能简化业务层实现.Phoenix怎么使用自增ID,是我们这篇文章的重点. 在传统关系型数据库中设计主键时,自增 ...

  2. mac下使用gnu gcc

    1 mac下安装gnu gcc brew search gcc brew install gcc@6 2 mac下编写c/c++代码所需的标准库和头文件 2.1 标准c++的库的头文件都是标准化了的, ...

  3. IP address could not be resolved: Name or service not known

    [root@test ~]# /usr/local/mysql/bin/mysqld2018-08-05T07:00:33.647509Z 0 [Warning] [MY-011070] [Serve ...

  4. the ACID properties of HBase

    http://hbase.apache.org/acid-semantics.html Apache HBase (TM) is not an ACID compliant database. How ...

  5. 浏览器访问配置完成的ftp服务器

    在浏览器的地址栏输入: ftp://testuser:testuser@192.168.10.4 testuser 是ftp的用户名和密码: 192.168.10.4 是ftp服务器的IP地址. 亲测 ...

  6. Flyweight Pattern

    1.Flyweight 模式以共享的方式高效的支持大量的细粒度对象,对象分为内部状态.外部状态.将可以被共享的状态作为内部状态存储在对象中,而外部状态在适当的时候作为参数传递给对象. 当以下所有的条件 ...

  7. Dynamic Web Module to 3.0 报错

    一.问题 使用maven项目创建的webapp项目Dynamic Web Module 默认是2.3. 当我们要切换到3.0的时候出现这个错误. 二.解决 1.点击进入Navigator view ( ...

  8. LightOJ1220 —— 质因数分解

    题目链接:https://vjudge.net/problem/LightOJ-1220 1220 - Mysterious Bacteria    PDF (English) Statistics ...

  9. this.triggerEvent()用法

    在对组件进行封装时 在当前页面想要获取组件中的某一状态,需要使用到this.triggerEvent(' ',{},{}),第一个参数是自定义事件名称,这个名称是在页面调用组件时bind的名称,第二个 ...

  10. 使用eclipse的SVN连接码云

    码云配置: 码云的项目上,启用SVN访问 eclipse的配置,不配置这个会报错