Java Web 技术的三个发展阶段,它们分别是:
- Servlet + JSP
- Spring MVC + JSP(基于 XML 配置)
- Spring MVC + JSP(基于注解配置)
一、Servlet + JSP(早期 Java Web 开发)
架构说明:
- Servlet:处理业务逻辑,接收请求、处理数据、转发视图。
- JSP:页面展示,负责视图层(View)。
请求流程:
浏览器 → Servlet → 处理数据(如查询数据库)→ 请求转发到 JSP → 响应浏览器
示例代码:
1.1 web.xml 中注册 Servlet
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
1.2 HelloServlet.java
@WebServlet("/hello") // 也可以用注解(Servlet 3.0+)
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.setAttribute("msg", "Hello Servlet + JSP");
request.getRequestDispatcher("/hello.jsp").forward(request, response);
}
}
1.3 hello.jsp
<html>
<body>
Message: ${msg}
</body>
</html>
特点:
- JSP 和 Servlet 混合逻辑,维护困难;
- 不支持 MVC 模式;
- 已基本被淘汰,仅用于入门学习。
数据访问方式:
👉 直接使用 JDBC(Java Database Connectivity)
特点:
- 手动管理数据库连接、SQL语句、ResultSet解析;
- 缺乏封装,代码重复、易出错;
- 不支持 ORM(对象关系映射);
- 事务控制需手动编程。
示例代码:
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mydb", "user", "pass");
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
String name = rs.getString("username");
}
❌ 易受注入攻击(危险示例):
String sql = "SELECT * FROM users WHERE username = '" + username + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
小结:
适合入门学习 JDBC 基础,不推荐用于实际项目开发。
二、Spring MVC + JSP(基于 XML 配置)
下一章: 小结:Spring MVC 的基于 XML 的经典配置方式
架构说明:
Spring MVC 是经典的 MVC 框架,XML 配置方式是早期主流方式,强调配置分离。
请求流程:
浏览器 → DispatcherServlet(中央控制器)→ HandlerMapping → Controller → ModelAndView → ViewResolver → JSP → 响应
示例结构:
2.1 web.xml
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.2 spring-servlet.xml
<context:component-scan base-package="com.example"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
2.3 HelloController.java
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView("hello");
mv.addObject("msg", "Hello XML Controller");
return mv;
}
}
特点:
- 支持 MVC 分层;
- 使用 XML 维护繁琐;
- 扩展性一般;
- 适合学习 Spring 框架演进逻辑。
数据访问方式:
👉 使用 Spring JDBC Template 或 iBatis(MyBatis 前身)
特点:
1)Spring JDBC Template
- 基于 JDBC 封装,简化资源管理;
- 提供统一异常处理;
- 仍需手写 SQL,但更安全、更简洁。
2)iBatis(后来的 MyBatis)
- SQL 显式、灵活;
- 将 SQL 和 Java 对象映射配置在 XML 中;
- 支持参数映射、结果映射;
- 容易集成 Spring。
示例(Spring JDBC):
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> findAll() {
return jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper<>(User.class));
}
示例(iBatis/MyBatis XML 映射):
<select id="findUser" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
小结:
进入 DAO 分层 时代,配置 XML 较多,适合中小项目。
推荐: 三、Spring MVC + JSP(基于注解配置)
架构说明:
Spring 3.x 起,注解配置成为主流,减少了大量 XML 配置,代码更清晰、更灵活。
请求流程与 XML 相同,但配置方式不同。
示例结构:
3.1 web.xml
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.2 spring-servlet.xml
<context:component-scan base-package="com.example"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
3.3 HelloController.java(注解方式)
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "Hello Annotation Controller");
return "hello"; // 对应 /WEB-INF/jsp/hello.jsp
}
}
特点:
- 几乎无 XML 配置(可搭配 JavaConfig 进一步去除 XML);
- 支持 RESTful、拦截器、数据绑定、异常处理等;
- 可与 Thymeleaf、Freemarker 等现代模板引擎替换 JSP;
- 是目前主流企业使用方式。
数据访问方式:
👉 常用框架为:
- MyBatis(主流)✔️
- JPA(Hibernate)(企业推荐)✔️
- Spring Data JPA(进一步封装)✔️
✅ MyBatis(现在也用注解配置)
- 灵活控制 SQL,适合复杂查询;
- 可以使用注解代替 XML;
- 手动写 SQL,开发控制力强。
示例:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(int id);
}
✅ JPA(Hibernate 是最常用实现)
- ORM 框架,使用注解映射实体类和表;
- 不需要写 SQL,使用 JPQL;
- 更符合面向对象编程,适合 CRUD 场景多的业务系统;
- 配合 Spring Data JPA 可实现接口式开发。
实体类:
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
}
Repository 接口:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name);
}
特性 | Servlet + JSP | SpringMVC + XML | SpringMVC + 注解 |
---|---|---|---|
配置方式 | 手写 Servlet、JSP | XML 配置较重 | 注解驱动,轻量级 |
控制器实现 | 继承 HttpServlet | 实现 Controller 接口 | 使用 @Controller 注解 |
URL 映射 | web.xml | HandlerMapping 配置 | @RequestMapping |
推荐程度 | 已淘汰 | 学习了解用 | 推荐用于开发 |
数据访问方式
阶段 | 常用数据访问方式 | 是否手写SQL | ORM 支持 | 特点与适用场景 |
---|---|---|---|---|
Servlet + JSP | JDBC | ✅ 是 | ❌ 无 | 入门学习、代码冗长、开发效率低 |
SpringMVC + XML | Spring JDBC、iBatis | ✅ 是 | ❌ 限制 | DAO 分层清晰,适合中等复杂项目 |
SpringMVC + 注解 | MyBatis、JPA、Spring Data JPA | 可选 | ✅ 强 | 企业级开发首选,高度封装、维护性强、扩展性好 |
sql注入问题
框架名称 | 默认防注入 | 是否还需注意开发习惯 |
---|---|---|
JDBC | 是 | ✅ 使用 PreparedStatement |
Spring JDBC | 是 | ✅ 避免拼接 SQL |
MyBatis | 是 | ✅ 不能用 ${} |
JPA / Hibernate | 是 | ✅ 使用参数绑定(JPQL) |
Spring Data JPA | 是 | ✅ 避免原生 SQL 手动拼接 |
✅ 总结
Java Web 的技术演化,从 Servlet 到 SpringMVC,不仅解耦了控制逻辑和视图逻辑,还促进了 DAO 层从手动 JDBC → ORM(MyBatis / JPA) 的演进:
- 早期关注流程控制和手工 SQL
- 中期开始封装数据库操作(Spring JDBC / MyBatis)
- 现代更多依赖注解、自动化配置、ORM 框架(JPA / MyBatis + Mapper 注解)