您现在的位置: 首页 > 微信营销 > 微商动态 > contextpath, javaWeb-7-EL表达式

contextpath, javaWeb-7-EL表达式

作者:   来源:  热度:0  时间:2020-08-01







什么是 EL 表达式,有何鸟用?1、EL 表达式的全称是:Expression Language。是表达式语言。 2、EL 表达式的什么作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp

什么是 EL 表达式,有何鸟?

1、EL 表达式的全称是:Expression Language。是表达式语言。 

2、EL 表达式的什么作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。 

3、因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。

%>    表达式脚本输出 key 的值是:        EL 表达式输出 key 的值是:${key1}

特点:

EL 表达式的格式是:${表达式} EL 表达式在输出 null 值的时候,输出的是空串。

jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。

EL 表达式搜索域数据的顺序

1、EL 表达式主要是在 jsp 页面中输出数据。 

2、主要是输出域对象中的数据。 

3、当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。

    //2    session.setAttribute ("key", "session");//3    一次会话结束(就是浏览器进入到关闭)    application.setAttribute ("key", "application");//4   服务器关闭或者重启,没有    pageContext.setAttribute ("key", "pageContext");//1       %>    ${ key }

EL 表达式输出 Bean ,数组,List ,Map 

Person类:

package com.bean;import lombok.Data;import java.util.List;import java.util.Map;@Datapublic class Person {    //其实访问进来的是get方法,而不是直接访问属性哦!    private String name;    private String[] phones;    private List cities;    private Map map;}

jsp:

    person.setName ("阿坤哥好帅!");    person.setPhones (new String[]{"18888888888", "18777777777", "18699998888"});    List cities = new ArrayList ( );    cities.add ("北京");    cities.add ("上海");    cities.add ("深圳");    cities.add ("广州");    person.setCities (cities);    Map map = new HashMap ( );    map.put ("key1", "value1");    map.put ("key2", "value2");    map.put ("key3", "value3");    person.setMap (map);    pageContext.setAttribute ("p", person);%>    输出 Person:${p}    输出 Person 的 name 属性:${p.name}     输出 Person 的 pnones 数组属性值:${p.phones[2]}     输出 Person 的 cities 集合中的元素值:${p.cities}     输出 Person 的 List 集合中个别元素值:${p.cities[2]}    输出 Person 的 Map 集合: ${p.map}     输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} 

EL 表达式——运算

语法:${ 运算表达式 } , EL 表达式支持如下运算符:

1、关系运算

关系运算符案例结果
== eq等于${ 5 == 5 } ${ 5 eq 5 }true
!= ne不等于${ 5 !=5 } ${ 5 ne 5 }false
font-family:宋体;color:rgb(0,0,0);">或 lt小于${ 3 font-family:宋体;color:rgb(0,0,0);">或 ${ 3 lt 5 }true
> gt大于${ 2 > 10 } ${ 2 gt 10 }false
font-family:宋体;color:rgb(0,0,0);">或 le小于等于${ 5 font-family:宋体;color:rgb(0,0,0);">或 ${ 5 le 12 }true
>= ge大于等于${ 3 >= 5 } ${ 3 ge 5 }false

2、逻辑运算

逻辑运算符案例结果
&& and与运算${ 12 == 12 && 12 font-family:宋体;color:rgb(0,0,0);">或 ${ 12 == 12 and 12 ">true
|| or或运算${ 12 == 12 || 12 font-family:宋体;color:rgb(0,0,0);">或 ${ 12 == 12 or 12 ">false
! not取反运算 ${ !true } 或 ${not true } false

3、算数运算

算数运算符案例结果

empty 运算

empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false

以下几种情况为空: 

                                      1、值为 null 值的时候,为空 

                                      2、值为空串的时候,为空 

                                      3、值是 Object 类型数组,长度为零的时候 

                                      4list 集合,元素个数为零 5map 集合,元素个数为零

    // 2、值为空串的时候,为空    request.setAttribute("emptyStr", "");    // 3、值是 Object 类型数组,长度为零的时候    request.setAttribute("emptyArr", new Object[]{});    //4、list 集合,元素个数为零    List list = new ArrayList ();    list.add("abc"); request.setAttribute("emptyList", list);    // 5、map 集合,元素个数为零    Map map = new HashMap ();    map.put("key1", "value1"); request.setAttribute("emptyMap", map);%>    ${ empty emptyNull } //true    ${ empty emptyStr } //true    ${ empty emptyArr } //true    ${ empty emptyList } //false    ${ empty emptyMap } //false

三元运算

表达式 1?表达式 2:表达式 3 如果表达式 

1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。

${ 12 != 12 ? "坤哥帅呆了":"坤哥不切实际" }

.点运算 和 [] 中括号运算符 

.点运算,可以输出 Bean 对象中某个属性的值。 

[]中括号运算,可以输出有序集合中某个元素的值。 

并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。

String,Object> map = new HashMap ();    map.put("a.a.a", "aaaValue");    map.put("b+b+b", "bbbValue");    map.put("c-c-c", "cccValue");    request.setAttribute("map", map);%>    ${ map['a.a.a'] }     ${ map["b+b+b"] }     ${ map['c-c-c'] } 

EL 表达式的 11 个隐含对象

EL 获取四个特定域中的属性

    request.setAttribute ("key2", "request");    session.setAttribute ("key2", "session");    application.setAttribute ("key2", "application");%>    ${ applicationScope.key2 }

pageContext 对象的使用

1. 协议: 

2. 服务器 ip: 

3. 服务器端口: 

4. 获取工程路径: 

5. 获取请求方法: 

6. 获取客户端 ip 地址: 

7. 获取会话的 id 编号:

    %>        1.协议:${ req.scheme }    2.服务器 ip:${ pageContext.request.serverName }    3.服务器端口:${ pageContext.request.serverPort }    4.获取工程路径:${ pageContext.request.contextPath }    5.获取请求方法:${ pageContext.request.method }    6.获取客户端 ip 地址:${ pageContext.request.remoteHost }    7.获取会话的 id 编号:${ pageContext.session.id }

EL 表达式其他隐含对象的使用

param Map 它可以获取请求参数的值 

paramValues Map 它也可以获取请求参数的值,获取多个值的时候使用。

header Map 它可以获取请求头的信息 

headerValues Map 它可以获取请求头的信息,它可以获取多个值的情况

cookie Map 它可以获取当前请求的 Cookie 信息

    输出请求参数 username 的值:${ param.username }     输出请求参数 password 的值:${ param.password }     输出请求参数 username 的值:${ paramValues.username[0] }     输出请求参数 hobby 的值:${ paramValues.hobby[0] }     输出请求参数 hobby 的值:${ paramValues.hobby[1] }     输出请求头【User-Agent】的值:${ header['User-Agent'] }     输出请求头【Connection】的值:${ header.Connection }     输出请求头【User-Agent】的值:${ headerValues['User-Agent'][0] }//如果只有一个值用上面比较方便        获取 Cookie 的名称:${ cookie.JSESSIONID.name }     获取 Cookie 的值:${ cookie.JSESSIONID.value } 

请求地址:

http://127.0.0.1:8080/servlet_03/f.jsp?username=wzg168&password=666666&hobby=java&hobby=cpp

initParam Map 它可以获取在 web.xml 中配置的上下文参数

web.xml:

          username         root                   url         jdbc:mysql:///test     

jsp:

  输出<Context-param>username 的值:${ initParam.username }    输出<Context-param>url 的值:${ initParam.url } 

作为一名菜狗,本人的原则向来是能不动手绝不动手,因此Ajax这个技术一直是既熟悉又陌生,由于项目需要做专题图请求,因此不得不学一下他了。今天首先来学一下原生Ajax的GET请求。

首先创建一个JSP页面用于发送和接受信息,主要功能为用户登录:

直接上代码:

index.jsp

page contentType="text/html;charset=UTF-8" language="java" %>      项目登录          //js的登录方法      function login(){        //使用Ajax向servlet发送get请求        //1.获取表单的数据        var username = document.getElementById("username").value;        var password = document.getElementById("password").value;        //2.拼接表单数据        var params = "username="+username+"&password="+password;        console.log(params);        //3.url        var url = "${pageContext.request.contextPath}/loginServlet?"+params        console.log(url);        //4.使用Ajax发送get请求        //4.1创建一个请求对象        var request = new XMLHttpRequest();        //4.2调用get请求的方法        request.open("get",url,true);//使用get请求,true表示异步请求        request.send();        request.onreadystatechange = function () {          console.log("准备状态码-"+request.readyState+":响应状态码"+request.status)          if(request.readyState==4 &&request.status==200){            var rspText = request.responseText;            console.log(rspText)            //获取span标签            var tipTag = document.getElementById("tip")            if(rspText=="success"){              tipTag.innerHTML = "登录成功"            }else{              tipTag.innerHTML = "登录失败"            }          }        }      }    非异步请求                              ------------------------------------------------异步请求                              style="color: red" id = "tip">   

servlet代码为:

package nefu.edu.servlet;import com.alibaba.fastjson.JSON;import com.fasterxml.jackson.databind.ObjectMapper;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.io.IOException;import java.util.HashMap;import java.util.Map;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {        //1. 获取请求参数        String username = req.getParameter("username");        String password = req.getParameter("password");        Map map = new HashMap();        //2.判断是否登录成功        if("zwt".equals(username)&&"123".equals(password)){            resp.getWriter().write("success");        }else {            resp.getWriter().write("failure");        }    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req,resp);    }}

ajax的主要流程为:

  1. 在准备好请求的servlet的URL之后,客户端创建一个ajax请求(new XMLHttpRequest()),打开一个ajax连接(opensend)。

  2. 服务器端接收到请求后进行表单处理并将结果发送给客户端。

  3. 客户端通过异步监听(request.onreadystatechange),根据处理状态进行数据处理。

实现了一个图片验证码的功能,demo如图所示

1.登录页面的jsp和js

2.验证码图片的实体类

3.生成验证码图片的servlet

4.处理登录请求的servlet

先看jsp代码:

一进入页面,就会生成一张验证码图片,因为写了 src=""调用生成验证码图片的servlet;

然后点击图片会触发js方法,会重新调用生成验证码图片的servlet生成一张验证码图片;

点击登录,调用处理登录的servlet比较用户名密码和验证码是否正确。

            用户名        /div>            密码                                                          登录    

/* 点击刷新验证码 */function changeCode(){    var src = "http://localhost:8080/javawebchatroom/"    $('.verifyCode').attr("src",src);}

然后看下验证码图片的实体类

设置了一些参数,例如字体设置、内容组合、旋转角度、干扰线、噪点等

package com.vo;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.util.Random;/*对图片进行处理的类和方法*/public class VerifyCode {  public static String drawRandomText(int width, int height, BufferedImage verifyImg) {    Graphics2D graphics = (Graphics2D) verifyImg.getGraphics();    graphics.setColor(Color.WHITE);// 设置画笔颜色-验证码背景色    graphics.fillRect(0, 0, width, height);// 填充背景    graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));    // 数字和字母的组合    String baseNumLetter = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";    StringBuffer sBuffer = new StringBuffer();    int x = 10; // 旋转原点的 x 坐标    String ch = "";    Random random = new Random();    for (int i = 0; i  i++) {      graphics.setColor(getRandomColor());      // 设置字体旋转角度      int degree = random.nextInt() % 30; // 角度小于30度      int dot = random.nextInt(baseNumLetter.length());      ch = baseNumLetter.charAt(dot) + "";      sBuffer.append(ch);      // 正向旋转      graphics.rotate(degree * Math.PI / 180, x, 45);      graphics.drawString(ch, x, 45);      // 反向旋转      graphics.rotate(-degree * Math.PI / 180, x, 45);      x += 48;    }    // 画干扰线    for (int i = 0; i  i++) {      // 设置随机颜色      graphics.setColor(getRandomColor());      // 随机画线      graphics.drawLine(random.nextInt(width), random.nextInt(height),          random.nextInt(width), random.nextInt(height));    }    // 添加噪点    for (int i = 0; i  i++) {      int x1 = random.nextInt(width);      int y1 = random.nextInt(height);      graphics.setColor(getRandomColor());      graphics.fillRect(x1, y1, 2, 2);    }    return sBuffer.toString();  }  /**   * 随机取色   */  private static Color getRandomColor() {    Random ran = new Random();    Color color = new Color(ran.nextInt(256),        ran.nextInt(256), ran.nextInt(256));    return color;  }}

再看生成验证码图片的servlet

以图片流的形式直接输出到前台,并将验证码内容进行了储存(此处储存在session里的,真正用的时候可以储存在redis里或者其他地方里)

package com.action;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;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 com.vo.VerifyCode;@WebServlet("/YanzhengServlet")public class YanzhengServlet extends HttpServlet {  private static final long serialVersionUID = 1L;  public YanzhengServlet() {    super();  }  protected void doGet(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {    /**     * 验证码     */    try {      System.out.println("验证码");      int width = 200;      int height = 69;      BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);      // 生成对应宽高的不带透明色初始图片      String randomText = VerifyCode.drawRandomText(width, height, verifyImg);      // 单独的一个类方法,出于代码复用考虑,进行了封装。      // 功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符      request.getSession().setAttribute("verifyCode", randomText);      response.setContentType("image/png");// 必须设置响应内容类型为图片,否则前台不识别      OutputStream os = response.getOutputStream(); // 获取文件输出流      ImageIO.write(verifyImg, "png", os);// 输出图片流      os.flush();      os.close();// 关闭流    } catch (IOException e) {      e.printStackTrace();    }  }  protected void doPost(HttpServletRequest request, HttpServletResponse response)      throws ServletException, IOException {    doGet(request, response);  }}

然后就是UserServlet处理登录请求了

比较用户名密码和验证码对不对。我们就贴下验证码比较的就行了。

public String login(HttpServletRequest req,HttpServletResponse resp){    // 接收数据    String inputcode = req.getParameter("verifyInput");    String code = (String) req.getSession().getAttribute("verifyCode");    try {      if(!(inputcode.equals(code))){        req.setAttribute("error", "验证码错误!");        return "/login.jsp";      }        return null;  }

至此,验证码图片就实现了,还是比较简单的。

之后有时间出个短信验证码注册或登录的吧,这个需要去阿里云申请下短信接口噢。

转载请注明出处:contextpath, javaWeb-7-EL表达式 :http://www.36duweixin.com/marketing/211159.html
  • 登录

    使用微信帐号直接登录,无需注册