15.1 B/S应用开发历史
servlet/jsp
--JSP Model1--
JSP:收集用户的信息/展示数据/业务代码
JAVA BEAN: 封装数据、处理数据、 高内聚、低耦合
--JSP Model2--
M:model(entity,dao,service)
V: view(jsp)
C: controller (servlet)
--Struts1--
--WebWork 核心x-work
Struts2(以上合并,核心是x-work)
衡量框架的标准:
健壮性:高 稳定
易用性:高 简单
扩展性:高
侵入性:低
15.2 Strusts2的概念
Strusts2是一种轻量级的MVC型框架,它主要解决了请求分发的问题,侧重点在控制层与视图层。
MVC设计模式:
MVC是经典的设计模式,按照代码的功能不同,将其划分为3个模块,分别是:
M: 模型
负责数据的封装和处理,比如entity,dao,service等等
V:视图
负责数据的收集与展示
C:控制
控制器是模型与视图的桥梁,比如servlet
优势:实现了代码的解耦,适合团队开发,方便后期维护
15.3 Strust2的开发流程
开发流程:
1. 新建一个web工程
2. jar包
3. 配置前端控制器
4. 配置struts.xml文件
5. 编写action
执行流程:
localhost:8080/appname/namespace/hello
1. 所有的请求经过FC前端控制器
2. FC根据struts.xml文件的配置信息决定调用哪一个action
-- 根据namespace找到对应的package
-- 根据hello找到对应的action,从而找到了业务控制器HelloAction
3. 调用Action中的方法
4. 根据Action方法返回的字符串决定调用哪一个result
5. 最后根据result的配置信息输出视图
15.4 在action中如何获取页面参数值
在action中如何获取页面参数值
url?name=zs
1. 在action中定义一个成员变量,名字与参数保持一致
2. 给成员变量提供get/set方法
15.5 在jsp页面如何获取Action属性的值
在jsp页面中如何获取Action中属性的值 ${name}
练习:写一个login.jsp
用户名密码
在action中获取用户名和密码,判断是否正确
如果正确,跳转到hello.jsp
反之,回到登陆页面,并提示错误信息
17.1Result组件
Result是用于输出的组件,向页面输出一些内容,比如转发、重定向等等,每一个Result是一个类,需要实现一个接口Result。
Struts2中预置了10种返回类型,定义在Struts-default.xml文件中。
Result类型
1. dispatcher
默认类型,转发,可以将请求转发给jsp页面
2. redirectAction
重定向,将请求发送给另一个action
3. stream
用于向页面输出二进制数据,可以将二进制数据发送给发起端。
4. json
该类型不在10种范围内,若要使用,需要引入相关jar包(struts2-json-plugin),并将package继承的父包改成json-default。
默认情况下,会将栈顶所有的属性值做成json格式返回。
情况1:可以指定返回的数据
<param name="root" > ognl</param>
注:如果ognl表达式的数据类型是基本类型,直接将数值返回,如果是引用类型,会将结果做成
{key:value,key:value}返回
情况2:可以指定某几个返回的数据
<param name="includeProperties"> flag,userCode </param>
完成开通、暂停:
1. 修改starttime以及status的值
2. 重定向到列表页面
拦截器
19.1 拦截器
用途:适合封装一些通用的处理,便于重复利用,比如登录拦截、参数传递、事务处理。
优势:提供代码的灵活性,方便后期维护扩展。
19.2 如何定义拦截器
step1. 写一个Java类型实现接口Interceptor
step2. 重写方法
step3. 配置 struts.xml
struts06 及netctoss
19.3 上传文件拦截
struts06
xml文件的分割
ognl
16.1 OGNL表达式
1. 是一门功能强大的表达式语言,类似EL
1) 访问基本属性 "属性名"
2) 访问引用类型 "引用类型.属性名"
3) 访问数组、集合 "属性名[下标]"
4) 访问map数据 "属性名.key"
5) 基本运算 "age>18""name+10"
6) 调用方法 "list.size()"
7) 调用静态方法 "@类名@方法名()"
8) 创建集合 "{元素1,元素2...}
9) 创建map "#{key:value,key:value}"
16.2 ValueStack
2. ValueStack
值栈:ognl引擎,stack区,map区
1) 存数据
当表单提交时,拉截器可以拦截到表单中的数据,并将数据存放到vs中,ognl引擎,根据拦截到的数据查找(从上往下)stack区 中是否有相同名字的属性,如果有,将拦截到值赋值给该属性。
2) 取数据
ognl引擎根据ongl表达式依次从stack区查找,找到则返回,反之返回空
16.3 struts2的六大核心组件
1. FC
前端控制器,负责请求分发
2. Action
业务控制器,负责处理具体业务逻辑
3. VS
值栈,是action与JSP数据交互的媒介
4. Interceptor
拦截器,负责扩展Action
5. Result
负责输出
6. Tags
标签,负责显示数据
执行流程:
a. 请求发给FC
b. FC根据配置信息确定调用哪一个Action
c. 创建VS值栈对象
d. 创建Action对象,并且将Action放到vs的栈顶
e. 调用Action方法,根据输入属性算输出属性
f. 在调用Action之前或者之后会调用一系列的拦截器
g. 根据Action返回的字符串决定调用哪一个Result组件
h. Result组件根据vs中的数据按照特定的格式将数据输出,通常情况下,是Result转发到JSP页面,在页面中使用tags标签输出数据
16.4 el表达式为什么能获取vs中的数据
因为struts2中重写了request.getAttribute的方法
重写了之后,查找的范围依次是pageContext,request,VS,session,application
实例练习:
登录功能:
step1. 配置action--> 登录页面
step2. 客户端验证
非空 合法性(/^[a-zA-Z0-9]{5,10}$/)
在前端校验的情况下,向服务器发送请求
step3. 业务控制器(AdminAction)-- login.action
AdminDAO AdminDAOImpl
findByUsername(String username)
step4. 根据action返回的result字符串决定调用哪一个result
struts标签
18.1 Struts标签
a. 显示标签
<s:property value="ognl"/>
根据ognl表达式查找vs中的数据,并返回到页面上。
b. 循环标签
<s:iterator value="ognl">
循环体
<s:iterator>
<s:debug></s:debug>
根据ognl表达式查找vs值栈中的数据,在循环的过程当中,栈顶会有原先的action变成循环对象,此刻action退居到第二位,循环结束之后,栈顶恢复为action
<s:iterator begin="" end="" var="">
//循环体
</s:iterator>
一般在分页时用,循环的对象是Integer,没有属性,可以通过<s:property/>取元素值,也可以通过绑定名获取<s:propertyvalue="#p">
c. 判断标签
<s:if test="ognl"></s:if>
<s:else> </s:else>
18.2 UI标签
<s:form>
18.3"修改" 模块练习
3.修改
load.action 加载按钮 --->UpdateCostAction 保存按钮-->updateCost.jsp
点击保存-->修改表中的相应字段-->div显示3秒后消失
if
包月
基本时长、单位费用不能修改
套餐
三个输入框数据都可以修改
计时
基本时长、基本费用都不能修改
点击取消,回到当前列表页面
15.6 NETCTOSS练习
NETCTOSS(电信运营支持系统网络版)
NET China Telecom Operation Support Sys
项目背景:
电信有一套unix服务对外出租,需要使用一套系统来解决这类出租业务,实现自动化办公的目的。
使用者:营业员
作用:可以创建账号、查询自费、以及查询用户的消费情况
部署:应用服务器
资费列表页面:
1. cost表
2. Cost实体类
3. DAO接口
List<Cost> findAll() throws Exception
4. 实现类
5. ListCostAction
输出属性 list
6. costList.jsp 循环遍历将数据展示出来