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

标签属性:

名称

必选

类型

说明

test

yes

Boolean

表达式,决定是否显示if/elseif标签体的内容

 

欢迎${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框架的

1IOC的注解

@Component :创建对象

@Controller   :创建对象

@Service     :创建对象

@Repository  :创建对象

@Autowired   : 根据类型自动装配

@ Qualifier    : 与上面的Autowired一起用,目的根据id获取对象

@Resource     : 可以根据类型装配,也可以根据id装配,name属性就是bean的id

@Value       : 注入基本类型和字符串类型

@Scope    : 单例与多例的问题,singletonprototype  request  session

@Configuration : 定义配置类,用于替换spring中的xml文件的

@ComponentScan: 扫描包下的bean对象

@PropertySource : 指定的配置文件

@Bean :  用在方法上面,创建对象的,根据方法的返回类型

@Import: 导入其他的配置类

 

 

2AOP的常用注解

@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>当前位置:联系人管理 &gt; 添加联系人</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>当前位置:联系人管理 &gt; 联系人列表</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>

                                                    &nbsp;&nbsp;

                                                    <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>

                                                    &nbsp;&nbsp;

                                                    <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>当前位置:联系人管理 &gt; 联系人列表</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>

                                                    &nbsp;&nbsp;

                                                    <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>

                                                    &nbsp;&nbsp;

                                                    <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标签总结

1.使用Struts2的常用逻辑标签

1.1 property标签

(1)功能说明

获取对象的属性值,目标对象默认位于ValueStack栈顶

(2)标签属性

eg:<s:property value="user.userName"/>

 

1.2 if-elseif-else标签

功能说明:

替代Java语法中的if/else

标签属性:

名称

必选

类型

说明

test

yes

Boolean

表达式,决定是否显示if/elseif标签体的内容

 

欢迎${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框架的

1IOC的注解

@Component :创建对象

@Controller   :创建对象

@Service     :创建对象

@Repository  :创建对象

@Autowired   : 根据类型自动装配

@ Qualifier    : 与上面的Autowired一起用,目的根据id获取对象

@Resource     : 可以根据类型装配,也可以根据id装配,name属性就是bean的id

@Value       : 注入基本类型和字符串类型

@Scope    : 单例与多例的问题,singletonprototype  request  session

@Configuration : 定义配置类,用于替换spring中的xml文件的

@ComponentScan: 扫描包下的bean对象

@PropertySource : 指定的配置文件

@Bean :  用在方法上面,创建对象的,根据方法的返回类型

@Import: 导入其他的配置类

 

 

2AOP的常用注解

@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>当前位置:联系人管理 &gt; 添加联系人</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>当前位置:联系人管理 &gt; 联系人列表</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>

                                                    &nbsp;&nbsp;

                                                    <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>

                                                    &nbsp;&nbsp;

                                                    <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>当前位置:联系人管理 &gt; 联系人列表</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>

                                                    &nbsp;&nbsp;

                                                    <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>

                                                    &nbsp;&nbsp;

                                                    <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>

                    <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg" border=0></TD>

                </TR>

            </TBODY>

        </TABLE>

    </FORM>

</BODY>

</HTML>

 

 

 

 

 

 

 

 


 

                    <TD width=15><IMG src="${pageContext.request.contextPath }/images/new_026.jpg" border=0></TD>

                </TR>

            </TBODY>

        </TABLE>

    </FORM>

</BODY>

</HTML>

 

 

 

 

 

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值