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>