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

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 一、什么是JavaBean (1)JavaBean是一个遵循特定写法的java类,它通常具有如下特点:这个java...
    yjaal阅读 1,615评论 2 8
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,390评论 0 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,493评论 18 399
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,111评论 1 18
  • 技术小白,求大神指教,如有重复,纯属巧合。 /etc/issue文件是Linux系统开机启动时在命令行界面弹出的欢...
    王王王小白阅读 11,666评论 0 0