时光飞逝,时隔半年感觉有很长很长的时间没有写博客,也感觉仿佛昨天才写完文章。这半年来收获颇多,无论是比赛中的获益还是生活中周围老师同学师兄的指导,一直以来正在慢慢的提升着自己的代码水平。逐渐的发现,代码早已成为一种习惯。目前已经步入大四的步伐,正在准备着自己大学生涯的最后一击:毕业设计。希望能以毕业设计为契机,多学技术,多写总结。将自己的大学所学总结在这字里行间之中。
今天第一篇带来的是EL表达式——一个让人惊叹的技术!
EL(Expression Language)表达式语言,目的是替代JSP中复杂的代码
${变量名}
这个例子是截取自我自己毕设的一个小部分。采用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();
}
}
}
}
运行代码可以很容易的得到用户的信息:姓名、性别、年龄
我们可以看到前面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页面即可
运行后你会发现同样是可以获取到数据的
把我们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表达式 完全管理前端事务逻辑