Servlet做为服务器的小程序,为咱们解决了业务问题(做为控制器)。可是,咱们想要写出更接近“前端”的代码,须要咱们了解JSP相关技术。前端
在JSP中,咱们要了解:java
JSP代码组成web
模板小程序
脚本元素(指令、动做、声明、scriptlet和表达式)服务器
标准动做和定制动做cookie
使用指令写JSP代码session
pageapp
includejsp
tablibpost
JSP标准动做
include(运行时调用-单独的.class文件)
forward(跳转JSP、Servlet)
JSP内置对象
request
response
out
session
config
application
page
pageContext
exception
JSP的生命周期
页面转换:JSP->Servlet
JSP页面编译
加载类
建立实例
jspinit
使用_jspService
一个JSP示例:
<%@ page language="java" pageEncoding="utf-8"%> <%@ page import="com.web.po.*"%> <%-- 这是一个JSP注释 --%> <% int number = 0; %> <%= number++1 %>
首先,咱们要考虑的是,容器对咱们的JSP页面作了什么,如何让JSP转换成Servlet的:
小脚本里的代码会放在通用服务方法,变量为局部变量
使用JSP声明的变量,会成为Servlet的类变量
容器,实际上,按照以下的步骤生成Servlet
查看指令,转换相应的方法
建立一个HttpServlet的子类
检查声明,把变量写入类
建立服务方法
把HTML转换成流输出的方式
好了,该看一下JSP的生命周期了:
JSP文件被部署到Web容器里
第一个请求到来,JSP文件被转换成.java
Java文件被编译成.class文件
容器加载Servlet类
实例化Servlet,调用servlet的jspInit()初始化
和Servlet同样,咱们的JSP也是能够配置初始化参数的,咱们须要在DD文件里这样写:
<servlet> <jsp-file>somefile</jsp-file> <init-param> <param-name></param-name> <param-value></param-value> </init-param> </servlet>
或者,本身在JSP文件中写声明:
<%! public void jspInit(){ // 在这里写初始化的逻辑代码 } %>
而后,咱们的JSP中也是有做用域(PageContext中的枚举值):
APPLICATION_SCOPE
PAGE_SCOPE
REQUEST_SCOPE
SESSION_SCOPE
好了,终于能够聊聊JSP的指令,动做和内置对象了:
指令列表:
page(属性以下)
import
isThreadSafe
contentType
isErrorPage
errorPage
pageEncoding
。。。。。。
taglib
include
其实,这些指令已经容许咱们在JSP页面中书写Java代码,可是,为了后期维护,咱们不该该写scriptlet。这就须要咱们在DD中禁用小脚本
<web-app> <jsp-config> <jsp-property-group> <!-- 下面的配置对全部的JSP文件,都禁用Java小脚本 --> <url-pattern>*.jsp</url-pattern> <scripting-invalid>true</scripting-invalid> <jsp-property-group> </jsp-config> <web-app>
不过,当咱们写了太多的脚本,咱们开始寻求无脚本页面,因而,JSP标准动做能够来帮忙:
JavaBean相关
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:param
<%-- 带体的useBean --%> <jsp:useBean id="beanId" class="someClass" scope="someScope"> <jsp:setProperty name="propertyName" value="propertyValue"/> </jsp:useBean> <%-- 使用多态的useBean --%> <jsp:useBean id="xx" class="someClass" type="superClassName"> </jsp:useBean> <%-- 使用param设置bean的属性 --%> <jsp:useBean id="xx" class="xx" scope="someScope"> <jsp:setProperty name="propertyName" param="propertyName"/> </jsp:useBean> <%-- 若是bean的属性和表单属性名一致,可使用以下代码 --%> <jsp:useBean id="xx" class="xx" scope="someScope"> <jsp:setProperty name="beanName" property="*"/> </jsp:useBean>
若是某个JavaBean的属性仍是一个对象,咱们就得写EL咯!
<%-- dot-operator --%> ${requestScope.name} <%-- []-operator --%> ${requstScope.someList["0"]}
EL中有一些隐式对象,下面是其一览表:
做用域
pageScope
requsetScope
sessionScope
applicationScope
请求参数
param
paramValue
请求首部
header
headerValues
cookie
initParam
pageContext
<%-- 下面是一个表单 --%> <form action="result.jsp" method="post"> 用户名:<input type="text" name="username"> 食物1:<input type="text" name="food"> 食物2:<input type="text" name="food"> </form> <%-- 下面是result.jsp --%> ${param.username} <%-- 使用paramValues获取多值参数 --%> ${paramValues.food[0]} <%-- 获取头部信息 --%> ${header.host}