刚接触Java Web开发时,很多新手会被各种框架的配置搞得晕头转向。今天我就用最接地气的方式,带大家用IntelliJ IDEA搭建第一个SpringMVC项目。不同于官方文档的复杂说明,这里我会分享实际开发中真正用得到的配置技巧。
SpringMVC作为Spring框架的Web模块,通过MVC模式将业务逻辑、数据展示和用户交互分离。我们选择它作为入门框架,主要是因为:
提示:建议使用IDEA 2021.3及以上版本,避免旧版本对Spring6的支持问题
打开IDEA选择"New Project",关键配置步骤如下:
创建完成后,标准的Maven项目结构会自动生成:
code复制src
├── main
│ ├── java
│ ├── resources
│ │ ├── static # 静态资源
│ │ ├── templates # 模板文件
│ │ └── application.properties
└── test
application.properties中需要配置:
properties复制# 服务器端口
server.port=8080
# 视图解析器前缀后缀
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# 热部署配置
spring.devtools.restart.enabled=true
注意:如果使用JSP需要额外添加tomcat-embed-jasper依赖,现在更推荐Thymeleaf
创建第一个控制器类HomeController:
java复制@Controller
public class HomeController {
@GetMapping("/")
public String home(Model model) {
model.addAttribute("message", "Hello SpringMVC!");
return "home";
}
}
关键注解说明:
@Controller:标识为MVC控制器@GetMapping:处理GET请求映射在resources/templates下创建home.html:
html复制<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>SpringMVC Demo</title>
</head>
<body>
<h1 th:text="${message}">Default Message</h1>
</body>
</html>
启动主类后,访问http://localhost:8080 应该能看到:
SpringMVC默认静态资源路径:
建议在application.properties中添加:
properties复制spring.web.resources.static-locations=classpath:/static/
创建登录检查拦截器:
java复制public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 检查session等逻辑
return true;
}
}
注册拦截器:
java复制@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
如果修改代码后没有自动生效:
在application.properties中添加:
properties复制server.servlet.encoding.force=true
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
经过几个实际项目验证,推荐这样组织代码:
code复制com.example
├── config # 配置类
├── controller # 控制器
├── service # 业务逻辑
├── repository # 数据访问
├── model # 实体类
└── exception # 异常处理
对于初学者,可以先用一个简单的Controller开始,随着功能增加再逐步拆分。我在实际项目中发现,过早设计复杂结构反而会增加学习成本。