不会框架不要紧,我带你自定义框架

不会框架不要紧,我带你自定义框架

前言:这标题说的有点大了,当一回标题党,之前在学JSP的时候提到了JSTL和EL表达式,由于一直钟情于Servlet,迟迟没有更新别的,这回算是跳出来了。这回放个大招,用Spring+SpringMVC+Spring Jdbc Template,实现一个增删改查加分页,但重点不在这,我的重心在于JSTL和EL表达式,标题虽然有点大,但话糙理不糙,我真的是要自定义框架,当然,这个框架可大可小,大的我不敢说,用JSTL自定义标签封装个分页还是可以的,也算补上JSTL和EL表达式的学习吧。对于那些一直跟着我跟新博客脚步的朋友,我提醒你们不要着急,你要是好奇就可以先试着跟着我的案例试试手,不要看到SSM框架就说还没学,不会啥的,哈哈,开玩笑,都没学怎么可能会呢,我说了,这篇的重点在于JSTL和EL表达式,重要的话说了不下三遍了,至于附加的SSM,我会持续跟新,会手把手带你理解的,别急,别急,就当先认识一下SSM吧。

 

 

环境准备

我用的开发工具是IDEA,如果有不会用IDEA的朋友可以看之前写过的博客《IDEA新手使用教程》,我建的这是一个Maven项目,如果有朋友不知道Maven,可以先看一下我之前写的介绍Maven的博客《Maven》,不知道如何配置Maven环境的可以看《Maven的安装与配置》https://www.cnblogs.com/zyx110/p/10801666.html不知道如何在IDEA中建Maven项目的朋友可以看《IDEA为新手专业打造》,此案例还会用到Tomcat,同样,不会在IDEA中配置Tomcat的朋友可以看《IDEA为新手专业打造》,好,完成这些,就可以开始敲代码了。

 

 

 

用JSTL封装框架

写之前先简单介绍一下JSTL和EL表达式:

JSTL简介及环境搭建

什么是JSTL

JSTL是Java中的一个定制标记库集

为什么要使用JSTL

实现了JSP页面中的代码复用,基于标签库原理,重复率较高的代码块支持复用,提高效率

书写JSP页面时可读性更强,长得很像XML,方便前端查看和参与开发

举例:


 不会框架不要紧,我带你自定义框架_第1张图片
不同角色用户登录时显示不同提示信息

 

需要导入的JSTL模块



  javax.servlet
  jstl
  1.2


 

  

 

EL表达式配合使用JSTL

第一个JSTL小程序

在JSP页面中导入JSTL标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  

 

使用out标签输出


  

JSTL标签的四大分类:核心标签、格式化标签、SQL标签、XML标签EL表达式

  • EL表达式全名为Expression Language,经常与JSTL配合使用,使得JSP页面更直观,写法更简单。

普通表达式的写法: <%=session.getValue("name") %>

EL表达式写法: 

  • EL表达式的格式

用美元符号“$”定界,内容包括在花括号“{ }”中;

  • "."与"[ ]"运算符

²  通常情况是通用的${user.sex}或${user["sex"]}

²  "[ ]"还可以用来进行集合元素中的定位${booklist[0].price}

²  当包含特殊字符时,必须使用"[ ]",例如:${user["first-name"]}

²  通过变量动态取值:${user[param]},例如:param可以是name/sex/others

EL变量

 不会框架不要紧,我带你自定义框架_第2张图片

 

EL自动类型转换

 不会框架不要紧,我带你自定义框架_第3张图片

 

EL隐式对象

 不会框架不要紧,我带你自定义框架_第4张图片

 

EL运算符

 不会框架不要紧,我带你自定义框架_第5张图片

 

 

JSP自定义标签

什么是自定义标签

在实际开发过程中不能出现大量的html+java代码相混合的jsp页面,但是有时候jsp标签和第三方标签满足不了正常的开发工作,这就需要开发人员将业务逻辑封装到符合jsp规范的类或接口中,来自己定义标签从而满足不同的开发需求。这样做的缺点是会加重开发的工作量,但在开发过程中简化了前后端的沟通,便于后期的维护,这点工作量也是微不足道的。我们可以自己定义一套标签机制,让完全不懂写代码的人开发一套网站出来。

开发第一个自定义标签

案例场景:

在页面中显示当前时间,格式:“当前时间为:2017年8月1日 10:30:50”

  • 如果使用传统的jsp脚本开发,代码如下:
<%

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

String date = sdf.format(new Date());

%>

当前时间为:<%=date %>

  


 显示结果:

 

 

  • 下面使用自定义标签库来实现这个案例

第一步:编写自定义标签的业务逻辑处理类

 不会框架不要紧,我带你自定义框架_第6张图片

 

DateTag
package utils;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTag extends TagSupport {
    private String format="yyyy-MM-dd HH:mm:ss";
    private String color="blue";
    private String fontSize="12px";

    public void setFormat(String format) {
        this.format = format;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setFontSize(String fontSize) {
        this.fontSize = fontSize;
    }

    public int doStartTag() throws JspException {
        //自定义业务
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        String date = simpleDateFormat.format(new Date());

        String htmlshow = "

"+date+"

"; try { pageContext.getOut().print(htmlshow); } catch (IOException e) { e.printStackTrace(); } return super.doStartTag(); } }

  

第二步:在WEB-INF目录下编写*.tld文件注册标签

 不会框架不要紧,我带你自定义框架_第7张图片

 

 

格式模板

datetag.tld

 





    1.0
    myshortname
    http://mycompany.com

    
        date
        utils.DateTag
        empty
        
            format
            false
        
        
            color
            false
        
        
            fontSize
            false
        

    


  

 

JSP显示

 不会框架不要紧,我带你自定义框架_第8张图片

 

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="z" uri="http://mycompany.com" %>
<%@ taglib prefix="c" uri="http://mycompany.com" %>


    显示时间


index.jsp

  

 不会框架不要紧,我带你自定义框架_第9张图片

 

 

Spring+SpringMVC+Spring Jdbc Template

数据库结构

 不会框架不要紧,我带你自定义框架_第10张图片

 

项目结构

 

 不会框架不要紧,我带你自定义框架_第11张图片

 

Pom.xml


  
    junit
    junit
    4.11
    test
  
  
  
    javax.servlet
    javax.servlet-api
    3.1.0
  
  
    mysql
    mysql-connector-java
    5.1.38
  
  
    javax.servlet
    jstl
    1.2
  
  
  
    org.springframework
    spring-core
    5.0.2.RELEASE
  
  
    org.springframework
    spring-context
    5.0.2.RELEASE
  
  
    org.springframework
    spring-beans
    5.0.2.RELEASE
  
  
    org.springframework
    spring-expression
    5.0.2.RELEASE
  
  
    org.springframework
    spring-aop
    5.0.2.RELEASE
  
  
    org.springframework
    spring-jdbc
    5.0.2.RELEASE
  
  
    org.springframework
    spring-tx
    5.0.2.RELEASE
  
  
    org.springframework
    spring-web
    5.0.2.RELEASE
  
  
    org.springframework
    spring-webmvc
    5.0.2.RELEASE
  
  
  
    commons-logging
    commons-logging
    1.2
  


 

  

 

Web.xml




  
    springmvc
    org.springframework.web.servlet.DispatcherServlet
    1
    
      contextConfigLocation
      classpath:applicationContext.xml
    
  
  
    springmvc
    /
  

  
  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
    
      forceEncoding
      true
    
  
  
    encodingFilter
    /*
  

  
  
    default
    *.css
  
  
    default
    *.js
  
  
    default
    *.jpg
  
  
    default
    *.png
  
  
    default
    *.gif
  
  
    default
    *.mp3
  
  
    default
    *.mp4
  


  

 

 

applicationContext.xml



 

    
    
    
    
    
    
    
    

    
    
        
        
        
        
    
    
        
    
    
    
        
    
    
    

    
    
    
    

    
    
        
        
        
        
    

    
    


 

  

 

Book

package pojo;

public class Book {
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookname='" + bookname + '\'' +
                ", price=" + price +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    private int id;
    private String bookname;
    private int price;


}

 

  

PageBean

package pojo;

import java.util.List;

public class PageBean {

    private int pageCode;//当前页码
    private int totalPage;//总页数
    private int count;//总记录数
    private int pageSize;//每页记录数
    private List pageList;//每页的数据


    public PageBean(int pageCode, int pageSize, int count, List pageList) {
        this.pageCode = pageCode;
        this.count = count;
        this.pageSize = pageSize;
        this.pageList = pageList;
    }

    public PageBean() {
    }

    public int getPageCode() {
        return pageCode;
    }

    public void setPageCode(int pageCode) {
        this.pageCode = pageCode;
    }

    public int getTotalPage() {
        int tp = count/pageSize;
        return count%pageSize==0 ? tp : tp+1;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public List getPageList() {
        return pageList;
    }

    public void setPageList(List pageList) {
        this.pageList = pageList;
    }
}

 

  

 

BookDao

package dao;

import pojo.Book;

import java.util.List;

public interface BookDao {
    public List findByPage(int pageCode,int pageSize);
    public int count();
}

 

  

BookDaoImpl

package dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import pojo.Book;

import java.util.List;
@Repository
public class BookDaoImpl implements BookDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public List findByPage(int pageCode, int pageSize) {
        String sql = "select * from book limit ?,?";
        Object[] param = {(pageCode-1)*pageSize,pageSize};
        return jdbcTemplate.query(sql,new BeanPropertyRowMapper(Book.class),param);
    }

    @Override
    public int count() {
        String sql = "select count(*) from book";
        return jdbcTemplate.queryForObject(sql,Integer.class);
    }
}

  

 

BookService

package Service;

import pojo.Book;
import pojo.PageBean;

public interface BookService {
    public PageBean findByPage(int pageCode,int pageSize);
}

 

  

BookServiceImpl

package Service;

import dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pojo.Book;
import pojo.PageBean;
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookDao bookDao;

    @Override
    public PageBean findByPage(int pageCode, int pageSize) {
        return new PageBean(pageCode,pageSize,bookDao.count(),bookDao.findByPage(pageCode,pageSize));
    }
}

 

  

 

BookController

package controller;

import Service.BookService;
import com.sun.org.apache.xml.internal.resolver.readers.XCatalogReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.Book;
import pojo.PageBean;
import utils.RequestPage;

@Controller
@RequestMapping("/book")
public class BookController {
    @Autowired
    private BookService bookService;

    @RequestMapping("/query")
    public String findByPage(Integer page, Model model){
        page = RequestPage.getPage(page);//判断是否为空
        PageBean pageBean = bookService.findByPage(page,RequestPage.PAGE_SIZE);
        model.addAttribute("pageBean",pageBean);

        return "book";
    }


}

  

 

DateTag

package utils;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTag extends TagSupport {
    private String format="yyyy-MM-dd HH:mm:ss";
    private String color="blue";
    private String fontSize="12px";

    public void setFormat(String format) {
        this.format = format;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setFontSize(String fontSize) {
        this.fontSize = fontSize;
    }

    public int doStartTag() throws JspException {
        //自定义业务
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        String date = simpleDateFormat.format(new Date());

        String htmlshow = "

"+date+"

"; try { pageContext.getOut().print(htmlshow); } catch (IOException e) { e.printStackTrace(); } return super.doStartTag(); } }

  

PageTag

package utils;

import pojo.PageBean;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;

public class PageTag extends TagSupport {


    private PageBean pageBean;
    private String url;

    public void setUrl(String url) {
        this.url = url;
    }

    public void setPageBean(PageBean pageBean) {
        this.pageBean = pageBean;
    }

    @Override
    public int doStartTag() throws JspException {

        try {
            StringBuffer sb = new StringBuffer();
            //首页
            sb.append("首页 ");
            //上一页
            if (pageBean.getPageCode() <= 1) {
                sb.append("上一页 ");
            } else {
                sb.append("上一页 ");
            }

            //显示页码
            int begin, end;
            if (pageBean.getTotalPage() <= 10) {
                begin = 1;
                end = pageBean.getTotalPage();
            } else {
                begin = pageBean.getPageCode() - 5;
                end = pageBean.getPageCode() + 4;
                if (begin < 1) {
                    begin = 1;
                    end = 10;
                } else if (end > pageBean.getTotalPage()) {
                    begin = pageBean.getTotalPage() - 9;
                    end = pageBean.getTotalPage();
                }
            }

            for (int i = begin; i <= end; i++) {
                if (i == pageBean.getPageCode()) {
                    sb.append("" + i + " ");
                } else {
                    sb.append("[" + i + "] ");
                }
            }

            //下一页
            if (pageBean.getPageCode() >= pageBean.getTotalPage()) {
                sb.append("下一页");
            } else {
                sb.append("下一页 ");
            }
            //尾页
            sb.append("尾页 \n" +
                    "    页码" + pageBean.getPageCode() + "/" + pageBean.getTotalPage());

            pageContext.getOut().print(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return super.doStartTag();
    }
}

 

 

RequestPage
package utils;

public class RequestPage {
    public static final int PAGE_SIZE =5;

    public static Integer getPage(Integer page){
        if (page==null||page<1){
            page=1;
        }

        return page;
    }

}

  

datetag.tld





    1.0
    myshortname
    http://mycompany.com

    
        date
        utils.DateTag
        empty
        
            format
            false
        
        
            color
            false
        
        
            fontSize
            false
        

    
    
        page
        utils.PageTag
        empty
        
            pageBean
            false
            true
        
        
            url
            false
            true
        
    



 

  

 

book.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="z" uri="http://mycompany.com" %>



    图书


图书列表


ID 书名 价格
${book.id} ${book.bookname} ${book.price}

  

 

运行显示

 不会框架不要紧,我带你自定义框架_第12张图片

 

 不会框架不要紧,我带你自定义框架_第13张图片

 

 

 

分享结束

后面我会持续分享SSM框架知识,欲知后文如何,请看下回分解

*****************************************************************************************************

我的博客园地址:https://www.cnblogs.com/zyx110/

转载请说明出处

我不能保证我所说的都是对的,但我能保证每一篇都是用心去写的,我始终认同“分享的越多,你的价值增值越大”,欢迎大家关注我的技术分享“Java匹马行天下”和学习心得分享“匹马行天下”,在分享中进步,越努力越幸运,人生赢在转折处,改变从现在开始!

支持我的朋友们记得点波推荐哦,您的肯定就是我前进的动力。

 

 

你可能感兴趣的:(不会框架不要紧,我带你自定义框架)