🗣 Wd提问: jsp网站开发详解
🤖 Ai回答: JSP网站开发详解
JavaServer Pages(JSP)是一种基于Java的服务器端动态网页技术,允许开发者将Java代码嵌入HTML页面中,实现动态内容生成。JSP是Java EE(现Jakarta EE)的重要组成部分,广泛应用于企业级Web应用开发。
一、JSP概述
1.1 什么是JSP?
全称:JavaServer Pages
本质:JSP文件在运行时会被容器(如Tomcat)编译为Servlet类。
扩展名:`.jsp`
优势:
可以混合HTML与Java代码
支持组件化开发(JavaBean、自定义标签)
与Servlet无缝集成
跨平台、安全性高
二、JSP运行原理
客户端请求 → Web容器(如Tomcat) → 查找JSP文件 → 编译为Servlet → 执行Servlet → 返回HTML响应
编译过程:
1、容器检测JSP是否被修改
2、若有修改或首次访问,将 `.jsp` 文件转换为 `.java`(即Servlet)
3、编译 `.java` 成 `.class`
4、加载并执行该Servlet
示例:`index.jsp` → `index_jsp.java` → `index_jsp.class`
三、JSP基本语法
3.1 指令(Directives)
page指令
jsp
<%@ page language=java
contentType=text/html; charset=UTF-8
pageEncoding=UTF-8
import=java.util.*, java.text.*
errorPage=error.jsp
isErrorPage=false %
常用属性:
`language`: 脚本语言(默认Java)
`contentType`: 响应MIME类型和编码
`pageEncoding`: 页面编码
`import`: 导入包
`session`: 是否使用Session(true/false)
`buffer`: 输出缓冲区大小
`autoFlush`: 是否自动刷新缓冲区
`isErrorPage`: 是否为错误处理页
`extends`: 继承自哪个类(不推荐修改)
include指令(静态包含)
jsp
<%@ include file=header.jsp %
在编译期合并文件内容,适合公共头尾。
taglib指令(引入标签库)
jsp
<%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c %
3.2 脚本元素(Scripting Elements)
1、脚本片段(Scriptlet)
jsp
<%
String name = request.getParameter(name);
if (name != null) {
out.println(Hello, + name);
}
%
2、表达式(Expression)
jsp
当前时间:<%= new java.util.Date() %
注意:不要加分号!
3、声明(Declaration)
jsp
<%!
private int counter = 0;
public String toUpperCase(String str) {
return str.toUpperCase();
}
%
声明变量或方法,作用域为整个JSP页面。
3.3 注释
| 类型 | 写法 | 是否发送到客户端 |
|
| HTML注释 | `<! 注释 ` | 是 |
| JSP注释 | `<% 注释 %` | 否(推荐用于隐藏逻辑) |
四、JSP内置对象(Implicit Objects)
| 对象名 | 类型 | 说明 |
|
| `request` | `HttpServletRequest` | 请求对象 |
| `response` | `HttpServletResponse` | 响应对象 |
| `out` | `JspWriter` | 输出流(类似PrintWriter) |
| `session` | `HttpSession` | 会话对象 |
| `application` | `ServletContext` | 应用上下文 |
| `config` | `ServletConfig` | 配置信息 |
| `pageContext` | `PageContext` | 页面上下文(可访问其他对象) |
| `page` | `Object` | 当前JSP实例(相当于this) |
| `exception` | `Throwable` | 异常对象(仅在errorPage中可用) |
示例:使用内置对象
jsp
<%
// 获取请求参数
String user = request.getParameter(username);
// 设置响应类型
response.setContentType(text/html;charset=UTF-8);
// 输出内容
out.println(<h1Welcome: + user + </h1);
// 存储会话数据
session.setAttribute(loginUser, user);
// 应用范围共享数据
application.setAttribute(visitCount, 100);
%
五、JSP动作标签(Action Tags)
无需Java代码即可完成常见操作:
| 标签 | 功能 |
| `<jsp:include` | 动态包含其他资源(运行时) |
| `<jsp:forward` | 请求转发 |
| `<jsp:useBean` | 创建或查找JavaBean |
| `<jsp:setProperty` | 设置Bean属性 |
| `<jsp:getProperty` | 获取Bean属性 |
示例:
使用JavaBean
jsp
<jsp:useBean id=user class=com.example.User scope=session/
<jsp:setProperty name=user property=*/ <! 自动绑定表单字段
姓名:<jsp:getProperty name=user property=name/
请求转发
jsp
<jsp:forward page=welcome.jsp
<jsp:param name=msg value=登录成功/
</jsp:forward
六、MVC模式与JSP最佳实践
6.1 不推荐的做法(脚本混写)
jsp
<%
Connection conn = DriverManager.getConnection(...);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(SELECT * FROM users);
while(rs.next()) {
%
<p<%= rs.getString(name) %</p
<%
}
%
❌ 违反分层原则,难以维护
6.2 推荐做法:MVC架构
Model:JavaBean / DAO / Service
View:JSP(只负责展示)
Controller:Servlet(处理请求)
示例结构:
src/
├── com.example.servlet.LoginServlet.java
├── com.example.model.User.java
├── com.example.dao.UserDAO.java
web/
├── login.jsp
├── welcome.jsp
├── WEB-INF/web.xml
Controller (Servlet)
java
@WebServlet(/login)
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
String username = req.getParameter(username);
String password = req.getParameter(password);
UserDAO dao = new UserDAO();
User user = dao.authenticate(username, password);
if (user != null) {
req.getSession().setAttribute(user, user);
req.getRequestDispatcher(welcome.jsp).forward(req, resp);
} else {
req.setAttribute(error, 用户名或密码错误);
req.getRequestDispatcher(login.jsp).forward(req, resp);
}
}
}
View (JSP)
jsp
<! welcome.jsp
<%@ page contentType=text/html;charset=UTF-8 %
<%@ taglib prefix=c uri=http://java.sun.com/jsp/jstl/core %
<html
<head<title欢迎页</title</head
<body
<h1欢迎,<c:out value=${user.name}/</h1
<a href=logout退出</a
</body
</html
七、JSTL(JSP Standard Tag Library)
替代Java脚本,提升可读性和安全性。
常用标签库:
1、核心标签(c:)
jsp
<%@ taglib uri=http://java.sun.com/jsp/jstl/core prefix=c %
<! 条件判断
<c:if test=${not empty user}
欢迎您,${user.name}
</c:if
<! 循环
<c:forEach items=${users} var=u
<p${u.id}: ${u.name}</p
</c:forEach
<! URL重写
<c:url value=/delete var=delUrl
<c:param name=id value=${u.id}/
</c:url
<a href=${delUrl}删除</a
2、格式化标签(fmt:)
jsp
<%@ taglib uri=http://java.sun.com/jsp/jstl/fmt prefix=fmt %
当前时间:<fmt:formatDate value=${now} pattern=yyyy-MM-dd HH:mm:ss/
金额:<fmt:formatNumber value=12345.678 type=currency/
3、函数标签(fn:)
jsp
<%@ taglib uri=http://java.sun.com/jsp/jstl/functions prefix=fn %
长度:<fn:length(str)
是否包含:<fn:contains(str, 'hello')}
八、EL表达式(Expression Language)
简化对Java对象的访问。
jsp
${user.name} <! 访问属性
${requestScope.message} <! 指定作用域
${param.username} <! 请求参数
${header[User-Agent]} <! 请求头
${cookie.JSESSIONID.value} <! Cookie值
${empty list} <! 判断是否为空
${1 + 2} <! 运算表达式
作用域优先级:page → request → session → application
九、安全与性能建议
9.1 安全性
避免直接输出用户输入 → 使用 `<c:out` 或 EL 自动转义
敏感数据不要放在URL中
使用HTTPS传输敏感信息
验证和过滤所有输入(防XSS、SQL注入)
9.2 性能优化
尽量减少JSP中的Java脚本
合理设置缓存(页面、对象)
使用连接池管理数据库连接
静态资源(CSS/JS/图片)分离部署
十、项目部署流程
1、开发环境准备
JDK 8+
Apache Tomcat(或Jetty、WildFly等)
IDE(IntelliJ IDEA / Eclipse / VS Code)
Maven / Gradle(构建工具)
2、目录结构
mywebapp/
├── index.jsp
├── css/
├── js/
├── images/
├── WEB-INF/
│ ├── web.xml
│ ├── classes/ ← 编译后的.class文件
│ └── lib/ ← 第三方jar包(如servlet-api.jar, jstl.jar)
3、配置 `web.xml`(可选,现代应用可用注解替代)
xml
<web-app xmlns=http://xmlns.jcp.org/xml/ns/javaee
version=4.0
<display-nameMy JSP App</display-name
<welcome-file-list
<welcome-fileindex.jsp</welcome-file
</welcome-file-list
</web-app
4、打包与部署
bash
使用Maven打包
mvn clean package
生成 mywebapp.war
部署到Tomcat/webapps目录下自动解压运行
十一、常见问题与调试
| 问题 | 解决方案 |
| 中文乱码 | 设置`pageEncoding`和`contentType`为UTF-8;request/setCharacterEncoding(UTF-8) |
| 404错误 | 检查URL路径、web.xml配置、部署是否成功 |
| 500错误 | 查看Tomcat日志(logs/catalina.out)定位异常 |
| JSP未编译 | 清理work目录(Tomcat/work/Catalina/...)重启 |
| 标签库找不到 | 确保`jstl.jar`和`taglibs-standard.jar`在WEB-INF/lib中 |
十二、JSP的现状与替代方案
当前趋势:
JSP逐渐被更现代化的技术取代
Spring Boot + Thymeleaf / FreeMarker 更流行
前后端分离架构(Vue/React + REST API)成为主流
何时仍可使用JSP?
维护遗留系统
简单的企业内部管理系统
教学用途(理解Servlet工作原理)
结语
JSP作为经典的Java Web技术,虽然已不再是首选,但掌握其原理有助于深入理解Web容器工作机制、MVC设计模式以及Java EE生态。建议学习者在掌握JSP后,进一步学习Spring MVC、Spring Boot等现代框架,以适应当前开发需求。
📌 附:最小完整示例
`index.jsp`
jsp
<%@ page contentType=text/html;charset=UTF-8 %
<!DOCTYPE html
<html
<head<titleJSP示例</title</head
<body
<h2当前时间:<%= new java.util.Date() %</h2
</body
</html
部署至Tomcat即可访问 `http://localhost:8080/myapp/index.jsp`
如需具体案例(如用户登录系统、商品管理后台),可继续提问!
📣 商家广告:





0
IP地址: 187.211.242.65
搜索次数: 0
提问时间: 2025-11-06 11:51:11
🛒 域名购买:
w-t.cn
41.gold
65.hk
app.ln.cn
app.hl.cn
0.bj.cn
285.net.cn
37.com.hk
zqll.cn
kr.gs
❓️ 热门提问:
电信idc机房
厦门 虚拟主机
俄罗斯 vps
MySQL客户端字符集
美国纽约服务器vps
云基地机房
fairwinds域名
nginx服务器搭建
老域名转让
软件开发标准
豌豆Ai站群搜索引擎系统
🌐 域名评估:
ee.sx.cn
peft.cn
6-6.com.cn
mdem.cn
byd.jx.cn
yu7.sd.cn
uefw.cn
5a.sx.cn
728.net.cn
vtol.autos
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
全球搜索引擎
搜全网
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。