Java EE编程技术学习笔记(3)-JSP

来源:互联网 发布:mysql pid文件丢失 编辑:程序博客网 时间:2024/06/05 07:56

JSP

嵌入JSP页面的成分:HTML、脚本元素、指令、动作。JSP还定义了可以直接使用的内置对象,新的JSP规范使用了表达式语言(EL)。

 

1.脚本

输出表达式 <%= 表达式%>

注释(输出到客户端) <!- comment -> (不输出到客户端) <%-- comment --%>

声明变量、方法和类 <%! 声明代码 %>

 

2.指令

page指令:<%@page language=”java” %>

用来定义JSP页面的全局属性:importcontentTypeisThreadSafesessionbufferautoflushextendsinfoerrorPageisErrorPagelanguage等。

 

Include指令:<%@include file=”relative url”%>

JSP页面内某处嵌入一个文件,包含的文件由JSP分析,分析工作在转换阶段(JSP编译为Servlet)进行。

 

3.动作组件

<jsp:include><jsp:param><jsp:forward><jsp:setProperty><jsp:getProperty><jsp:useBean>

 

4.内置对象

JSP常见内置对象及其对应的java类型和作用范围

request            javax.servlet.ServletRequest        Request
response          javax.servlet.SrvletResponse       Page
pageContext    javax.servlet.jsp.PageContext      Page
session            javax.servlet.http.HttpSession      Session
application       javax.servlet.ServletContext         Application
out                  javax.servlet.jsp.JspWriter            Page
config              javax.servlet.ServletConfig           Page
page               javax.lang.Object                         Page
exception        javax.lang.Throwable                    Page

 

5.表达式语言

(1)基本语法:${expr} JSP 2.0规范新特性 相比JSP脚本更加简洁

(2)隐式对象

JSPpageContext

作用域:pageScope...

请求参数:paramparamValues

请求头:headerheaderValues

Cookiecookie

初始化参数:initParam

(3)存取器 “.”和”[]”

 

JavaBean

<jsp:useBean id=”student3” scope=”page” class=”com.jsp.Student”>

<jsp:setProperty name... property... value...>

<jsp:getProperty name... property...>

 

JSF

1.什么是JSF

(1)JSF是一个框架标准

(2)JSFWeb应用表现层的框架标准

(3)JSF是一个基于组件的框架标准

(4)JSF是一个基于MVC架构的框架标准

 

2.第一个JSF应用

1)新建项目选择JSF框架,主要有jsf-api.jarjsf-impl.jar

2)模型组件由JSF控制JavaBean的生命周期,用@ManagedBean注解。

3)视图组件,#{message.world}代替<jsp:useBean>,没有实例时JSF可以生成实例管理生命周期。

JSF框架按照约定将Bean类名的首字母小写作为Managed Bean的名称。

4)控制组件,配置web.xml

 

3.ManagedBean

(1)JavaBean注册到JSF框架,

可以利用JSF注解:

@ManagedBean(有可选的name属性,没有默认第一个字母小写)

@SessionScoped@RequestScoped@ApplicationScoped@ViewScoped@CustomScoped

可以在face-config.xml<managed-bean>标签配置

(2)生命周期

View代表当前视图,只要当前视图不变就有效

None通常寄存在其他Managed Bean

没有Page,视图被编译为组件树

除了Request,都需要实现序列化接口

RequestApplication范围的Bean在第一次请求时创建,用@ManagedBean(eager=true),可以应用一启动就创建。

(3)CDIBean

为了触发上下文和依赖注入服务,需要在WEB-INF/下添加名为bean.xml的文件,即使只是一个空文件。

CDI Bean也有ApplicationSessionRequest,没有View,有Conversation

@Name

@ConversationScoped

...

@Inject Conversation conversation

...

conversation.begin()

conversation.end()

(4)Bean之间的依赖

@ManagedPorperty(value=”#{message}”)

private MessagedBean messageBean;

使用时:#{helloBean.messageBean.message}

 

4.视图

(1)组件树

(2)标记

Core f: 对组件进行属性设置和功能绑定

Html h: Html控件

Facelets ui: 模板

composite components Composite: 复合组件

(3)EL表达式:与JSP的不同是分隔符不同,JSP的是$JSF可以更新托管Bean的属性,JSF的隐式变量有facesContextview

(4)资源管理

<h:outputScript library=”css” name=”styles.css” target=”body”>

<h:outputStylesheet library=”javascript” name=”util.js” target=”head”>

<h:graphicImage value=”#{resource[‘images:cloudy.gif’]}”>

 

5.页面模板

<ui:insert name=”header/content/footer”>

<ui:include src=”...”>

<ui:composition (template=...)>

<ui:define name=”content”>...</ui:deflne>

</ui:composition>

 

6.JSF请求处理过程

恢复视图(创建视图组件保存在faceContext

应用请求值(请求更新到组件树)

处理校验

更新模型值(UI组件的值更新到Managed Bean

调用应用

显示响应

给按钮增加immediate属性可跳过应用请求值、处理校验、更新模型值等立即执行。

JSF对每个请求创建faceContext对象,维护错误消息队列、事件队列

 

7.导航控制

导航组件:按钮组件(h:commandButtonh:button) 链接组件(h:commandLinkh:linkh:outputLink

Action方法:action=”done” action=”(EL)userBean.addConfirmUser”

导航约定:JSF.xhtml添加到返回值,如果”/done”就认为是绝对路径,到根目录下加载

导航规则:faces-config.xml

<navigation-rule>

<form-view-id>从哪个页面出发

<navigation-case>

<form-action>从哪个按钮出发

<form-outcome>

<if>

<to-view-id>

<redirect/>重定向

Flash对象生命周期可以跨越两个RequestFacesContext.getCurrentInstance().getExternalContext().getFlash().put(“userBean”,this)

<h:outputText value=”#{flash.userBean.firstName}” />

commandButtoncommandLinkpost方法,buttonlinkget方法、outputLinkvalue为视图,跳转到指定资源,不需要涉及JSF框架。

导航中的参数传递:

<h:commandButton value=”注册” action=”#{userBean.addUser}” actionListener=”#{userBean.addUserListener}”><f:attribute name=”userId” value=”123”/>

<h:head><f:metadata><f:viewParam name=”name” value=”#{login.name}”></f:viewParam></f:metadata></head>

 

8.类型转换

标准转换器:

<h:inputText label=”Date of Birth” id=”dob” value=”#{userBean.dob}” required=”true”><f:convertDateTime pattern=”MM-dd-yy” /></h:inputText>(mm-dd-yy)<h:message for=”dob”>

自定义转换器:

Public class PhoneNumberConverter implements Converter {

@Override

public Object getAsObject(FaceContext context, UIComponent component, String value)

@Override

public String getAsString(FaceContext context, UIComponent component, Object value)

}

配置faces-config.xml

<converter><description><converter-id><converter-class>

 

9.输入校验

f:validateBean f:validateDoubleRange f:validateLength f:validateLongRange f:validateRegEx f:validateRequired

Bean方法校验:

public void validateEmail(FaceContext context, UIComponent component, Object value) throws ValidatorException{}

<h:inputText label=”Email Adress” id=”mail” ... validator=”#{userBean.validateEmail}” />

Bean验证框架:

常用的内置注解:MinMaxSizeNotNullNullFuturePastPattern

 

10.事件处理

四种事件类型:Value ChangeActionPhaseSystem

三种监听器处理结果:正常执行、显示响应、完成响应

Value Change:

<h:selectOneMenu value=”#{login.country}” onchange=”submit()” valueChangeListener=”#{login.countryChanged}”>

@Named(“login”)

...

public void countryChanged(ValueChangeEvent event){}

Action:

public void reset(ActionEvent e) {

UIComponent source = e.getComponent();

UIComponent r1 = (UIComponent)source.findComponent(“...”);

r1.setValue(“”);

}

Phase:

针对整个视图,监听器需要实现PhaseListener接口

System

既可以针对视图,也可以针对整个JSF应用,或者视图中的具体组件

 

11.国际化支持

(1)准备资源包如message.properties

Title=欢迎

...

(2)配置资源包

<application>

<resource-bundle>.

<base-name>com.demo.jsf.message

<var>msgs

(3)使用<title>#{msgs.Title}</title>

三种设置本地属性的方法:

(1)xml配置文件

<application>

<resource-bundle>...

<locale-config>

<default-locale>en

<support-locale>zh

(2)<f:view locale=”en”>

(3)动态设置

UIViewRoot viewRoot = FaceContext.getCurrentInstance.getViewRoot();

viewRoot.setLocale(new Locale(“en”));

 

12.Ajax

<h:commandButton value=”查看答案” actionListener=”#{quizBean.changeshow}”>

<f:ajax render=... execute=... event= ... onevent=.../>

</h:commandButton>

原创粉丝点击