JAVAEE第六次作业-SpringMVC+Spring+mybatis 项目实践
注:由于对SSM框架很陌生,配置文件部分自己弄了很久也不清楚,配置文件部分内容参考了罗付强同学的博客https://www.cnblogs.com/lfq4588/p/13094221.html
一、任务
使用ssm重新开发计科院新闻网站
二、创建SSM框架环境
2.1 新建Maven项目
方便对需要用的包进行管理
Maven导入需要用到的包
<dependencies>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--Servlet - JSP -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
2.2 添加Web环境支持
2.3 创建SSM项目文件结构
- Controller:用于将service的结果展示在前端页面
- mapper:mabatis映射接口,编写SQL语句
- pojo:实体类
- service:业务层,和Controller进行交互
2.4 编写配置文件代码
- applicationContext.xml
<?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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启注解的扫描,希望处理service和dao,controller不需要Spring框架去处理-->
<context:component-scan base-package="com.example" >
<!--配置哪些注解不扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--Spring整合MyBatis框架-->
<!--配置连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/users?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
<!--配置SqlSessionFactory工厂-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置Dao接口所在包-->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
<!--配置Spring框架声明式事务管理-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!--配置AOP增强-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.example.service.impl.*ServiceImpl.*(..))"/>
</aop:config>
</beans>
- springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解扫描,只扫描Controller注解-->
<context:component-scan base-package="com.example">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--配置的视图解析器对象-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- JSP文件所在的目录 -->
<property name="prefix" value="/"/>
<!-- 文件的后缀名 -->
<property name="suffix" value=".jsp"/>
</bean>
<!--过滤静态资源-->
<mvc:resources location="css/" mapping="/css/**" />
<mvc:resources location="js/" mapping="/js/**" />
<mvc:resources location="image/" mapping="/image/**" />
<mvc:resources location="UEditor/" mapping="/UEditor/**" />
<mvc:resources location="images/" mapping="/images/**" />
<mvc:resources location="page/" mapping="/page/**" />
<!--开启SpringMVC注解的支持-->
<mvc:annotation-driven/>
</beans>
三、完成SSM项目代码
编写代码之前,可以将MVC Model2中的Web资源拷贝到该项目,代码部分也可以简单修改转换为ssm的形式
3.1 pojo实体类编写
此处用到了lombok工具,实体类就不用编写复杂的get set方法了
//用户实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
String uName=""; //用户名
String uPwd=""; //用户密码
}
//新闻实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class News {
private String newsId;
private String title;
private String newsContent;
private String author;
private String newsDate;
}
3.2 编写mapper数据库映射
- UserMapper
@Repository
public interface UserMapper {
//判断当前账号是否正确
@Select("select * from users_info where UID = #{UID} AND UPWD = #{UPWD}")
UserInfo isUserExist(UserInfo userInfo);
}
- NewsMapper
@Repository
public interface NewsMapper {
//增加新闻
@Insert("insert into users.news (NewID,Title, NewsContent, Author, NewsDate)
" +
" values (#{NewID},#{Title},#{NewsContent},#{Author},#{NewsDate});")
int addNews(News news);
//删除新闻
@Delete(" delete from users.news where NewID = #{NewID};")
int deleteNewsById(@Param("NewID") String newId);
//修改新闻
@Update("update users.news
" +
"set Title=#{Title},NewsContent=#{NewsContent},Author=#{Author},NewsDate=#{NewsDate}
" +
"where NewID = #{NewID};")
int updateNewsById(News news);
//查询一条新闻
@Select("select * from users.news where NewID = #{NewID};")
News queryNewsById(@Param("NewID") String newId);
//查询所有新闻
@Select("select * from users.news;")
List<News> queryAllNews();
}
3.3 编写service的实现
- NewsServiceImpl
@Service("NewsService")
public class NewsServiceImpl implements NewsService {
//service调dao层 组合mapper
@Autowired
private NewsMapper newsMapper;
public void setNewsMapper(NewsMapper newsMapper) {
//可增加其他代码
this.newsMapper = newsMapper;
}
public boolean addNews(News news) {
int rows = newsMapper.addNews(news);
if (rows > 0) {
return true;
} else {
return false;
}
}
public boolean deleteNewsById(String newId) {
int rows = newsMapper.deleteNewsById(newId);
if (rows > 0) {
return true;
} else {
return false;
}
}
public boolean updateNewsById(News news) {
int rows = newsMapper.updateNewsById(news);
if (rows > 0) {
return true;
} else {
return false;
}
}
public News queryNewsById(String newId) {
return newsMapper.queryNewsById(newId);
}
public List<News> queryAllNews() {
return newsMapper.queryAllNews();
}
}
- UserServiceImpl
@Service("UserService")
public class UserServiceImpl implements UserService {
//service调dao层 组合mapper
@Autowired
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
//账号结果是否正确
public boolean isUserExist(UserInfo userInfo) {
UserInfo quertRes = userMapper.isUserExist(userInfo);
if (quertRes == null) {
return false;
}
if (quertRes.getUID() != null && quertRes.getUPWD() != null) {
return true;
} else {
return false;
}
}
}
3.4 编写controller
- UserController
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/login")
public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UserInfo user = new UserInfo();
user.setUID(username);
user.setUPWD(password);
boolean b = userService.isUserExist(user);
if (b) {
response.sendRedirect("page/index.html");
} else {
response.sendRedirect("index.jsp");
}
}
}
- NewsController(由于内容太多,只展示部分)
@RequestMapping("/viewNew")
public void viewNew(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String newsID = request.getParameter("newid");
System.out.println(newsID);
News news = null;
news = newsService.queryNewsById(newsID);
System.out.println(news.getNewID());
System.out.println(news.getNewsContent());
System.out.println(news.getNewsDate());
System.out.println(news.getAuthor());
request.setAttribute("news", news);
//转发到content.jsp
request.getRequestDispatcher("NewsContent.jsp").forward(request, response);
}
四、效果实现
效果与MVC Model2作业类似,但是SSM实现起来更方便了
- 删除编号为7的新闻
成功实现删除功能
- 添加新闻,点击左上方按钮即可
- 跳转到新闻管理表单
- 点写完内容点击更新
- 成功添加新闻
- 点击编辑按钮开始修改新闻内容
- 修改部分内容
成功完成修改
- 点击查看新闻即可跳转到新闻详细界面中
- 官网效果实现
跳转后页面