Servlet作为服务器的小程序,为我们解决了业务问题(作为控制器)。但是,我们想要写出更接近“前端”的代码,需要我们了解jsp相关技术。
在JSP中,我们要了解:
JSP代码组成 模板脚本元素(指令、动作、声明、scriptlet和表达式)标准动作和定制动作使用指令写JSP代码 page includetablib JSP标准动作 include(运行时调用-单独的.class文件)forward(跳转JSP、Servlet)JSP内置对象 request responseoutsessionconfigapplicationpagepageContextexceptionJSP的生命周期 页面转换:JSP->ServletJSP页面编译加载类创建实例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文件被转换成.javaJava文件被编译成.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_SCOPEPAGE_SCOPEREQUEST_SCOPESESSION_SCOPE好了,终于可以聊聊JSP的指令,动作和内置对象了: 指令列表:
page(属性如下) importisThreadSafecontentTypeisErrorPageerrorPagepageEncoding。。。。。。taglibinclude其实,这些指令已经允许我们在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:useBeanjsp:setPropertyjsp:getPropertyjsp: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="propertyName" property="*"/></jsp:useBean>如果某个JavaBean的属性还是一个对象,我们就得写EL咯!
<%-- dot-Operator --%>${requestScope.name}<%-- []-operator --%>${requstScope.someList["0"]}EL中有一些隐式对象,下面是其一览表:
作用域 pageScoperequsetScopesessionScopeapplicationScope请求参数 paramparamValue请求首部 headerheaderValuescookieinitParampageContext<%-- 下面是一个表单 --%><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}新闻热点
疑难解答