Struts2+Spring整合 火推03

Java框架

浏览数:44

2020-7-4


day03

 

Struts2+Spring整合

整合结构

整合步骤

1:搭建Struts2的框架

    1:导包
    2:配置启动容器web.xml
    3:增加配置文件struts.xml



2:搭建Spring的框架

    1:导包

        spring-webMVC

    2:配置启动容器web.xml

        connect-param

    3:增加配置文件信息applicationcontext.xml

        扫描包@controller


3:增加struts-spring-plugin.jar包

整合请求流程

原来: 

    请求---filter控制器----action----reslut---jsp

现在:   

    请求---filter控制器(struts2-web.xml)---spring(applicationcontext.xml----id-----action(controller))---result(struts2)---jsp

重构代码

1:导包

    <!-- springMVC的依赖包  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- 整合struts2和spring的插件包 -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-spring-plugin</artifactId>
        <version>2.5.13</version>
    </dependency>

2:修改web.xml

    <!-- 配置spring的属性文件信息 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

3:增加spring的配置文件信息

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 扫描包 -->
    <context:component-scan base-package="com.xdl.action"/>
</beans>

4:修改action,增加注解

    @Controller
    //id------helloAction
    @Scope(value = "prototype")
    public class HelloAction {......
    }

5:修改struts.xml,class修改为spring的bean组件ID

    <action name="list" class="listAction" method="execute">
        <result name="success" type="dispatcher">/WEB-INF/jsp/list.jsp</result>
    </action>

结合jdbc实现查询功能

数据库脚本:

新建一个笔记表note:

CREATE TABLE `note` (
  `id` int(30) NOT NULL AUTO_INCREMENT,
  `context` varchar(200) DEFAULT NULL,
  `publishTime` date DEFAULT NULL,
  `likeCount` int(11) DEFAULT NULL,
  `userId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

增加并初始化一些测试数据

1:导包(mysql驱动包、c3p0连接池包、spring-jdbc包)

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- c3p0 -->
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>

    <!-- mysql驱动包 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.24</version>
    </dependency>

2:根据数据库表note字段信息,添加note对应的实体类对象信息Note.java

private Integer id; //主键ID
private String context;//内容
private Date publishTime;//发布时间
private Integer likeCount;//收藏人数
private Integer userId;//发布人ID

    增加getter和setter方法

3:添加数据库连接信息和扫描包信息applicationcontext.xml中

<context:component-scan base-package="com.xdl.dao"/>

<!-- 数据库连接信息配置 -->
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="c3p0"/>
</bean>

<bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="root"/>
    <property name="password" value="123456"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
</bean>

4:编写NoteDao接口类

/**
 * 根据用户id,查询用户的笔记列表
 * @param userId
 * @return
 */
public List<Note> queryNoteByuserId(Integer userId);

5:编写NoteDaoImpl.java来实现NoteDao接口类

@Repository
public class NoteDaoImpl implements NoteDao{

//  @Autowired  //按照类型匹配
    @Resource  // 首先按照名称匹配 ,然后按照类型匹配
    private JdbcTemplate template;

    @Override
    public List<Note> queryNoteByuserId(Integer userId) {
        String sql = "select id,context,publishTime,likeCount,userId from note where userID=?";
        Object[] params = {userId};
        List<Note> list = template.query(sql, params, new NoteMapper());
        return list;
    }
}

6:添加NoteMapper类

public class NoteMapper implements RowMapper{

    @Override
    public Object mapRow(ResultSet rs, int rownum) throws SQLException {
        Note note = new Note();
        note.setId(rs.getInt("id"));
        note.setContext(rs.getString("context"));
        note.setLikeCount(rs.getInt("likeCount"));
        note.setPublishTime(rs.getDate("publishTime"));
        note.setUserId(rs.getInt("userId"));
        return note;
    }
}

7:修改ListAction

/**
 * 列表展示
 * @author likang
 * @date   2018-1-8 下午2:43:23
 */
@Controller//id-----listAction
@Scope(value = "prototype")
public class ListAction {

//  public List<Dept> listDept;
    public List<Note> listNote;

    @Resource
    private NoteDao noteDao;

    public String execute(){
//      listDept = new ArrayList<Dept>();
//      for (int i = 0; i < 10; i++) {
//          Dept dept = new Dept();
//          dept.setId(Long.valueOf(i));
//          dept.setDeptName("java13_"+i);
//          dept.setDeptNote("BeiJing"+i);
//          listDept.add(dept);
//      }

        listNote = noteDao.queryNoteByuserId(1);
        return "success";
    }

    public List<Note> getListNote() {
        return listNote;
    }

    public void setListNote(List<Note> listNote) {
        this.listNote = listNote;
    }

//  public List<Dept> getListDept() {
//      return listDept;
//  }
//
//  public void setListDept(List<Dept> listDept) {
//      this.listDept = listDept;
//  }
}

8:修改list.jsp文件

<table>
    <c:forEach items="${listNote }" var="note">
        <tr>
            <td>${note.id }</td>
            <td>${note.context }</td>
            <td>${note.publishTime }</td>       
        </tr>
    </c:forEach>
</table>

9:重新部署启动,并访问

结合jdbc实现删除功能(使用redirectAction)

1:修改list.jsp页面,增加删除功能按钮

<td><a href="delete.do?id=${note.id }" />删除</td>

2:修改struts.xml配置文件信息,增加delete的action

<!-- 删除操作 -->
    <!-- <action name="delete" class="deleteAction" method="execute">
        <result name="success" type="dispatcher">/WEB-INF/jsp/list.jsp</result>
        <result name="error" type="dispatcher">/WEB-INF/jsp/error.jsp</result>
    </action> -->
    <action name="delete" class="deleteAction" method="execute">
        <result name="success" type="redirectAction">
            <param name="namespace">/demo</param><!-- 代表的是执行成功后的action命名空间  -->
            <param name="actionName">list</param><!-- 代表的是执行成功后重定向的action中的name值  -->
        </result>
        <result name="error" type="dispatcher">/WEB-INF/jsp/error.jsp</result>
    </action>

    <!-- 前提:两个action在同一个namespace下面,不建议使用 -->
    <!-- <action name="delete" class="deleteAction" method="execute">
        <result name="success" type="redirectAction">
            list
        </result>
        <result name="error" type="dispatcher">/WEB-INF/jsp/error.jsp</result>
    </action> -->

3:添加DeleteAction.java

/**
 * 删除功能操作
 * @author likang
 * @date   2018-1-9 下午2:22:02
 */
@Controller
@Scope(value="prototype")
public class DeleteAction {

    private Integer id;//接收请求中删除操作的数据ID

    @Resource
    private NoteDao noteDao;

    public String execute(){
        int count = noteDao.deleteNoteById(id);
        if (count > 0) {
            return "success";
        }
        return "error";
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}

4:在接口NoteDao中增加删除的方法接口

/**
 * 根据主键ID,删除笔记信息
 * @param id 主键ID
 * @return
 */
public int deleteNoteById(Integer id);

5:实现接口中的方法

@Override
public int deleteNoteById(Integer id) {
    String sql = "delete from note where id=?";
    return template.update(sql, id);
}

6:添加错误提示页面error.jsp

<h1>程序处理异常.....</h1>

7:部署、启动、访问

抽取数据库属性文件

jdbc.properties

user=root
password=123456
jdbcUrl=jdbc\:mysql\://localhost\:3306/test?useUnicode\=true&characterEncoding\=utf-8
driverClass=com.mysql.jdbc.Driver

applicationcontext.xml:

<!-- 引用外部的属性文件到spring的配置文件中 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- 数据库连接信息配置 -->
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="c3p0"/>
</bean>

<bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="user" value="${user}"/>
    <property name="password" value="${password}"/>
    <property name="jdbcUrl" value="${jdbcUrl}"/>
    <property name="driverClass" value="${driverClass}"/>
</bean>

登录页面功能、登录按钮实现

需求:

struts.xml:

<!-- 登录、用户功能 -->
<package name="user" extends="struts-default" namespace="/user">
    <!-- 跳转登录页,使用默认配置 -->
    <action name="toLogin">
        <result>/WEB-INF/jsp/login.jsp</result>
    </action>

    <!-- 登录按钮功能 -->
    <action name="login" class="loginAction" method="execute">
        <result name="success" type="dispatcher">/WEB-INF/jsp/ok.jsp</result>
        <!-- <result name="error" type="dispatcher">/WEB-INF/jsp/error.jsp</result> -->
        <!-- <result name="error" type="redirectAction">
            toLogin
        </result> -->
        <result name="error" type="dispatcher">/WEB-INF/jsp/login.jsp</result>
    </action>
</package>

LoginAction.java:

/**
 * 登录功能
 * @author likang
 * @date   2018-1-9 下午4:37:09
 */
@Controller
@Scope("prototype")
public class LoginAction {

    private String username;//接收请求参数用户名
    private String password;//接收请求参数密码

    private String msg;//将错误信息,传输到前端页面

    public String execute(){

        if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) {
            if ("admin".equals(username) && "123123".equals(password)) {
                return "success";
            }
        }
        msg="用户名或者密码错误";
        return "error";
    }

    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

login.jsp:

<body>

    <h1>登录页面</h1>
    <span style="color: red;">${msg }</span>
    <form action="login.do" method="post">
        用户名:<input id="username" name="username" type="text"><br/>
        密码:<input id="password" name="password" type="password"><br/>
        <input type="submit" value="登录">
    </form>

</body>

ok.jsp:

<h1>登录成功,欢迎访问</h1>
<a href="toLogin.do">退出</a>

登录使用session

struts2组件列表

作者:1350048638