小结:Java Web 技术的三个发展阶段

发布于:2025-07-20 ⋅ 阅读:(20) ⋅ 点赞:(0)

Java Web 技术的三个发展阶段,它们分别是:

  1. Servlet + JSP
  2. Spring MVC + JSP(基于 XML 配置)
  3. 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 TemplateiBatis(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 注解)

网站公告

今日签到

点亮在社区的每一天
去签到