毕设——EL表达式总结

前言

       时光飞逝,时隔半年感觉有很长很长的时间没有写博客,也感觉仿佛昨天才写完文章。这半年来收获颇多,无论是比赛中的获益还是生活中周围老师同学师兄的指导,一直以来正在慢慢的提升着自己的代码水平。逐渐的发现,代码早已成为一种习惯。目前已经步入大四的步伐,正在准备着自己大学生涯的最后一击:毕业设计。希望能以毕业设计为契机,多学技术,多写总结。将自己的大学所学总结在这字里行间之中。

       今天第一篇带来的是EL表达式——一个让人惊叹的技术!

EL表达式是什么?

EL(Expression Language)表达式语言,目的是替代JSP中复杂的代码

EL表达式语法

${变量名}

Example

    这个例子是截取自我自己毕设的一个小部分。采用JSP+Servlet+JavaBean MVC设计模式,目的是从数据库读取人员信息然后显示在JSP页面上,多说无益先上代码

实体类:User.java

package com;

/*
* 实体类
*
* */
public class User {

   
    /*small*/
    private String name;
    private String sex;
    private String age;
   

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }

    public User(  String name, String sex, String age) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        
    }

}

  JSP页面:main.jsp
 

<%--
  Created by IntelliJ IDEA.
  User: U87
  Date: 2018/11/7
  Time: 20:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page import="java.util.List"%>
<%@ page import="com.User" %>



    MainBase




<%--姓名:${u.name}--%>
    <%--JSP获取数据库数据--%>
    <%
        Object obj = request.getAttribute("userList");
        List userList = null;
        if(obj instanceof List){
            userList = (List)obj;
        }
        if(userList!=null){
            for(User user:userList){
                String userinfo = user.getName()+"---"+user.getAge();
                System.err.println("userinfo是"+userinfo);
    %>


        
<%=user.getName() %> <%=user.getSex() %> <%=user.getAge() %>
<% } } %>

  Servlet:

package Servlet;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.User;
import Dao.UserDAO;

/*
* Servlet
* */
public class LoginServlet extends HttpServlet{

    private static final long serialVersionUID = 1L;

    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //这里标注无论是Post方法还是Get方法 统统执行Post方法
        doPost(request, response);
    }


    /**
     *
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     *
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //这里是简单的登录操作 验证数据库用户名和密码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        User user=null;
        /*获取用户输入登录用户名和密码*/
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        UserDAO userDAO=new UserDAO();


            /*
         *
         * login()方法登录
         * */
            user=userDAO.login(username, password);

            if(user!=null){
                /*Dao层获取数据存入List中*/
                List userList =new ArrayList<>();

                /*
                 * GetPersonData()方法获得用户的基本信息
                 * */
                User u=userDAO.GetPersonData(username);

               
                    /*
                     * 将用户信息展示
                     * */
                    userList.add(u);
                    /*将Lst数据传入JSP页面*/
                    request.setAttribute("userList", userList);
                    request.getRequestDispatcher("main.jsp").forward(request, response);
               

                }

            }else{
                System.err.println("登录失败");
            }

        


    }

}

 这里将数据库连接的代码进行了封装 便于后面直接使用

 UserDao.java

package Dao;



import java.sql.*;
import java.util.ArrayList;

import com.User;
import Utils.JdbcUtils;

/*
*
*  封装数据库连接的基本操作
*
*  方法直接调用方法即可
* */

public class UserDAO {

   

    /*学员登录登录用户名密码查询*/
    public  User  login(String username,String password) {
        User u=null;
        Connection connection =null;
        PreparedStatement pstmt=null;
        PreparedStatement pstmt1=null;
        ResultSet resultSet=null;


        //赋值
        try {
            connection=JdbcUtils.getCon();
            //静态sql语句
            String sql = "select * from login where username=? and password=?";

            pstmt = (PreparedStatement) connection.prepareStatement(sql);
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            /*ExecuteQuery()是执行查询之后,返回值为查询内容*/
            resultSet = pstmt.executeQuery();

            if(resultSet.next()){

                u=new User();
                u.setUsername(resultSet.getString("username"));
                u.setPassword(resultSet.getString("password"));


            }else {

                System.out.println("用户名或者密码错误!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JdbcUtils.close(pstmt, connection);
        }
        return u;

    }


   
    

    /*获取数据库个人的所有字段信息*/
    public User GetPersonData(String school_number) {
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet rs= null;
        User user=null;

        try {
            connection = JdbcUtils.getCon();

            String sql  =" select * from personal where school_number=? ";
            ps = (PreparedStatement) connection.prepareStatement(sql);

            ps.setString(1, school_number);
            rs = ps.executeQuery();

            if (rs .next()) {

                /*
                * 取值
                * 
                * */
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                String age = rs.getString("age");
               
                user=new User(name,sex,age);


            }else {
                user=null;
                System.err.println("还没有录入数据");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            JdbcUtils.close(ps, connection);
        }
        return user;
    }

   
}

备注:这里的School_number和登录的username是同一个值 

数据库注册工具类:JdbcUtils.java

package Utils;


import java.sql.*;




public class JdbcUtils {
    //注册驱动的工具类

    private static String url = "这里填写你的数据库地址也就是:jdbc:mysql://localhost:端口号/数据库名称";

    private static String user = "数据库登录用户名";

    private static String  password = "数据库登录密码";

    private static String  driver ="com.mysql.jdbc.Driver";

    static{


        //注册驱动
        try {

            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }



    //获取连接对象
    public static Connection getCon() throws SQLException{
        Connection conn = null;

        conn = (Connection) DriverManager.getConnection(url, user, password);

        return  conn;
    }

    //关闭的方法
    public static void close(Statement statement, Connection conn){
        if(statement !=null){
            try {
                statement.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(conn !=null){
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }



}

运行代码可以很容易的得到用户的信息:姓名、性别、年龄

EL表达式的实战

       我们可以看到前面main.jsp中出现了大量的Java代码,虽然JSP允许我们在HTML中编写JAVA代码来完成一些逻辑的事务,但我们不提倡这样做。如果你的HTML中出现了大量JAVA代码的话 后期维护会变得异常困难 特别是你发现你每写一个<% { %>在后面某个地方你都得跟一个<% } %> 也对我们的效率大打折扣,那么有没有什么技术能够很顺利的解决这个问题呢? 答案肯定是我们的EL表达式。

       在上面的main.jsp中我们把原来写的java代码用EL表达式来替换



${u.name} ${u.sex} ${u.age}

  这里的name、sex、age对应User.java中写的名称

 再把Servlet中的语句做一些替换


            if(user!=null){
                /*Dao层获取数据存入List中*/
                List userList =new ArrayList<>();

                /*
                 * GetPersonData()方法获得用户的基本信息
                 * */
                User u=userDAO.GetPersonData(username);

               
                    /*
                     * 将用户信息展示
                     * */
                    userList.add(u);
                    /*将Lst数据传入JSP页面*/
                    request.setAttribute("u", u);
                    request.getRequestDispatcher("main.jsp").forward(request, response);
               

                }

            }else{
                System.err.println("登录失败");
            }

        

这里直接将我们获取数据的User 对象u直接传给Jsp页面即可

运行后你会发现同样是可以获取到数据的

就想问你EL表达式够不够狠???

把我们JSP之前写的JAVA代码 一个语句直接搞定,大大的减少了代码量,清晰可见 后期也很容易维护。

当然这里的${u.name}还有两种写法也是OK的

 //第一种
 ${u.name}
 //第二种
 ${requestScope.u.name}
 //第三种
 ${user["name"]}

这里要注意,如果属性中有特殊字符就要用[]的形式不能用.的形式

${user["AcceptLanguageMalformed"]}

前面我们的EL表达式是在request作用域中获得的数据,EL表达式会依次在page、request、session、application四个作用域中寻找数据。那么如果想在其他三个作用域session、page、application中获得值的话就要用每个作用域中对应的名称:

作用域 EL中表达式
page pageScope
request requestScope
session sessionScope
application applicationScope

EL表达式就总结在这里,下一次再讲解利用JSTL结合EL表达式 完全管理前端事务逻辑

你可能感兴趣的:(javaweb)