SSM-IM-Project项目整合
一:贴吧项目需求分析
二:贴吧项目搭建
1、web框架搭建
2、jar包支持+依赖
3、tomcat配置+依赖
4、包的分层
resources包
——mapper【dao接口实现类,进行控制器数据库】
——spring
src包
——po包【实体类】
——dao包【用户数据接口】
——service包【用户服务层】
——web包【controller,控制器】
——vo包【多表联查的包】
——tools包【工具】
test包
——dao包【用来测试dao】
——service【用来测试service】
5、web.xml配置
三、贴吧项目实现–3大步骤
第一步
po包写实体类 -->dao包写接口类 {对应.xml 文件配置,相当于实现类,进行调用数据库连接} -->test测试
3.1.1 实体类po包 User类
package com.sunsky.po;
/**
* @className: ${大数据学习}.
* @description: 用户类
* @Theme:
* @author:xgh
* @create-day: 2024-02-20 16:27
*/
public class User {
private int uid;
private String uuid;
private String name;
private String tel;
private String pass;
/**
* 角色编号(外键)
*/
private int rid;
public User() {
}
public User(int uid, String uuid, String name, String tel, int rid,String pass) {
this.uid = uid;
this.uuid = uuid;
this.name = name;
this.tel = tel;
this.pass = pass;
this.rid = rid;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uuid='" + uuid + '\'' +
", name='" + name + '\'' +
", tel='" + tel + '\'' +
", pass='" + pass + '\'' +
", rid=" + rid +
'}';
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public int getRid() {
return rid;
}
public void setRid(int rid) {
this.rid = rid;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
3.2.1 dao包中user的接口
在接口中进行定义方法接口【实现业务功能】(增删改查)
package com.sunsky.dao;
import com.sunsky.po.User;
import com.sunsky.vo.UserVO;
import java.util.List;
/**
* @className: ${大数据学习}.
* @description: 用户数据访问接口
* 业务需求:注册
* 根据编号密码 查询对象
* 根据uuid 查找用户对象
* 查询所有用户 集合方式
* 根据用户id删除用户
* @Theme:
* @author:xgh
* @create-day: 2024-02-21 9:06
*/
public interface UserDao {
/**
* 注册
* @param user
*/
public void saveUser(User user);
/**根据编号密码 查询对象
* @param user
* @return
*/
public UserVO findByPassAndId(User user);
/**
* 通过uuid查询用户
* @param uid
* @return
*/
public User findById(int uid);
/**
* 根据用户编号密码,进行查询用户
* @param uid
* @param pass
* @return
*/
public User findByPassAndId(int uid,String pass);
/**
* 查询所有用户
* @param user
* @return
*/
public List<UserVO> findAll(User user);
/**
* 删除
*
* @param uid
* @return
*/
public boolean deleteUser(int uid);
/**
* 查询用户--在service中调用
* @return
*/
public List<UserVO> findAll();
}
3.3.1 相关配置文件
mybatis-config.xml
可以扫描com.sunsky下的所有包,告诉MyBatis在该包(com.sunsky)及其子包中查找并定义类型别名。MyBatis会自动扫描这个包下的类,并为它们创建别名。
例如,如果包里有User类,那么可以不使用完整的类名com.sunsky.User,而可以使用别名User在映射文件中引用。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--定义类型别名的-->
<typeAliases>
<!--com.im包下的所有类定义类型别名-->
<package name="com.sunsky"/>
</typeAliases>
</configuration>
log4j.xml 进行打印日志使用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration>
<!--输出到控制台-->
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="DEBUG"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
</appender>
<!--输出到文件(info)-->
<!--将生成“info.log.2014-06-11”这样的日志文件-->
<appender name="fileAppenderInfo" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${user.home}/logs/website/info.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<!--输出到文件(warn)-->
<appender name="fileAppenderWarn" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${user.home}/logs/website/warn.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<!--输出到文件(error)-->
<appender name="fileAppenderError" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${user.home}/logs/website/error.log" />
<param name="DatePattern" value=".yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<!--屏蔽所有org.springframework.*输出的Debug(及以下)信息-->
<logger name="org.springframework">
<level value="INFO"></level>
</logger>
<root>
<level value="ALL"/>
<appender-ref ref="consoleAppender" />
<appender-ref ref="fileAppenderInfo" />
<appender-ref ref="fileAppenderWarn" />
<appender-ref ref="fileAppenderError" />
</root>
</log4j:configuration>
database.properties 进行数据库连接的文件配置
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/imdb2?useUnicode=true&characterEncoding=utf-8
user=root
password=123456
minIdle=45
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
spring-dao.xml
Spring框架的配置文件,用于整合MyBatis持久层框架,并定义了数据库连接池以及与MyBatis相关的其他配置
<?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"
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">
<!--配置整合mybatis过程-->
<!--1、配置数据库相关参数properties的属性:${url}-->
<context:property-placeholder location="classpath:database.properties"></context:property-placeholder>
<!--2、数据库连接池-->
<!--JNDI获取数据源(使用dbcp连接池)-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" scope="singleton">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
<property name="initialSize" value="${initialSize}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="maxWait" value="${maxWait}"/>
<property name="minIdle" value="${minIdle}"/>
</bean>
<!--3、配置SqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!--4、配置扫描Dao接口包,动态实现Dao接口,注入到Spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.sunsky.dao"/>
</bean>
</beans>
test包–>进行测试方法实现过程
package com.sunsky.dao;
import com.sunsky.po.User;
import com.sunsky.vo.UserVO;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;
/**
* @className: ${大数据学习}.
* @description: 用户数据访问测试类
* @Theme:
* @author:xgh
* @create-day: 2024-02-20 19:04
*/
public class UserDaoTest {
UserDao userDao = null;
@Before
public void common(){
// 1、创建配置寄文件对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-dao.xml");
System.out.println(context);
// 2、得到用户数据访问的对象
userDao = context.getBean(UserDao.class);
}
@Test
public void saveUser(){
userDao.saveUser(new User(10002,"fbfe4811-ccdc-40ef-9310-05768eeaa623","李云龙","12345",1,"10034"));
System.out.println(userDao.findAll());
}
@Test
public void findByPassAndId(){
User user = new User();
user.setUid(10008);
user.setPass("1111111");
UserVO userVO = userDao.findByPassAndId(user);
}
@Test
public void findAll(){
List<UserVO> list = userDao.findAll(new User());
System.out.println(list);
}
@Test
public void findById(){
User user = userDao.findById(10042);
System.out.println(user);
System.out.println("用户名字 "+user.getName()+" 用户密码"+user.getPass());
}
@Test
public void deleteUser(){
System.out.println(userDao.findById(10042));
userDao.deleteUser(10042);
System.out.println(userDao.findAll(new User()));
userDao.deleteUser(10034);
System.out.println(userDao);
}
}
第二步
service包 -->imp的实现类(通过注解,进行装配dao对象,进行调用方法)–>test测试
3.2.1 service包写接口与实现类
service包–UserService接口,进行定义不同的业务需求 接口规范
package com.sunsky.service;
import com.sunsky.po.User;
import com.sunsky.vo.UserVO;
import java.util.List;
/**
* @className: ${大数据学习}.
* @description: 用户业务逻辑
* @Theme:
* @author:xgh
* @create-day: 2024-02-22 9:29
*/
public interface UserService {
/**
* 注册
* @param user 用户对象
* @return
*/
public int saveUser(User user);
/**
* 根据密码和id查询用户
* @param user
* @return
*/
public UserVO findByPassAndId(User user);
/**查询所有用户
* @return 用户列表
*/
public List<UserVO> findAll();
/**
* 根据id 删除用户
* @param id
* @return true/false
*/
public boolean delete(int id);
}
3.2.2 impl包中–>实现类UserServiceImpl
进行注解自动装配userDao对象,进行调用其方法
package com.sunsky.service.impl;
import com.sunsky.dao.UserDao;
import com.sunsky.po.User;
import com.sunsky.service.UserService;
import com.sunsky.tools.MD5Util;
import com.sunsky.vo.UserVO;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.UUID;
/**
* @className: ${大数据学习}.
* @description: 用户业务逻辑 实现类
* @Theme:
* @author:xgh
* @create-day: 2024-02-22 9:33
*/
@Service
public class UserServiceImpl implements UserService {
Logger logger = Logger.getLogger(UserServiceImpl.class);
@Autowired
UserDao userDao;
@Override
public int saveUser(User user) {
// 创建用户的UUID
user.setUuid(UUID.randomUUID().toString());
// 使用MD5加密
String pass = MD5Util.md5(user.getPass());
// 保存用户
userDao.saveUser(user);
logger.info(user.getUuid());
return user.getUid();
}
@Override
public UserVO findByPassAndId(User user) {
return userDao.findByPassAndId(user);
}
@Override
public List<UserVO> findAll() {
return userDao.findAll();
}
@Override
public boolean delete(int id) {
return userDao.deleteUser(id);
}
}
3.3.3 相关配置文件
spring-service.xml
Spring框架配置文件,用于定义Bean、配置组件扫描、设置事务管理器,并启用基于注解的声明式事务
<?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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<import resource="spring-dao.xml"></import>
<context:component-scan base-package="com.sunsky.service"/>
<!--配置事务管理器-->
<bean id="transactionManger"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置基于注解的声明式事务-->
<tx:annotation-driven transaction-manager="transactionManger"></tx:annotation-driven>
</beans>
第三步
web包 【控制器】–>进行web文件配置–>写对应功能的控制器–>跳转到对应的jsp -->页面显示
3.3.1 web包下写UserController控制器
实现用户注册、登录、退出功能。【验证码的方法 封装】;自动装配UserService对象,进行调用其方法
package com.sunsky.web;
import com.sunsky.po.Role;
import com.sunsky.po.User;
import com.sunsky.service.RoleService;
import com.sunsky.service.UserService;
import com.sunsky.vo.UserVO;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
/**
* @className: ${大数据学习}.
* @description: 用户控制器
* @Theme:
* @author:xgh
* @create-day: 2024-02-25 22:16
*/
@Controller
public class UserController {
Logger logger = Logger.getLogger(UserController.class);
@Autowired
UserService userService;
@Autowired
RoleService roleService;
@RequestMapping("/tologin")
public String toLogin(){
logger.info("进入 到去登录 控制器");
return "login";
}
@RequestMapping("/login")
public String login(User user, String captcha, HttpSession session, HttpServletRequest request){
logger.info("验证码" +captcha);
//判断用户的验证码是否输入正确
String captchaSession = session.getAttribute("simpleCaptcha").toString();
logger.info(captchaSession);
if (captcha.equals(captchaSession)){
UserVO currentUser = userService.findByPassAndId(user);
if (currentUser != null){
logger.info("登陆成功");
// 登录成功,记录当前登录的人进入到Session中
session.setAttribute("currentUser",currentUser);
return "redirect:/main.action";
}else {
logger.info("登陆密码错误");
// 登录失败,跳转到登录界面 继续登录
request.setAttribute("mess","用户名或密码错误");
return "login";
}
}else {
logger.info("验证码错误");
request.setAttribute("mess","验证码输入错误");
return "login";
}
}
@RequestMapping("/exit")
public String exit(HttpSession session){
logger.info("进入 用户退出 控制器");
session.invalidate(); // 销毁Seesion
return "redirect:index.action"; // 跳转 到首页
}
@RequestMapping("/manager/userlist")
public String userList(Model model){
logger.info("进入用户列表 控制器");
List<UserVO> list = userService.findAll();
logger.debug(list);
logger.debug(list.size());
model.addAttribute("list",list);
return "userlist";
}
@RequestMapping("/manager/toadduer")
public String toAddUser(Model model){
logger.info("进入 去添加用户 控制器");
// 创建一个角色集合,放入到作用域中
List<Role> list = roleService.findAll();
logger.info(list);
model.addAttribute("list",list);
return "adduser"; // 进入到准备添加用户的页面地址
}
@RequestMapping("/manager/adduser")
public String addUser(User user){
logger.info(user);
int uid = userService.saveUser(user);
logger.debug(uid);
return "redirect:userlist.action";
}
@RequestMapping("/toregist")
public String toRegist(){
logger.info("进入准备注册用户的控制器");
return "regist";
}
@RequestMapping("/regist")
public String addUser(User user,Model model){
logger.info("进入注册用户的控制器");
int uid = userService.saveUser(user);
logger.info(uid);
model.addAttribute("uid",uid);
return "login"; // 注册成功后,进入到登录界面
}
}
3.3.2 在web包下的jsp包中,写对应的控制器跳转的页面jsp
使用了Bootstrap框架来设计布局和样式,JSTL标签库来进行数据处理,并使用了Spring的一些注解来管理事务。这个页面的主要目的是展示贴吧的帖子列表,并提供用户交互的导航链接。
index.jsp 首页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path;
request.setAttribute("basePath", basePath);
%>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>贴吧项目</title>
<link rel="icon" href="favicon.ico" type="image/ico">
<link href="${basePath}/statics/css/bootstrap.min.css" rel="stylesheet">
<link href="${basePath}/statics/css/fonts.css" rel="stylesheet">
<link href="${basePath}/statics/css/style.css" rel="stylesheet">
<link href="${basePath}/statics/css/index.css" rel="stylesheet">
</head>
<body>
<!--导航栏盒子-->
<div class="d1">
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container-fluid allwidth">
<div class="navbar-header">
<a class="navbar-brand" href="#">欢迎来到博客园</a>
</div>
<div>
<ul class="nav navbar-nav">
<li class="active">
<a href="/im">网站首页</a>
</li>
<li>
<a href="tologin.action">登录</a>
</li>
<li>
<a href="toregist.action">注册</a>
</li>
<c:if test="${currentUser!=null}">
<li>
<a href="personblogschemalist.html">我的博客</a>
</li>
<li>
<a href="main.action">后台管理</a>
</li>
<li>
<a href="index.html">退出</a>
</li>
</c:if>
<li>
<a onclick="window.history.go(-1)" style="cursor: pointer;">返回</a>
</li>
</ul>
</div>
</div>
</nav>
</div>
<!--第一个banner的内容-->
<div class="banner1">
<div class="container">
<h1>1024贴吧</h1>
<h2>博客园软件工程师的宝典,让web开发更迅速、简单。</h2>
<p class="masthead-button-links">
<a class="btn btn-lg btn-success btn-shadow" href="https://v3.bootcss.com/css/" target="_blank" role="button" onclick="_hmt.push(['_trackEvent', 'masthead', 'click', 'masthead-Bootstrap3中文文档'])">Bootstrap3中文文档(v3.3.7)</a>
</p>
<ul class="masthead-links">
<li>
<a href="https://v3.bootcss.com/css/" target="_blank" role="button" onclick="_hmt.push(['_trackEvent', 'masthead', 'click', 'masthead-Bootstrap2中文文档'])">Bootstrap2中文文档(v2.3.2)</a>
</li>
</ul>
</div>
</div>
<!--页面主要内容-->
<main class="ftdms-layout-content">
<div class="container-fluid" style="margin: auto; width: 80%;">
<div class="row" style="margin-top:15px;">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<h4>表格</h4></div>
<div class="card-body">
<h5>帖子列表 <code>.table-striped</code></h5>
<table class="table table-striped">
<thead>
<tr>
<th style="width: 5%">编号</th>
<th style="width: 20%">标题</th>
<th>概要</th>
<th style="width: 8%">作者</th>
<th style="width: 15%">日期</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="invitation">
<tr>
<th scope="row"><a href="invitationinfo.action?id=${invitation.id}" target="_blank">${invitation.id}</a></th>
<td><a href="invitationinfo.action?id=${invitation.id}" target="_blank">${invitation.title}</a></td>
<td>
<a href="invitationinfo.action?id=${invitation.id}">${invitation.summary}</a>
</td>
<td><a href="userinvitationlist.action?uid=${invitation.uid}">${invitation.name}</a></td>
<td><fmt:formatDate value="${invitation.createdate}" type="both"></fmt:formatDate></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--Spring的字符集过滤器实现-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<!--代表过滤所有的请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.action</welcome-file>
</welcome-file-list>
</web-app>
3.3.3 相关配置
web.xml
这个文件是为了确保Web应用能够正确地启动和运行Spring MVC框架,以及如何处理请求和响应的字符编码问题。通过配置过滤器和Servlet,它还负责处理Web应用的安全和请求映射
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--Spring的字符集过滤器实现-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<!--代表过滤所有的请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/index.action</welcome-file>
</welcome-file-list>
</web-app>
spring-web.xml
这个XML配置文件是为了定义Spring MVC应用程序中的bean、视图解析器、组件扫描和拦截器,以确保请求能够被正确地映射到控制器上,并在必要时执行一些预处理和后处理逻辑
<?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:mvc="http://www.springframework.org/schema/mvc"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven></mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<context:component-scan base-package="com.sunsky.web"></context:component-scan>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/manager/*.action"/>
<bean class="com.sunsky.interceptor.AuthorInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/main.action"/>
<mvc:mapping path="/toaddinvitation.action"/>
<mvc:mapping path="/addinvitation.action"/>
<mvc:mapping path="/deleteinvitation.action"/>
<bean class="com.sunsky.interceptor.LoginStatedInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
四、项目实现图
具体代码实现,可以私聊。