1. JavaWeb入门:从零开始构建Web应用
作为一名有十年JavaWeb开发经验的工程师,我经常被问到如何快速入门JavaWeb开发。今天我就用最直白的方式,带大家走一遍JavaWeb开发的完整流程。这个教程特别适合刚学完Java基础,想进入Web开发领域的同学。
JavaWeb开发本质上就是用Java技术来构建网站和Web应用。与传统的桌面程序不同,Web应用运行在服务器上,用户通过浏览器访问。这种架构最大的优势就是无需安装客户端,随时随地都能使用。
2. 开发环境准备
2.1 必备工具安装
工欲善其事,必先利其器。在开始JavaWeb开发前,我们需要准备好以下工具:
-
JDK:建议安装JDK 8或11,这两个版本在企业中应用最广泛。安装后记得配置JAVA_HOME环境变量。
-
IDE:IntelliJ IDEA是最佳选择,社区版就够用。相比Eclipse,IDEA对Web开发的支持更友好。
-
Tomcat:这是最流行的JavaWeb服务器,下载9.x版本即可。解压后建议配置CATALINA_HOME环境变量。
-
Maven:项目管理工具,可以自动下载依赖库。安装后配置MAVEN_HOME。
提示:所有工具的安装路径不要包含中文和空格,否则可能会遇到各种奇怪的问题。
2.2 创建第一个Web项目
在IDEA中新建项目时,选择"Maven"->"Create from archetype"->"maven-archetype-webapp"。这个模板会自动生成Web项目的基本结构:
code复制mywebapp
├── src
│ └── main
│ ├── java # Java源代码
│ ├── resources # 配置文件
│ └── webapp # Web资源
│ ├── WEB-INF # 配置目录
│ └── index.jsp # 首页
└── pom.xml # Maven配置文件
项目创建后,我们需要配置Tomcat服务器:
- 点击IDEA右上角的"Add Configuration"
- 选择"Tomcat Server"->"Local"
- 指定Tomcat的安装目录
- 在"Deployment"标签页添加项目war包
3. Servlet核心开发
3.1 第一个Servlet程序
Servlet是JavaWeb的核心组件,它负责处理HTTP请求并生成响应。创建一个Servlet需要以下步骤:
- 在pom.xml中添加Servlet API依赖:
xml复制<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
- 创建HelloServlet类:
java复制@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<h1>你好,Servlet世界!</h1>");
}
}
- 启动Tomcat,访问http://localhost:8080/hello就能看到输出。
3.2 Servlet生命周期
理解Servlet生命周期对开发至关重要:
- 初始化:容器第一次访问Servlet时调用init()方法
- 服务:每次请求调用service()方法,进而调用doGet/doPost
- 销毁:容器关闭时调用destroy()方法
注意:Servlet是单例的,所有请求共享同一个实例。因此不要在其中定义成员变量,除非是只读的。
4. JSP基础
4.1 JSP与Servlet的关系
JSP(Java Server Pages)本质上是Servlet的另一种形式。当第一次访问JSP时,容器会将其编译成Servlet。JSP更适合展示HTML内容,而Servlet更适合处理业务逻辑。
一个简单的JSP示例:
jsp复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我的第一个JSP</title>
</head>
<body>
<h1>当前时间:<%= new java.util.Date() %></h1>
</body>
</html>
4.2 JSP九大内置对象
JSP中可以直接使用的对象:
- request:HttpServletRequest
- response:HttpServletResponse
- session:HttpSession
- application:ServletContext
- out:JspWriter
- pageContext:PageContext
- page:当前Servlet实例
- config:ServletConfig
- exception:Throwable
5. 数据库操作
5.1 JDBC基础
Java通过JDBC访问数据库。基本步骤如下:
- 加载驱动:
java复制Class.forName("com.mysql.cj.jdbc.Driver");
- 获取连接:
java复制String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false";
Connection conn = DriverManager.getConnection(url, "user", "password");
- 执行SQL:
java复制Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while(rs.next()) {
System.out.println(rs.getString("username"));
}
- 关闭资源:
java复制rs.close();
stmt.close();
conn.close();
5.2 使用连接池
直接使用JDBC性能较差,实际项目中应该使用连接池。常见的连接池有:
- HikariCP:目前最快的连接池
- Druid:阿里开源的连接池,功能丰富
- Tomcat JDBC Pool:Tomcat内置的连接池
以HikariCP为例的配置:
java复制HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("user");
config.setPassword("password");
HikariDataSource ds = new HikariDataSource(config);
6. MVC架构实现
6.1 什么是MVC
MVC(Model-View-Controller)是一种设计模式:
- Model:数据模型,负责业务逻辑和数据访问
- View:视图,负责展示数据
- Controller:控制器,负责接收请求并调用Model和View
6.2 手写简易MVC框架
- 创建基础Servlet作为控制器:
java复制public class DispatcherServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String path = req.getRequestURI();
if(path.equals("/user/list")) {
List<User> users = UserService.listUsers();
req.setAttribute("users", users);
req.getRequestDispatcher("/WEB-INF/user/list.jsp").forward(req, resp);
}
}
}
- 创建Service层:
java复制public class UserService {
public static List<User> listUsers() {
// 从数据库获取用户列表
return userDao.findAll();
}
}
- 创建JSP视图:
jsp复制<table>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
</tr>
</c:forEach>
</table>
7. 常见问题排查
7.1 中文乱码问题
乱码是新手最常见的问题之一,解决方案:
- JSP页面:添加page指令
jsp复制<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- Servlet响应:设置contentType
java复制resp.setContentType("text/html;charset=UTF-8");
- 请求参数:设置request编码
java复制req.setCharacterEncoding("UTF-8");
- 数据库连接:添加参数
java复制jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8
7.2 404错误排查
- 检查URL是否正确
- 检查web.xml或@WebServlet配置
- 检查项目是否成功部署到Tomcat
- 检查Tomcat日志中的错误信息
7.3 500错误排查
- 查看控制台输出的完整堆栈信息
- 检查是否有空指针异常
- 检查数据库连接是否正常
- 检查是否有语法错误
8. 项目实战建议
8.1 第一个实战项目选择
建议从简单的CMS系统开始,功能包括:
- 用户登录/注销
- 文章发布/编辑/删除
- 文章列表展示
8.2 开发流程建议
- 设计数据库表结构
- 创建实体类
- 实现DAO层
- 实现Service层
- 开发Controller
- 编写JSP视图
- 测试和调试
8.3 代码规范建议
- 包名使用小写,如com.example.dao
- 类名使用大驼峰,如UserService
- 方法名使用小驼峰,如getUserById
- 常量全大写,如MAX_COUNT
- 合理使用注释,但不要过度注释
9. 进阶学习路线
掌握了JavaWeb基础后,可以继续学习:
-
框架学习:
- Spring:IoC和AOP容器
- Spring MVC:Web框架
- MyBatis:ORM框架
-
前端技术:
- HTML5/CSS3
- JavaScript/ES6
- Vue.js/React
-
构建工具:
- Maven进阶
- Gradle
-
部署运维:
- Linux基础
- Docker
- Nginx
在实际开发中,我发现很多新手容易陷入"只学不练"的误区。建议每学完一个知识点就立即动手实践,哪怕是一个很小的demo。遇到问题时,先尝试自己解决,实在不行再查资料或请教他人。这样积累的经验才是最宝贵的。
