美文网首页
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