Struts2框架分页文档
【课程回顾】
1、常用的struts2标签总结
1.使用Struts2的常用逻辑标签1.1 property标签(1)功能说明 获取对象的属性值,目标对象默认位于ValueStack栈顶 (2)标签属性 eg:<s:property value="user.userName"/>
1.2 if-elseif-else标签功能说明: 替代Java语法中的if/else 标签属性:
欢迎${user.name} , <s:if test="user.role == 'admin'">系统管理员</s:if> <s:elseif test="user.role == 'member'">会员</s:elseif> <s:else>游客</s:else>
1.3 iterator标签功能说明: 替代Java语言中foreach的功能 标签属性: <s:iterator value="products"> <s:property value="name"/>,<s:property value="price"/> <br /> </s:iterator>
2.使用Struts2的常用UI标签2.1简单表单标签2.2 select标签功能说明: 生成select标签(含option) 标签属性: eg: <s:select list="products" listKey="id" listValue="name" label="产品" />
2.3 checkboxlist标签功能说明: 生成一组checkbox 标签属性: eg:<s:checkboxlist name="favors" list="products" listKey="id" listValue="name"/> 2.4 radio标签功能说明: 生成一组radio 标签属性: eg:<s:radio name="favorite" list="products" listKey="id" listValue="name"/>
|
2、常用注解总结
1)Hibernate框架的
Hibernate的注解主要用在持久化类那一块:
@Entity 作用: 指定当前类是实体类。写上此注解用于在创建 SessionFactory 时,加载映射配置。
@Table 作用: 指定实体类和表之间的对应关系。 属性: name:指定数据库表的名称
@Id 作用: 指定当前字段是主键。
@GeneratedValue 作用: 指定主键的生成方式。 属性: strategy :指定主键生成策略。 JPA 提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。
@Column 作用: 指定实体类属性和数据库表字段之间的对应关系 属性: name:指定数据库表的列名称。 unique:是否唯一 nullable:是否可以为空 inserttable:是否可以插入 updateable:是否可以更新
一对多涉及的注解: @OneToMany: 作用:建立一对多的关系映射 属性: targetEntityClass:指定多的多方的类的字节码 mappedBy:指定从表实体类中引用主表对象的名称。 cascade:指定要使用的级联操作 fetch:指定是否采用延迟加载 orphanRemoval:是否使用孤儿删除 @ManyToOne 作用:建立多对一的关系 属性: targetEntityClass:指定一的一方实体类字节码 cascade:指定要使用的级联操作 fetch:指定是否采用延迟加载 optional:关联是否可选。如果设置为false,则必须始终存在非空关系。 @JoinColumn 作用:用于定义主键字段和外键字段的对应关系。 属性: name:指定外键字段的名称 referencedColumnName:指定引用主表的主键字段名称 unique:是否唯一。默认值不唯一 nullable:是否允许为空。默认值允许。 insertable:是否允许插入。默认值允许。 updatable:是否允许更新。默认值允许。 columnDefinition:列的定义信息。
多对多涉及的注解: @ManyToMany 作用:用于映射多对多关系 属性: cascade:配置级联操作。 fetch:配置是否采用延迟加载。 targetEntity:配置目标的实体类。映射多对多的时候不用写。 @JoinTable 作用:针对中间表的配置 属性: nam:配置中间表的名称 joinColumns:中间表的外键字段关联当前实体类所对应表的主键字段 inverseJoinColumn:中间表的外键字段关联对方表的主键字段
@JoinColumn 作用:用于定义主键字段和外键字段的对应关系。 属性: name:指定外键字段的名称 referencedColumnName:指定引用主表的主键字段名称 unique:是否唯一。默认值不唯一 nullable:是否允许为空。默认值允许。 insertable:是否允许插入。默认值允许。 updatable:是否允许更新。默认值允许。 columnDefinition:列的定义信息。
|
2)Struts2框架的
@NameSpace 出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。 作用: 指定当前 Action 中所有动作方法的名称空间。 属性: value: 指定名称空间的名称。写法和 xml 配置时一致。 不指定的话,默认名称空间是""。
@ParentPackage 出现的位置: 它只能出现在 package 上或者 Action 类上。 一般情况下都是写在 Action 类上。 作用: 指定当前动作类所在包的父包。由于我们已经是在类中配置了,所以无需在指定包名了。 属性: value: 指定父包的名称。
@Action 出现的位置: 它只能出现在 Action 类上或者动作方法上。 一般情况下都是写在动作方法上。 作用: 指定当前动作方法的动作名称。 也就是 xml 配置时 action 标签的 name 属性。 属性: value: 指定动作名称。 results[]: 它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用 response 输出响应正文。 interceptorRefs[]: 它是一个数组,数据类型是注解。用于指定引用的拦截器。
@Result 出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。 作用: 出现在类上,表示当前动作类中的所有动作方法都可以用此视图。出现在 Action 注解中,表示当前 Action 可用此视图。 属性: name: 指定逻辑结果视图名称。 type: 指定前往视图的方式。 例如:请求转发,重定向,重定向到另外的动作。 location: 指定前往的地址。可以是一个页面,也可以是一个动作。
@Results 出现的位置: 它可以出现在动作类上,也可以出现在 Action 注解中。 作用: 用于配置多个结果视图。 属性: value: 它是一个数组,数据类型是 result 注解。
@InterceptorRef 出现的位置: 它可以出现在动作类上或者 Action 注解中。 作用: 用于配置要引用的拦截器或者拦截器栈 属性: value: 用于指定拦截器或者拦截器栈 |
3)Spring框架的
1、IOC的注解 @Component :创建对象 @Controller :创建对象 @Service :创建对象 @Repository :创建对象 @Autowired : 根据类型自动装配 @ Qualifier : 与上面的Autowired一起用,目的根据id获取对象 @Resource : 可以根据类型装配,也可以根据id装配,name属性就是bean的id @Value : 注入基本类型和字符串类型 @Scope : 单例与多例的问题,singleton,prototype request session @Configuration : 定义配置类,用于替换spring中的xml文件的 @ComponentScan: 扫描包下的bean对象 @PropertySource : 指定的配置文件 @Bean : 用在方法上面,创建对象的,根据方法的返回类型 @Import: 导入其他的配置类
2、AOP的常用注解 @Aspect: 作用:把当前类声明为切面类。
@Before: 作用:把当前方法看成是前置通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@AfterReturning 作用:把当前方法看成是后置通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@AfterThrowing 作用:把当前方法看成是异常通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@After 作用:把当前方法看成是最终通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Around 作用:把当前方法看成是环绕通知。 属性: value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@Pointcut 作用:指定切入点表达式 属性: value:指定表达式的内容
3、事务的注解 @Transactional(readOnly=true,propagation=Propagation.SUPPORTS) @Transactional(readOnly=false,propagation=Propagation.REQUIRED) @EnableTransactionManagement
|
【课程目标】
1、能够实现客户和联系人的一对多关系映射 *****
2、能够独立实现联系人的增删改功能
3、能够独立开发联系人列表功能
4、能够独立开发客户和联系人的分页功能 *****
【今天内容】
1、客户和联系人的关系映射
客户: 公司 一个 一方
联系人:公司的员工 多个员工 多方 外键在这里
配置实体类关系:双向
客户:一对多
Set<联系人>
联系人:多对一
一个客户实体
客户实体类:
/** * 客户的实体类 * @author * * */ @Entity @Table(name="cst_customer") public class Customer implements Serializable {
@Id @Column(name="cust_id") @GeneratedValue(strategy=GenerationType.IDENTITY)//自增长策略 private Long custId;
@Column(name="cust_name") private String custName;
@Column(name="cust_industry") private String custIndustry;
@Column(name="cust_address") private String custAddress;
@Column(name="cust_phone") private String custPhone;
//==================================== //当前方法是客户:它与字典表实体类是多对一的关系,外键在这里 //@Column(name="cust_source") //1、配置关系 @ManyToOne(targetEntity=BaseDict.class) //2、映射外键 @JoinColumn(name="cust_source",referencedColumnName="dict_id") private BaseDict custSource;
//@Column(name="cust_level") //1、配置关系 @ManyToOne(targetEntity=BaseDict.class) //2、映射外键 @JoinColumn(name="cust_level",referencedColumnName="dict_id") private BaseDict custLevel;
//=============================================================== //配置关系:当前与联系人的关系:一对多 /** * targetEntity:与谁的关系 * mappedBy: 外键的维护是谁来维护,指向的是多的一方的属性名 */ @OneToMany(targetEntity=LinkMan.class,mappedBy="customer") private Set<LinkMan> linkmans = new HashSet<LinkMan>(0);
} |
联系人实体类:
/** * 联系人实体类 * @author * * */ @Entity @Table(name="cst_linkman") public class LinkMan {
@Id @Column(name="lkm_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Long lkmId;
@Column(name="lkm_name") private String lkmName;
@Column(name="lkm_gender") private String lkmGender;
@Column(name="lkm_phone") private String lkmPhone;
@Column(name="lkm_mobile") private String lkmMobile;
@Column(name="lkm_email") private String lkmEmail;
@Column(name="lkm_position") private String lkmPosition;
@Column(name="lkm_memo") private String lkmMemo;
//配置关系:当前与客户的关系:多对一,外键在这里 @ManyToOne(targetEntity=Customer.class) @JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id") private Customer customer;
} |
2、联系人的新增[Jc1]
2.1 跳转到新增联系人页面
1)menu.jsp
2)Action
/** * 联系人动作类 * @author * * */ @Controller("linkmanAction") @Scope("prototype") //========================= @ParentPackage("struts-default") @Namespace("/linkman") public class LinkmanAction extends ActionSupport implements ModelDriven<LinkMan> {
//使用模型驱动封装请求参数 private LinkMan linkman = new LinkMan(); @Override public LinkMan getModel() { return linkman; } //注入CustomerService @Autowired private ICustomerService cs;
//提供一个全局变量 private List<Customer> customers;
/** * 跳转到新增联系人的页面 * @return */ @Action(value="addLinkManUI",results={ @Result(name="addLinkManUI",type="dispatcher",location="/jsp/linkman/add.jsp") }) public String addLinkManUI(){ //先查询出客户列表 customers = cs.findAllCustomer(); return "addLinkManUI"; }
public List<Customer> getCustomers() { return customers; } public void setCustomers(List<Customer> customers) { this.customers = customers; }
}
|
3)Service
沿用客户的service代码
4)dao
沿用客户的dao代码
5)add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <TITLE>添加联系人</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet> <LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2900.3492" name=GENERATOR> </HEAD> <BODY> <s:debug></s:debug> <FORM id=form1 name=form1 action="${pageContext.request.contextPath }/linkman/LinkManServlet?method=addLinkMan" method=post> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg" border=0></TD> <TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg" height=20></TD> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg" border=0></TD> </TR> </TBODY> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15 background="${pageContext.request.contextPath }/images/new_022.jpg"> <IMG src="${pageContext.request.contextPath }/images/new_022.jpg" border=0> </TD> <TD vAlign=top width="100%" bgColor=#ffffff> <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> <TR> <TD class=manageHead>当前位置:联系人管理 > 添加联系人</TD> </TR> <TR> <TD height=2></TD> </TR> </TABLE> <TABLE cellSpacing=0 cellPadding=5 border=0> <tr> <td>所属客户:</td> <td colspan="3"> <s:select name="customer.custId" list="customers" listKey="custId" listValue="custName" headerKey="" headerValue="---请选择---" style="WIDTH: 180px"></s:select>
</td> </tr> <TR> <td>联系人名称:</td> <td> <s:textfield name="lkmName" class="textbox" style="WIDTH: 180px"/> </td> <td>联系人性别:</td> <td> <s:radio list="#{'1':'男','2':'女'}" name="lkmGender"></s:radio> </td> </TR> <TR> <td>联系人办公电话 :</td> <td> <s:textfield name="lkmPhone" class="textbox" style="WIDTH: 180px"/> </td> <td>联系人手机 :</td> <td> <s:textfield name="lkmMobile" class="textbox" style="WIDTH: 180px"/> </td> </TR> <TR> <td>联系人邮箱 :</td> <td> <s:textfield name="lkmEmail" class="textbox" style="WIDTH: 180px"/> </td> <td>联系人职位 :</td> <td> <s:textfield name="lkmPosition" class="textbox" style="WIDTH: 180px"/> </td> </TR> <TR> <td>联系人简介 :</td> <td colspan="2"> <s:textarea name="lkmMemo" rows="5" cols="27"/>
</td> </TR> <tr> <td rowspan=2> <s:submit value="保存"></s:submit> </td> </tr> </TABLE>
</TD> <TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"> <IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0> </TD> </TR> </TBODY> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg" border=0></TD> <TD align="center" width="100%" background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg" border=0></TD> </TR> </TBODY> </TABLE> </FORM> </BODY> </HTML>
|
2.2 联系人的保存
1)add.jsp
2)action
@Autowired private ILinkManService linkmanService;
/** * 保存联系人 * @return */ @Action("addLinkMan") public String addLinkMan(){ System.out.println("参数都在模型中:"+linkman); //调用service进行保存 linkmanService.saveLinkMan(linkman); return SUCCESS; }
|
3)service
/** * 业务层代码:事务在这里控制 * @author * * */ @Service("linkmanService") @Transactional//全局事务 public class LinkManServiceImpl implements ILinkManService {
//注入dao @Autowired private ILinkManDao linkmanDao;
/** * 保存联系人的方法 */ @Override public void saveLinkMan(LinkMan linkman) { linkmanDao.save(linkman); }
}
|
4)dao
/** * 持久层的实现类 * @author * * */ @Repository("linkmanDao") public class LinkManDaoImpl implements ILinkManDao {
//注入模板 @Autowired private HibernateTemplate ht;
/** * 保存联系人 */ @Override public void save(LinkMan linkman) { ht.save(linkman); }
}
|
5)success.jsp
3、联系人的列表功能
1)menu.jsp
2)Action
/** * 客户列表 * @return */ private List<LinkMan> linkmans;//联系人集合 @Action(value="findAllLinkman",results={ @Result(name="findAllLinkman",type="dispatcher",location="/jsp/linkman/list.jsp") }) public String findAllLinkman(){ //调用service查询联系人 linkmans = linkmanService.findAllLinkMan(); return "findAllLinkman"; }
public List<LinkMan> getLinkmans() { return linkmans; } public void setLinkmans(List<LinkMan> linkmans) { this.linkmans = linkmans; }
|
3)Service
/** * 查客户列表 */ @Override @Transactional(propagation=Propagation.SUPPORTS,readOnly=true)//局部事务:不传播、只读 public List<LinkMan> findAllLinkMan() { return linkmanDao.findAllLinkMan(); } |
4)dao
/** * 查询联系人 */ @Override public List<LinkMan> findAllLinkMan() { //离线查询 /** * String sql = "select * from cst_linkman where 1=1 " * sql += " and lkm_name like ? "; * sql += " and lkm_email like ? "; * * * select * from cst_linkman where 1=1 * select * from cst_linkman * 上面两句查询是一模一样的。 * */ DetachedCriteria dc = DetachedCriteria.forClass(LinkMan.class);// 相当于拼接了一条sql语句: select * from cst_linkman where 1=1 //把离线对象** return (List<LinkMan>) ht.findByCriteria(dc); } |
5)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" %> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <TITLE>联系人列表</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet> <LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css rel=stylesheet> <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script> <SCRIPT language=javascript> function to_page(page){ if(page){ $("#page").val(page); } document.customerForm.submit(); } </SCRIPT> <META content="MSHTML 6.00.2900.3492" name=GENERATOR> </HEAD> <BODY> <s:debug></s:debug> <FORM id="customerForm" name="customerForm" action="${pageContext.request.contextPath }/linkman/linkmanServlet?method=listLinkMan" method=post> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg" border=0></TD> <TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg" height=20></TD> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg" border=0></TD> </TR> </TBODY> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15 background="${pageContext.request.contextPath }/images/new_022.jpg"> <IMG src="${pageContext.request.contextPath }/images/new_022.jpg" border=0> </TD> <TD vAlign=top width="100%" bgColor=#ffffff> <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> <TR> <TD class=manageHead>当前位置:联系人管理 > 联系人列表</TD> </TR> <TR> <TD height=2></TD> </TR> </TABLE> <TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <TBODY> <TR> <TD height=25> <TABLE cellSpacing=0 cellPadding=2 border=0> <TBODY> <TR> <TD>联系人名称:</TD> <TD><INPUT class=textbox id=sChannel2 style="WIDTH: 80px" maxLength=50 name="lkmName"></TD> <TD><INPUT class=button id=sButton2 type=submit value=" 筛选 " name=sButton2></TD> </TR> </TBODY> </TABLE> </TD> </TR> <TR> <TD> <TABLE id=grid style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc" cellSpacing=1 cellPadding=2 rules=all border=0> <TBODY> <TR style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none"> <TD>联系人名称</TD> <TD>性别</TD> <TD>办公电话</TD> <TD>手机</TD> <TD>邮箱</TD> <TD>职位</TD> <TD>备注</TD> <TD>所属客户</TD> <TD>操作</TD> </TR> <%-- <c:forEach items="${linkmans }" var="linkman"> <TR style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none"> <TD>${linkman.lkmName }</TD> <TD>${linkman.lkmGender }</TD> <TD>${linkman.lkmPhone }</TD> <TD>${linkman.lkmMobile }</TD> <TD>${linkman.lkmEmail }</TD> <TD>${linkman.lkmPosition }</TD> <TD>${linkman.lkmMemo }</TD> <TD>${linkman.customer.custName}</TD> <TD> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=editLinkManUI&lkmId=${linkman.lkmId}">修改</a> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=deleteLinkMan&lkmId=${linkman.lkmId}">删除</a> </TD> </TR> </c:forEach> --%>
<s:iterator value="linkmans"> <TR style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none"> <TD>${lkmName }</TD> <TD> <s:if test="lkmGender == 1"> 男 </s:if> <s:elseif test="lkmGender == 2"> 女 </s:elseif> <s:else> 隐私 </s:else> </TD> <TD>${lkmPhone }</TD> <TD>${lkmMobile }</TD> <TD>${lkmEmail }</TD> <TD>${lkmPosition }</TD> <TD>${lkmMemo }</TD> <TD>${customer.custName}</TD> <TD> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=editLinkManUI&lkmId=${lkmId}">修改</a> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=deleteLinkMan&lkmId=${lkmId}">删除</a> </TD> </TR> </s:iterator> </TBODY> </TABLE> </TD> </TR> <%-- <TR> <TD> <SPAN id=pagelink> <DIV style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right"> 共[<B>${total}</B>]条记录,[<B>${totalPage}</B>]页 ,每页显示 <select name="pageSize"> <option value="1" <c:if test="${pageSize==1 }">selected</c:if>>1</option> <option value="30" <c:if test="${pageSize==30 }">selected</c:if>>30</option> </select> 条 [<A href="javascript:to_page(${page-1})">前一页</A>] <B>${page}</B> [<A href="javascript:to_page(${page+1})">后一页</A>] 到 <input type="text" size="3" id="page" name="page" /> 页 <input type="button" value="Go" onclick="to_page()"/> </DIV> </SPAN> </TD> </TR> --%> </TBODY> </TABLE> </TD> <TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"> <IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0> </TD> </TR> </TBODY> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg" border=0></TD> <TD align="center" width="100%" background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg" border=0></TD> </TR> </TBODY> </TABLE> </FORM> </BODY> </HTML>
|
4、联系人的查询功能
1)list.jsp
<TD>联系人名称:</TD> <TD> <s:textfield name="lkmName" class="textbox" style="WIDTH: 120px"/> </TD> <TD>联系人邮箱:</TD> <TD> <s:textfield name="lkmEmail" class="textbox" style="WIDTH: 120px"/> </TD> <TD>联系人备注:</TD> <TD> <s:textfield name="lkmMemo" class="textbox" style="WIDTH: 120px"/> </TD> <TD>所属客户:</TD> <TD> <s:select name="customer.custId" list="customers" listKey="custId" listValue="custName" headerKey="" headerValue="---请选择---" style="WIDTH: 180px"></s:select> </TD> <TD> <s:submit value="查询"></s:submit> </TD> |
2)Action
private List<LinkMan> linkmans;//联系人集合 @Action(value="findAllLinkman",results={ @Result(name="findAllLinkman",type="dispatcher",location="/jsp/linkman/list.jsp") }) public String findAllLinkman(){
//接收参数 System.out.println("参数都在模型中:"+linkman); //离线查询对象 DetachedCriteria dc = DetachedCriteria.forClass(LinkMan.class); //把参数添加到离线查询对象中 //联系人名称 //if(linkman.getLkmName()!=null && !"".equals(linkman.getLkmName())){ if(StringUtils.isNotBlank(linkman.getLkmName())){ dc.add(Restrictions.like("lkmName", "%"+linkman.getLkmName()+"%")); }
//联系人邮箱 if(StringUtils.isNotBlank(linkman.getLkmEmail())){ dc.add(Restrictions.like("lkmEmail", "%"+linkman.getLkmEmail()+"%")); }
//联系人备注 if(StringUtils.isNotBlank(linkman.getLkmMemo())){ dc.add(Restrictions.like("lkmMemo", "%"+linkman.getLkmMemo()+"%")); }
//所属客户 if(linkman.getCustomer()!=null && linkman.getCustomer().getCustId()!=null){ dc.add(Restrictions.eq("customer.custId", linkman.getCustomer().getCustId())); }
//调用service查询联系人 linkmans = linkmanService.findAllLinkMan(dc); //查询客户的列表 customers = cs.findAllCustomer(); return "findAllLinkman"; } |
3)Service
4)Dao
5)list.jsp
5、联系人的分页功能
1)分析分页的思路
2)编写PageBean对象
/** * 分页对象 * @author * * */ public class Page {
private int currentPageNum;//当前页 * private int pageSize = 3;//每页显示几条 * private int totalRecords;//总记录数 * private int startIndex;//开始记录索引 * private int totalPageNum;//总页数 * private int prePageNum;//上一页 * private int nextPageNum;//下一页 * private List records;//封装当前页数据
/** * 有参的构造方法,想用此类,必须传入两个参数 * @param currentPageNum 当前页 * @param totalRecords 总记录数 */ public Page(int currentPageNum, int totalRecords) { super(); this.currentPageNum = currentPageNum; this.totalRecords = totalRecords;
//开始记录索引 startIndex = (currentPageNum-1)*pageSize; //总页数 totalPageNum = totalRecords%pageSize==0 ? totalRecords/pageSize : totalRecords/pageSize+1; }
//上一页 public int getPrePageNum() { prePageNum = currentPageNum-1; if(prePageNum<1){ prePageNum = 1; } return prePageNum; }
//下一页 public int getNextPageNum() { nextPageNum = currentPageNum + 1; if(nextPageNum > totalPageNum){ nextPageNum = totalPageNum; } return nextPageNum; }
public int getCurrentPageNum() { return currentPageNum; }
public void setCurrentPageNum(int currentPageNum) { this.currentPageNum = currentPageNum; }
public int getPageSize() { return pageSize; }
public void setPageSize(int pageSize) { this.pageSize = pageSize; }
public int getTotalRecords() { return totalRecords; }
public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; }
public int getStartIndex() { return startIndex; }
public void setStartIndex(int startIndex) { this.startIndex = startIndex; }
public int getTotalPageNum() { return totalPageNum; }
public void setTotalPageNum(int totalPageNum) { this.totalPageNum = totalPageNum; }
public List getRecords() { return records; }
public void setRecords(List records) { this.records = records; }
public void setPrePageNum(int prePageNum) { this.prePageNum = prePageNum; }
public void setNextPageNum(int nextPageNum) { this.nextPageNum = nextPageNum; }
}
|
3)改造Dao
/** * 查询联系人 */ @Override public List<LinkMan> findAllLinkMan(DetachedCriteria dc,int firstResult,int maxResult) {
//清空统计查询语句 dc.setProjection(null); return (List<LinkMan>) ht.findByCriteria(dc, firstResult, maxResult); }
/** * 查询总记录数 * @param dc 条件 * * select count(*) from 表 where 条件 * * @return */ @Override public int findTotalRecords(DetachedCriteria dc) { //此时传进来的离线对象dc 相当于: from LinkMan where dc dc.setProjection(Projections.rowCount());//往sql语句中添加统计查询: select count(*) //执行 List<Long> list = (List<Long>) ht.findByCriteria(dc); //处理返回的数据 return list.isEmpty()? 0 :list.get(0).intValue(); }
|
4)改造Service
/** * 查客户列表 */ @Override @Transactional(propagation=Propagation.SUPPORTS,readOnly=true)//局部事务:不传播、只读 public Page findAllLinkMan(DetachedCriteria dc,String num) {
//1、判断当前页 int currentPageNum = 1; if(StringUtils.isNotBlank(num)){ currentPageNum = Integer.parseInt(num); } //2、查总记录数 int totalRecords = linkmanDao.findTotalRecords(dc);
//3、实例化page对象 Page page = new Page(currentPageNum, totalRecords);
//4、查询出当前页的数据 List<LinkMan> list = linkmanDao.findAllLinkMan(dc, page.getStartIndex(), page.getPageSize());
//5、封装到page对象中 page.setRecords(list);
//6、返回page对象 return page;
} |
5)改造Action
/** * 联系人动作类 * @author * * */ @Controller("linkmanAction") @Scope("prototype") //========================= @ParentPackage("struts-default") @Namespace("/linkman") @Results({ @Result(name="success",type="dispatcher",location="/jsp/success.jsp")//全局视图 }) public class LinkmanAction extends ActionSupport implements ModelDriven<LinkMan> {
//使用模型驱动封装请求参数 private LinkMan linkman = new LinkMan(); @Override public LinkMan getModel() { return linkman; } //注入CustomerService @Autowired private ICustomerService cs; @Autowired private ILinkManService linkmanService;
//提供一个全局变量 private List<Customer> customers;
/** * 跳转到新增联系人的页面 * @return */ @Action(value="addLinkManUI",results={ @Result(name="addLinkManUI",type="dispatcher",location="/jsp/linkman/add.jsp") }) public String addLinkManUI(){ //先查询出客户列表 customers = cs.findAllCustomer(); return "addLinkManUI"; }
/** * 保存联系人 * @return */ @Action("addLinkMan") public String addLinkMan(){ System.out.println("参数都在模型中:"+linkman); //调用service进行保存 linkmanService.saveLinkMan(linkman); return SUCCESS; }
/** * 客户列表 * @return */ private String num;//属性驱动封装当前页的数字 private List<LinkMan> linkmans;//联系人集合 @Action(value="findAllLinkman",results={ @Result(name="findAllLinkman",type="dispatcher",location="/jsp/linkman/list.jsp") }) public String findAllLinkman(){
//接收参数 System.out.println("参数都在模型中:"+linkman); //离线查询对象 DetachedCriteria dc = DetachedCriteria.forClass(LinkMan.class); //把参数添加到离线查询对象中 //联系人名称 //if(linkman.getLkmName()!=null && !"".equals(linkman.getLkmName())){ if(StringUtils.isNotBlank(linkman.getLkmName())){ dc.add(Restrictions.like("lkmName", "%"+linkman.getLkmName()+"%")); }
//联系人邮箱 if(StringUtils.isNotBlank(linkman.getLkmEmail())){ dc.add(Restrictions.like("lkmEmail", "%"+linkman.getLkmEmail()+"%")); }
//联系人备注 if(StringUtils.isNotBlank(linkman.getLkmMemo())){ dc.add(Restrictions.like("lkmMemo", "%"+linkman.getLkmMemo()+"%")); }
//所属客户 if(linkman.getCustomer()!=null && linkman.getCustomer().getCustId()!=null){ dc.add(Restrictions.eq("customer.custId", linkman.getCustomer().getCustId())); }
//调用service查询联系人 //linkmans = linkmanService.findAllLinkMan(dc); Page page = linkmanService.findAllLinkMan(dc, num); //压入栈顶 ActionContext.getContext().getValueStack().push(page);
//查询客户的列表 customers = cs.findAllCustomer(); return "findAllLinkman"; }
public List<Customer> getCustomers() { return customers; } public void setCustomers(List<Customer> customers) { this.customers = customers; } public List<LinkMan> getLinkmans() { return linkmans; } public void setLinkmans(List<LinkMan> linkmans) { this.linkmans = linkmans; } public String getNum() { return num; } public void setNum(String num) { this.num = num; }
}
|
6)改造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" %> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <TITLE>联系人列表</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <LINK href="${pageContext.request.contextPath }/css/Style.css" type=text/css rel=stylesheet> <LINK href="${pageContext.request.contextPath }/css/Manage.css" type=text/css rel=stylesheet> <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script> <SCRIPT language=javascript> //跳转到某一页:传入的page其实就是当前页 function to_page(page){ //把当前页传入表单中 if(page){ $("#page").val(page); } //提交表 document.abc.submit(); } </SCRIPT> <META content="MSHTML 6.00.2900.3492" name=GENERATOR> </HEAD> <BODY> <s:debug></s:debug> <FORM id="abc" name="abc" action="${pageContext.request.contextPath }/linkman/findAllLinkman.action" method=post> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_019.jpg" border=0></TD> <TD width="100%" background="${pageContext.request.contextPath }/images/new_020.jpg" height=20></TD> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_021.jpg" border=0></TD> </TR> </TBODY> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15 background="${pageContext.request.contextPath }/images/new_022.jpg"> <IMG src="${pageContext.request.contextPath }/images/new_022.jpg" border=0> </TD> <TD vAlign=top width="100%" bgColor=#ffffff> <TABLE cellSpacing=0 cellPadding=5 width="100%" border=0> <TR> <TD class=manageHead>当前位置:联系人管理 > 联系人列表</TD> </TR> <TR> <TD height=2></TD> </TR> </TABLE> <TABLE borderColor=#cccccc cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <TBODY> <TR> <TD height=25> <TABLE cellSpacing=0 cellPadding=2 border=0> <TBODY> <TR> <TD>联系人名称:</TD> <TD> <s:textfield name="lkmName" class="textbox" style="WIDTH: 120px"/> </TD> <TD>联系人邮箱:</TD> <TD> <s:textfield name="lkmEmail" class="textbox" style="WIDTH: 120px"/> </TD> <TD>联系人备注:</TD> <TD> <s:textfield name="lkmMemo" class="textbox" style="WIDTH: 120px"/> </TD> <TD>所属客户:</TD> <TD> <s:select name="customer.custId" list="customers" listKey="custId" listValue="custName" headerKey="" headerValue="---请选择---" style="WIDTH: 180px"></s:select> </TD> <TD> <s:submit value="查询"></s:submit> </TD> </TR> </TBODY> </TABLE> </TD> </TR> <TR> <TD> <TABLE id=grid style="BORDER-TOP-WIDTH: 0px; FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 0px; BORDER-BOTTOM-COLOR: #cccccc; WIDTH: 100%; BORDER-TOP-COLOR: #cccccc; FONT-STYLE: normal; BACKGROUND-COLOR: #cccccc; BORDER-RIGHT-WIDTH: 0px; TEXT-DECORATION: none; BORDER-RIGHT-COLOR: #cccccc" cellSpacing=1 cellPadding=2 rules=all border=0> <TBODY> <TR style="FONT-WEIGHT: bold; FONT-STYLE: normal; BACKGROUND-COLOR: #eeeeee; TEXT-DECORATION: none"> <TD>联系人名称</TD> <TD>性别</TD> <TD>办公电话</TD> <TD>手机</TD> <TD>邮箱</TD> <TD>职位</TD> <TD>备注</TD> <TD>所属客户</TD> <TD>操作</TD> </TR> <%-- <c:forEach items="${linkmans }" var="linkman"> <TR style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none"> <TD>${linkman.lkmName }</TD> <TD>${linkman.lkmGender }</TD> <TD>${linkman.lkmPhone }</TD> <TD>${linkman.lkmMobile }</TD> <TD>${linkman.lkmEmail }</TD> <TD>${linkman.lkmPosition }</TD> <TD>${linkman.lkmMemo }</TD> <TD>${linkman.customer.custName}</TD> <TD> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=editLinkManUI&lkmId=${linkman.lkmId}">修改</a> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=deleteLinkMan&lkmId=${linkman.lkmId}">删除</a> </TD> </TR> </c:forEach> --%>
<s:iterator value="records"> <TR style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none"> <TD>${lkmName }</TD> <TD> <s:if test="lkmGender == 1"> 男 </s:if> <s:elseif test="lkmGender == 2"> 女 </s:elseif> <s:else> 隐私 </s:else> </TD> <TD>${lkmPhone }</TD> <TD>${lkmMobile }</TD> <TD>${lkmEmail }</TD> <TD>${lkmPosition }</TD> <TD>${lkmMemo }</TD> <TD>${customer.custName}</TD> <TD> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=editLinkManUI&lkmId=${lkmId}">修改</a> <a href="${pageContext.request.contextPath }/linkman/LinkManServlet?method=deleteLinkMan&lkmId=${lkmId}">删除</a> </TD> </TR> </s:iterator> </TBODY> </TABLE> </TD> </TR> <TR> <TD> <SPAN id=pagelink> <DIV style="LINE-HEIGHT: 20px; HEIGHT: 20px; TEXT-ALIGN: right"> 共[<B>${totalRecords}</B>]条记录,共[<B>${totalPageNum}</B>]页
[<A href="javascript:to_page(${prePageNum})">前一页</A>] <B>${currentPageNum}</B> [<A href="javascript:to_page(${nextPageNum})">后一页</A>] 到 <input type="text" size="3" id="page" name="num" /> 页 <input type="button" value="Go" onclick="to_page()"/> </DIV> </SPAN> </TD> </TR> </TBODY> </TABLE> </TD> <TD width=15 background="${pageContext.request.contextPath }/images/new_023.jpg"> <IMG src="${pageContext.request.contextPath }/images/new_023.jpg" border=0> </TD> </TR> </TBODY> </TABLE> <TABLE cellSpacing=0 cellPadding=0 width="98%" border=0> <TBODY> <TR> <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_024.jpg" border=0></TD> <TD align="center" width="100%" background="${pageContext.request.contextPath }/images/new_025.jpg" height=15></TD> 【课程回顾】1、常用的struts2标签总结
2、常用注解总结1)Hibernate框架的
2)Struts2框架的
3)Spring框架的
【课程目标】1、能够实现客户和联系人的一对多关系映射 ***** 2、能够独立实现联系人的增删改功能 3、能够独立开发联系人列表功能 4、能够独立开发客户和联系人的分页功能 *****
【今天内容】
1、客户和联系人的关系映射客户: 公司 一个 一方 联系人:公司的员工 多个员工 多方 外键在这里
配置实体类关系:双向 客户:一对多 Set<联系人> 联系人:多对一 一个客户实体
客户实体类:
联系人实体类:
2、联系人的新增[Jc1]2.1 跳转到新增联系人页面1)menu.jsp2)Action
3)Service沿用客户的service代码 4)dao沿用客户的dao代码 5)add.jsp
2.2 联系人的保存1)add.jsp2)action
3)service
4)dao
5)success.jsp
3、联系人的列表功能1)menu.jsp2)Action
3)Service
4)dao
5)list.jsp
4、联系人的查询功能1)list.jsp
2)Action
3)Service4)Dao5)list.jsp
5、联系人的分页功能1)分析分页的思路
2)编写PageBean对象
3)改造Dao
4)改造Service
5)改造Action
6)改造list.jsp
<TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg" border=0></TD> </TR> </TBODY> </TABLE> </FORM> </BODY> </HTML>
|