JavaServerPages(JSP)在Web应用中的应用与实践
立即解锁
发布时间: 2025-08-19 02:32:47 阅读量: 3 订阅数: 11 


Spring框架下的Java开发实践与进阶
### JavaServer Pages(JSP)在Web应用中的应用与实践
#### 1. JSP简介
如今,Java Web应用中最常见的视图技术当属JavaServer Pages(JSP)。部分原因在于JSP是J2EE规范的一部分,这意味着它会随你选择的应用服务器或Web容器一同提供。JSP最早可追溯到1999年,目前的最新版本是JSP 2.0。JSP 2.0是J2EE 1.4规范的一部分,在撰写本文时,许多厂商已对其提供支持。
JSP 2.0规范在之前版本的基础上有了显著改进,它无需在JSP中编写Java代码,简化了网页的编写方式。JSP 2.0的增强功能包括引入了表达式语言(Expression Language),该语言之前是Java标准标签库(Java Standard Tag Library)的一部分,以及支持JSP片段,这使得你可以创建可重用的JSP代码片段。
虽然JSP允许在视图文件中嵌入Java代码,但这应作为最后的选择。在JSP中使用Java代码会增加引入非视图特定功能的风险,并且在需要迁移到其他视图技术时会带来困难。此外,图形设计师和HTML程序员通常不熟悉Java代码,难以处理相关内容。建议尽可能使用Java标准标签库和表达式语言,以及JSP 2.0的其他新特性。同时,也可以考虑使用第三方标签库。
若要防止在JSP中使用脚本(scriptlets),可在`web.xml`文件中添加以下JSP属性:
```xml
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
```
#### 2. 配置应用以使用JSP
要在Web应用中使用JSP,需要配置一个视图解析器(ViewResolver),这与使用其他视图技术时的操作相同。使用JSP时,有两个视图类可供选择,它们都会为JSP渲染准备模型,具体来说,就是将`ModelAndView`中的模型合并到请求上下文中,使JSP能够访问该模型。
- **InternalResourceView**:位于`org.springframework.web.servlet.view`包中,为传统的JSP提供基本支持,不使用Java标准标签库(JSTL)。对于Servlet容器而言,JSP与Web应用中对其他资源的请求并无区别,因此得名。
- **JstlView**:位于`org.springframework.web.servlet.view`包中,不仅将模型作为请求属性合并到请求上下文中,还会为处理国际化(i18n)的JSTL标签准备本地化上下文,使你能够使用`ApplicationContext`中定义的`MessageSource`。
若要使用Java标准标签库中的标签,应使用`JstlView`。在实现JSP 2.0规范的Servlet容器中,表达式语言的使用不再局限于标签内部,你可以在任何地方使用表达式,例如可以直接编写`<input type="${person.name}"/>`,而无需将`${person.name}`封装在`c:out`标签中。建议尽可能使用JSP 2.0的特性,这将显著提高JSP的可维护性和可读性。
#### 3. 使用自定义标签创建表单
Spring提供了一些自定义标签,可借助命令控制器和表单控制器来创建表单,这些标签的主要目的是减少代码重复。以下是一些可用的标签:
| 标签名称 | 功能描述 |
| ---- | ---- |
| spring:bind | 创建一个`BindStatus`对象,并将其绑定到请求上下文中,供JSTL和自定义标签使用。该对象包含命令对象特定属性的相关信息,通过`path`属性指定。适用于创建表单和在网页中显示复杂属性,而无需预先了解属性的格式。 |
| spring:transform | 支持基于`spring:bind`标签暴露的属性编辑器,对非命令对象的属性进行转换。特别适用于渲染参考数据,如下拉框中的选项。 |
| spring:hasBindErrors | 暴露特定请求的`org.springframework.validation.Errors`对象。 |
| spring:message | 是Java标准标签库中`fmt:message`标签的Spring等效标签。在某些环境中无法使用JSTL的`fmt:message`标签时,Spring允许使用`spring:message`标签实现应用的国际化。 |
| spring:htmlEscape | 支持在HTML中对文本进行转义。所有Spring标签都通过布尔型的`htmlEscape`属性支持HTML转义。 |
下面通过一个示例来展示如何创建表单。首先定义一个`Reservation`类:
```java
public class Reservation {
public void setShow(Show show) { ... }
public Show getShow() { ... }
public void setDate(Date d) { ... }
public Date getDate() { ... }
public void setNumberOfPersons(int p) { ... }
public int getNumberOfPersons() { ... }
}
```
接着定义一个表单控制器`ReservationFormController`:
```java
public class ReservationFormController {
// 非相关方法省略
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder)
throws Exception {
binder.registerCustomEditor(Show.class, new ShowEditor(...));
binder.registerCustomerEditor(Date.class,
new CustomDateEditor("yyyy-MM-dd", true));
}
protected Map referenceData(HttpServletRequest request)
throws Exception {
Map refData = new HashMap();
List shows; // 查找演出信息
refData.put("shows", shows);
}
public ModelAndView onSubmit(Object command) {
Reservation r = (Reservation)command;
// 处理预订信息
return new ModelAndView(getSuccessView());
}
}
```
在这个示例中,`ShowEditor`可以将`Show`对象转换为表示演出名称的字符串,也可以根据名称查找`Show`对象。配置好表单控制器的表单视图、成功视图和命令类后,就可以实现JSP了。以下是一个简单的JSP片段,用于创建一个表单,让用户选择演出:
```jsp
<form method="post">
<select name="show">
<c:forEach items="${shows}" var="show">
<option value="${show.name}">${show.name}</option>
</c:forEach>
</select>
<input type="text" name="date"
value="<fmt:formatDate value="${reservation.date}" pattern="yyyy-MM-dd"/>"/>
<input type="text" name="numberOfPersons"
value="${reservation.numberOfPersons}"/>
</form>
```
可以看到,在这个示例中,需要使用与控制器中属性编辑器相同的模式来格式化日期,并且需要将演出名称作为选项的值传递。这种方式与控制器中创建的属性编辑器紧密耦合,当需要更改Web应用中的某些内容时,会带来很多麻烦。
0
0
复制全文
相关推荐










