美文网首页
Javaweb基础(六)JavaBean-EL-JSTL-MVC

Javaweb基础(六)JavaBean-EL-JSTL-MVC

作者: 贾里 | 来源:发表于2017-08-29 09:17 被阅读86次

    JavaBean规范

    1.JavaBean:

    JavaBean 是一种JAVA语言写成的可重用组件(类)。(JavaBean就是特殊的类)

    1):设计JavaBean必须遵循的规范:
    • 1):把JavaBean类设计为public的.
    • 2):必须具有公共的无参数构造器,(方便反射创建对象).
    • 3):一般的,JavaBean的字段是私有的,外界不能访问,我们得提供让外界访问字段的公共方法.
      (getter/setter:必须遵循一定的规则)--->属性.
    2):JavaBean的分类:
    • 1):有用户界面(UI,User Interface)的JavaBean(Panel,Window,Button等);
    • 2):没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。
      比如:dao组件,domain,service等等.
    3):JavaBean具有的成员:
    • 1):事件(event),存在于有界面的JavaBean中.(点击事件).
    • 2):方法(method):
    • 3):属性(property):
      属性(attribute/property):
      attribute:一般来说,在Java语言中没有这一个概念,如果有就只能是注解中的抽象方法,很多人习惯把字段称之为属性.
      property:是JavaBean中专门向外界暴露获取/设置值的成员,有getter/setter方法所决定.
    4).获取字段的值(readMethod)/getter方法:
          public   数据类型    getXyz(){
                 return 字段变量;
          }
    

    如果: getUsername: 属性: username
    如果: getUserName: 属性: userName
    如果: getISBN: 顺序: ISBN
    注意: 方法必须是public,必须有返回类型,必须无参数. 如果字段是boolean类型,则没有getter方法,而是is方法.

    5).给字段设置值(WriteMethod)/setter方法:
         public  void  setXyz(数据类型 变量){
              this.字段 = 变量;
         }
    

    注意:方法是public的,必须无返回类型,必须有参数.

    一般的,我们都是先写字段,然后再通过Eclipse工具自动生成getter/setter方法.
    此时:属性名和字段名相同.
    有属性,不一定有字段.

    private String firstName;
    private String lastName;
    
    public String getFullName(){//属性: fullName
        return firstName + "." + lastName;
    }
    
    6).JavaBean什么时候提供getter/setter:
    • 如果外界需要获取JavaBean中的数据: 则提供getter.
    • 如果外界需要给JavaBean设置值: 则提供setter.

    2.Lombok — Java代码自动生成 开发利器

    3.Introspector:内省机制核心类

    反射机制: 获取字节码对象,创建该字节码对应类的对象以及调用方法.
    内省机制: 操作avaBean中的成员(事件,方法,属性):获取属性/设值属性.

    Introspector:内省机制核心类:

    内省机制核心类.png

    4.JavaBean和Map的转换操作

    JavaBean包含属性(属性名=属性值).
    属性名1 = 属性值1
    属性名2 = 属性值2
    属性名3 = 属性值3
    这一种结构就非常类似于Map结构.
    key1=value1
    key2=value2
    key3=value3

    所以我们把Map结构的数据也当做是JavaBean来使用.
    把Map的key作为属性名称,把Map的value作为属性值.

    JavaBean和Map的转换操作:

    JavaBean和Map的转换操作.png

    Apache组织提供了专门操作JavaBean的工具.
    BeanUtils组件.
    看资料

    EL(表达语言)

    http://blog.csdn.net/qq_26676207/article/details/52385113
    作用域对象.getAttribute(String name):表示从当前作用域中去寻找指定属性名称的属性值.
    找到就显示,找不到显示null.
    pageContext.findAttribute(String name):依次从page,request,session,application的作用域中寻找指定属性的属性值.
    如果有属性就显示属性值,没有属性就显示空字符(照顾用户).
    <%=pageContext.findAttribute("msg")!=null ? pageContext.findAttribute("msg") : ""%>

    1.EL:表达式语言

    目的:从作用域中取出共享数据.
    语法:${属性名称}. 如果有该属性就显示属性值,没有该属性输出空字符串.
    ${msg}等价于:
    <%=pageContext.findAttribute("msg")!=null ? pageContext.findAttribute("msg") : ""%>

    如果作用域中的属性名相同,想通过EL获取出不同作用域中的属性.
    此时得使用到EL的内置对象.${内置对象}.
    属性范围在EL中的名称

    作用域 方法 意义
    page ${pageScope.msg} 仅仅只从page作用域寻找msg属性.
    request ${requestScope.msg} 仅仅只从request作用域寻找msg属性.
    session ${sessionScope.msg}
    application ${applicationScope.msg}
    暴露getter方法.png

    2.在EL中访问JavaBean.

    步骤:
    1):把JavaBean对象存储到作用域中.
    2):通过EL来访问JavaBean.

    Person person = new Person();
    req.setAttribute("p", person);
    

    访问规则:
    方式1:${p.属性名称}----->等价于${p.getXxx()},此时要保证属性必须有getter方法.(推荐的)
    方式2:${p["属性名称"]}:处理特殊的属性名或Map的key.

    ${p}:得到作用域中属性名为p的Person对象.
    ${p.name}:d得到Person对象的name属性的值. 要求Person类中必须有name的getter方法.

    3.EL的细节:

    1):使用EL来获取当前应用的上下文路径:
    ${pageContext.getRequest().getContextPath()}:
    等价于:${pageContext.request.contextPath}

    2):从Tomcat7开始,支持在EL中直接调用方法,Tomcat6里面不支持,建有依然使用属性调用.
    ${pageContext.getRequest().getContextPath()}:

    3):判断集合是否为空:
    情况1: 集合对象引用为空.
    情况2: 集合对象有引用,但是没有元素.

    对于集合来说:
    ${empty list}:表示判断list既不能等于null,并且有元素,才会返回false.

    JSTL(Java标准标签库)

    消除jsp中java代码.png

    要消除JSP中的Java代码,咱们就得使用Java的标签库,每一个标签的背后其实就是一段Java代码.
    标签由SUN公司制定规范,再由用户自己定义开发的出来.------>自定义标签.

    一般的,我们不用自定义标签,我们使用JSTL(Java的标准标签库(SUN自己提供的标签库)).

    1.使用JSTL的准备环境:

    1):需要拷贝相应的jar.
    jstl.jar
    standard.jar
    el-api.jar
    jsp-api.jar

    JSTL的jar包.png

    2):需要在使用JSTL的JSP页面引用标签库.

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

    3):使用JSTL的标签库了.

    JSTL标签库使用方法.png

    2.JSTL的常用标签库:

    自动提示.png

    1):判断语句标签: if,if-else,if-elseif-else.

    循环语句标签.png
    2):循环迭代标签:for-each. for-each.png

    3):其他标签.
    日期格式化标签.

    日期格式化标签.png

    JDBC+Servlet+JSP综合

    1.操作流程:

    1):新建一个Web项目.
    2):拷贝之前已经编写好的domain,dao,util,配置文件,jar包.
    3):测试DAO,保证后台测试通顺,再做前台.
    拷贝web的依赖包(5).
    4):做前台,编写Servlet/JSP.

    2.Servlet的职责:

    1:接受请求参数,封装成对象
    2:调用业务方法处理请求
    3:控制界面跳转

    crud.png

    MVC思想

    JavaEE开发模式:先后经历了Model1,Model2,MVC.

    1.模式1(Model1):

    以JSP为中心的动态网页开发模式.
    使用技术: JSP + JavaBean.

    优点:开发很快.
    缺点:职责不分明,在JSP中大量存在Java代码.
    解决方案:Model2.
    职责分明:各自做各自最擅长的事情.

    Moudle1.png

    2.模式2(Model2):

    在Model1中,咱们的JSP既要做页面输出,还要做处理请求的操作.
    在这里,JSP是不擅长最请求处理的,擅长最界面输出.
    我们就把JSP中处理请求的代码提取到了Servlet.

    以Servlet为中心的动态网页开发模式.
    使用技术:JSP + Servlet + JavaBean.

    优势:体现出了责任分离的思想.维护性比较高.

    Moudle2.png

    3.MVC

    MVC其实和Model2很相似.
    MVC最大的亮点就是体现责任分离.
    M:Model:数据模型对象.(封装数据/处理业务逻辑):JavaBean
    V:View: 展现界面,显示数据.(JSP/html/js/flash)
    C:Controller:控制器(接受所有的请求和界面的跳转):Servlet
    MVC框架:Struts2/SpringMVC

    MVC.png

    JavaBean:数据模型对象.(封装数据/处理业务逻辑)
    Servlet:
    1):接受请求参数,封装成对象.
    2):调用业务方法处理请求.
    3):控制界面跳转.
    JSP: 展现页面,显示数据.

    MVC最早的时候使用运用到CS领域的.
    BS领域,必须先有请求而后才有响应操作.

    MVC.png

    合并Servlet

    合并Servlet.png

    WebCRUD

    项目结构.png

    1.Domain

    public class Product {
        private long id;
        private String productName;   //产品名称
        private String brand;   //产品标签
        private String supplier;   //产品父类型
        private double costPrice;  //成本价格
        private double salePrice;  //售价
        private double cutoff;   //折扣
        private long dir_id;  //目录id
        
        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
        public String getProductName() {
            return productName;
        }
        public void setProductName(String productName) {
            this.productName = productName;
        }
        public String getBrand() {
            return brand;
        }
        public void setBrand(String brand) {
            this.brand = brand;
        }
        public String getSupplier() {
            return supplier;
        }
        public void setSupplier(String supplier) {
            this.supplier = supplier;
        }
        public double getCostPrice() {
            return costPrice;
        }
        public void setCostPrice(double costPrice) {
            this.costPrice = costPrice;
        }
        public double getSalePrice() {
            return salePrice;
        }
        public void setSalePrice(double salePrice) {
            this.salePrice = salePrice;
        }
        public double getCutoff() {
            return cutoff;
        }
        public void setCutoff(double cutoff) {
            this.cutoff = cutoff;
        }
        public long getDir_id() {
            return dir_id;
        }
        public void setDir_id(long dir_id) {
            this.dir_id = dir_id;
        }
        
        
        @Override
        public String toString() {
            return "Product [id=" + id + ", productName=" + productName + ", brand=" + brand + ", supplier=" + supplier
                    + ", costPrice=" + costPrice + ", salePrice=" + salePrice + ", cutoff=" + cutoff + ", dir_id=" + dir_id
                    + "]";
        }
    }
    

    2.DAO

    public interface IProductDAO {
        
        
        
        /**
         * 保存
         * @param pro
         */
        public void save(Product pro);
        
        /**
         * 更新
         * @param pro
         */
        public void update(Product pro);
        
        /**
         * 删除
         * @param id
         */
        public void delete(Long id);
        
        
        /**
         * 查询单个
         * @param id
         * @return
         */
        public Product getSimple(Long id);
        
        
        /**
         * 查询全部
         * @return
         */
        public List<Product> list();
    
    }
    

    3.DAOImpl

    public class ProductDAOImpl implements IProductDAO{
    
        @Override
        public void save(Product pro) {
            String sql = "INSERT INTO t_product ("
                    + "productName,"
                    + "brand,"
                    + "supplier,"
                    + "costPrice,"
                    + "salePrice,"
                    + "cutoff,"
                    + "dir_id) VALUES (?,?,?,?,?,?,?);";
            Object[] params = {
                    pro.getProductName(), 
                    pro.getBrand(), 
                    pro.getSupplier(), 
                    pro.getCostPrice(),
                    pro.getSalePrice(), 
                    pro.getCutoff(), 
                    pro.getDir_id() };
            JdbcTemplate.update(sql, params);
            
        }
    
        @Override
        public void update(Product pro) {
            String sql = "UPDATE t_product SET "
                    + "productName = ?,"
                    + "brand = ?,"
                    + "supplier = ?,"
                    + "costPrice= ?, "
                    + "salePrice= ?, "
                    + "cutoff= ?, "
                    + "dir_id= ? "
                    + "WHERE id =?";
            Object[] params = { pro.getProductName(), pro.getBrand(), pro.getSupplier(), pro.getCostPrice(),
                    pro.getSalePrice(), pro.getCutoff(), pro.getDir_id(), pro.getId() };
            JdbcTemplate.update(sql, params);
            
        }
    
        @Override
        public void delete(Long id) {
            String sql = "DELETE FROM t_product WHERE id = ?";
            JdbcTemplate.update(sql, id);
            
        }
    
        @Override
        public Product getSimple(Long id) {
            String sql = "SELECT * FROM t_product WHERE id = ?";
            List<Product> list = JdbcTemplate.query(sql, new ProductResultSetHandler(),id);
            Product result=list.size() == 1 ? list.get(0) : null;
            if(result!=null){
                System.out.println("result:"+result.toString());
            }
            return result;
        }
    
        @Override
        public List<Product> list() {
            String sql = "SELECT * FROM t_product";
            List<Product> list = JdbcTemplate.query(sql, new ProductResultSetHandler());
            for (Iterator iterator = list.iterator(); iterator.hasNext();) {
                Product product = (Product) iterator.next();
                System.out.println("product:" + product.toString());
            }
            return list;
        }
    
    }
    

    4.JdbcUtil

    public class JdbcUtil {
    
        private static Properties properties = new Properties();
        static {
            // 在JdbcUtil的字节码被加载进JVM就执行,只是执行一次
            try {
                InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");
                properties.load(inStream);
                Class.forName(properties.getProperty("driverClassName"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        
        /**
         * 获取连接
         * @return
         */
        public static Connection getConn() {
            Connection conn = null;
            try {
                // 加载驱动
                conn = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("userName"),
                        properties.getProperty("password"));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return conn;
        }
    
        /**
         * 关闭资源
         * 
         * @param conn
         * @param st
         * @param rs
         */
        public static void close(Connection conn, Statement st, ResultSet rs) {
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            } finally {
                try {
                    if (st != null) {
                        st.close();
                    }
                } catch (Exception e3) {
                    e3.printStackTrace();
                } finally {
                    try {
                        if (conn != null) {
                            conn.close();
                        }
                    } catch (Exception e3) {
                        e3.printStackTrace();
                    }
                }
            }
        }
    }
    

    5.db.properties

    driverClassName = com.mysql.jdbc.Driver
    url=jdbc:mysql:///product
    userName=root
    password=123456
    

    6.JdbcTemplate

    public class JdbcTemplate {
        
        
        /**
         * DML
         * @param sql
         * @param params
         * @return
         */
        public static int update(String sql, Object... params) {
            Connection conn = null;
            PreparedStatement ps = null;
            try {
                conn = JdbcUtil.getConn();
                ps = conn.prepareStatement(sql);
                System.out.println("sql:"+sql);
                // 设置占位参数
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i+1, params[i]);
                }
                return ps.executeUpdate();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, ps, null);
            }
            return 0;
        }
    
        
        /**
         * DQL
         * @param sql
         * @param handler
         * @param params
         * @return
         */
        public static <T> T query(String sql, IResultSetHandler<T> handler, Object... params) {
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            try {
                conn = JdbcUtil.getConn();
                ps = conn.prepareStatement(sql);
                // 设置占位参数
                for (int i = 0; i < params.length; i++) {
                    ps.setObject(i+1, params[i]);
                }
                rs = ps.executeQuery();
                return handler.handle(rs);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JdbcUtil.close(conn, ps, null);
            }
            return null;
        }
    
    }
    

    7.IResultSetHandler

    public interface IResultSetHandler<T> {
        
        T handle(ResultSet rs) throws SQLException;
    }
    

    8.ProductResultSetHandler

    public class ProductResultSetHandler implements IResultSetHandler<List<Product>>{
    
        @Override
        public List<Product> handle(ResultSet rs) throws SQLException {
            List<Product> list=new ArrayList<Product>();
            while(rs.next()){
                Product pro = new Product();
                pro.setId(rs.getLong("id"));
                pro.setProductName(rs.getString("productName"));
                pro.setBrand(rs.getString("brand"));
                pro.setSupplier(rs.getString("supplier"));
                pro.setCostPrice(rs.getDouble("costPrice"));
                pro.setSalePrice(rs.getDouble("salePrice"));
                pro.setCutoff(rs.getDouble("cutoff"));
                pro.setDir_id(rs.getLong("dir_id"));
                list.add(pro);
            }
            return list;
        }
    
    }
    

    9.ProductServlet

    @WebServlet("/product")
    public class ProductServlet extends HttpServlet {
    
        IProductDAO productDao;
    
        @Override
        public void init() throws ServletException {
            productDao = new ProductDAOImpl();
        }
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            String cmd = request.getParameter("cmd");
            if ("delete".equals(cmd)) {
                this.delete(request, response);
            } else if ("edit".equals(cmd)) {
                this.edit(request, response);
            } else if ("save".equals(cmd)) {
                this.addOrUpdate(request, response);
            } else {
                this.list(request, response);
            }
        }
        
        
        
        /**
         * 获取全部
         * 
         * @param request
         * @param response
         * @throws ServletException
         * @throws IOException
         */
        protected void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            List<Product> products = productDao.list();
            // 控制页面跳转
            request.setAttribute("products", products);
            request.getRequestDispatcher("/WEB-INF/views/list.jsp").forward(request, response);
        }
        
        
        
        /**
         * 增加或者修改
         * @param request
         * @param response
         * @throws ServletException
         * @throws IOException
         */
        protected void addOrUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1.接收参数
            Product pro = null;
            try {
                pro = requset2Obj(request,response);
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("添加失败");
                response.sendRedirect("/product/product");
                return;
            }
            if(pro.getId()>0){
                productDao.update(pro);
            }else{
                productDao.save(pro);
            }
            response.sendRedirect("/product/product");
        }
        
        
        
        /**
         * 编辑
         * @param request
         * @param response
         * @throws ServletException
         * @throws IOException
         */
        protected void edit(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
            String id = request.getParameter("id");
            if(id!=null){
                try {
                    long productId=Long.valueOf(id);
                    Product product =productDao.getSimple(productId);
                    //控制页面跳转
                    request.setAttribute("product", product);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            request.getRequestDispatcher("WEB-INF/views/edit.jsp").forward(request, response);
        }
    
        
        
        /**
         * 删除
         * @param request
         * @param response
         * @throws ServletException
         * @throws IOException
         */
        protected void delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
            String id = request.getParameter("id");
            if(hasLength(id)){
                productDao.delete(Long.valueOf(id));
            }
            response.sendRedirect("/product/product");
        }
        
        
        
        protected void query(){
            
        }
        
        
        private Product requset2Obj(HttpServletRequest request, HttpServletResponse response) throws Exception{
            String productName = request.getParameter("productName");
            String brand = request.getParameter("brand");
            String supplier = request.getParameter("supplier");
            String costPrice = request.getParameter("costPrice");
            String salePrice = request.getParameter("salePrice");
            String cutoff = request.getParameter("cutoff");
            String dir_id = request.getParameter("dir_id");
            String id = request.getParameter("id");
            
            Product pro = new Product();
            pro.setProductName(productName);
            pro.setBrand(brand);
            pro.setSupplier(supplier);
            pro.setCostPrice(Double.valueOf(costPrice));
            pro.setSalePrice(Double.valueOf(salePrice));
            pro.setCutoff(Double.valueOf(cutoff));
            pro.setDir_id(Long.valueOf(dir_id));
            if(hasLength(id)){
                pro.setId(Long.valueOf(id));
            }
            System.out.println("增加:"+pro.toString());
            return pro;
        }
        
        
        private boolean hasLength(String str){
            return str!=null&&!"".equals(str.trim());
        }
    
    }
    

    10.list.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    
    <a href="/product/product?cmd=edit">添加商品</a>
        <table cellpadding="0" cellspacing="0" border="1" width="800">
            <tr>
                <th>产品名称</th>
                <th>产品标签</th>
                <th>产品父类型</th>
                <th>成本价格</th>
                <th>销售价格</th>
                <th>折扣</th>
                <th>目录id</th>
                <th>操作</th>
            </tr>
            <c:if test="${empty products}">
    
                <tr align="center">沒有数据</tr>
            </c:if>
            <c:forEach items="${products}" var="pro" varStatus="vs">
                <tr style='background:${vs.count%2==0?"gray":""}'>
                    <td>${pro.productName}</td>
                    <td>${pro.brand}</td>
                    <td>${pro.supplier}</td>
                    <td>${pro.costPrice}</td>
                    <td>${pro.salePrice}</td>
                    <td>${pro.cutoff}</td>
                    <td>${pro.dir_id}</td>
                    <td>
                        <a href="/product/product?cmd=delete&id=${pro.id}">删除</a>
                        <a href="/product/product?cmd=edit&id=${pro.id}">编辑</a>
                    </td>
                </tr>
            </c:forEach>
        </table>
    
    </body>
    </html>
    

    11.edit.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>编辑产品</title>
    </head>
    <body>
    <form action="product?cmd=save" method="post">
            <input type="hidden" name="id" value="${product.id}"/>
            <table border="1" cellpadding="0" cellspacing="0">
                <tr>
                    <td>产品名称</td>
                    <td><input type="text" name="productName" value="${product.productName}"/></td>
                </tr>
                <tr>
                    <td>产品标签</td>
                    <td><input type="text" name="brand" value="${product.brand}"/></td>
                </tr>
                <tr>
                    <td>产品父类型</td>
                    <td><input type="text" name="supplier" value="${product.supplier}"/></td>
                </tr>
                <tr>
                    <td>售价</td>
                    <td><input type="text" name="salePrice" value="${product.salePrice}"/></td>
                </tr>
                <tr>
                    <td>成本价格</td>
                    <td><input type="text" name="costPrice" value="${product.costPrice}"/></td>
                </tr>
                <tr>
                    <td>折  扣</td>
                    <td><input type="text" name="cutoff" value="${product.cutoff}"/></td>
                </tr>
                <tr>
                    <td>目录id</td>
                    <td>
                        <select name="dir_id">
                            <option value="11">11</option>
                            <option value="22">22</option>
                            <option value="33">33</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" value="保存"/></td>
                </tr>
            </table>
        </form>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:Javaweb基础(六)JavaBean-EL-JSTL-MVC

          本文链接:https://www.haomeiwen.com/subject/owkrdxtx.html