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:内省机制核心类:
内省机制核心类.png4.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的转换操作.pngApache组织提供了专门操作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} |
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
2):需要在使用JSTL的JSP页面引用标签库.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3):使用JSTL的标签库了.
JSTL标签库使用方法.png2.JSTL的常用标签库:
自动提示.png1):判断语句标签: if,if-else,if-elseif-else.
循环语句标签.png2):循环迭代标签:for-each. for-each.png
3):其他标签.
日期格式化标签.
JDBC+Servlet+JSP综合
1.操作流程:
1):新建一个Web项目.
2):拷贝之前已经编写好的domain,dao,util,配置文件,jar包.
3):测试DAO,保证后台测试通顺,再做前台.
拷贝web的依赖包(5).
4):做前台,编写Servlet/JSP.
2.Servlet的职责:
1:接受请求参数,封装成对象
2:调用业务方法处理请求
3:控制界面跳转
MVC思想
JavaEE开发模式:先后经历了Model1,Model2,MVC.
1.模式1(Model1):
以JSP为中心的动态网页开发模式.
使用技术: JSP + JavaBean.
优点:开发很快.
缺点:职责不分明,在JSP中大量存在Java代码.
解决方案:Model2.
职责分明:各自做各自最擅长的事情.
2.模式2(Model2):
在Model1中,咱们的JSP既要做页面输出,还要做处理请求的操作.
在这里,JSP是不擅长最请求处理的,擅长最界面输出.
我们就把JSP中处理请求的代码提取到了Servlet.
以Servlet为中心的动态网页开发模式.
使用技术:JSP + Servlet + JavaBean.
优势:体现出了责任分离的思想.维护性比较高.
Moudle2.png3.MVC
MVC其实和Model2很相似.
MVC最大的亮点就是体现责任分离.
M:Model:数据模型对象.(封装数据/处理业务逻辑):JavaBean
V:View: 展现界面,显示数据.(JSP/html/js/flash)
C:Controller:控制器(接受所有的请求和界面的跳转):Servlet
MVC框架:Struts2/SpringMVC
JavaBean:数据模型对象.(封装数据/处理业务逻辑)
Servlet:
1):接受请求参数,封装成对象.
2):调用业务方法处理请求.
3):控制界面跳转.
JSP: 展现页面,显示数据.
MVC最早的时候使用运用到CS领域的.
BS领域,必须先有请求而后才有响应操作.
合并Servlet
合并Servlet.pngWebCRUD
项目结构.png1.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>
网友评论