struts(结构)是一个开源的web框架(frameset)
优点:程序更加规范,开发效率提高,程序可读性增加,程序可维护性增加
缺点:form表单有点不好,action是单态(影响网站并发性的处理),框架提过程序规范,约束程序的自由
struts-config.xml是struts的一个核心文件
struts组件一般包含:ActionServlet(总控制器),ActionForm(存放数据的表单),Action(分控制器),model(模型),jsp(页面)
struts开发一般步骤:
下载导入struts开发包
基础页面设计开发(jsp,业务功能界面)
开发ActionFrom和Action(servlet控制器)
配置struts-config.xml文件
友好界面设计开发(jsp,成功错误跳转页面)
在web.xml中配置ActionServlet
struts处理中文乱码问题(过滤器)
存放数据的表单类需要继承ActionForm抽象类,数据类中的成员函数设置获得属性值(set/get方法)必须与表单属性名(name属性值)相对应,一般为了方便数据类中的成员变量属性名与表单属性名(name属性值)一致
eclipse提示快捷键Alt+/
分控制器类需要继承Action类,并重写public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response)函数
struts-config.xml文件配置ActionForm与Action、以及对应关系、跳转位置,一般文件放在/WEB-INF目录下
struts-config.xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC ".//Apache Softwate Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="表单名,一般规范化是小写表单类名" scope="request/session(表单类数据保存在的对象,默认session)" type="指定表单类的全路径(包含包名)"></form-bean>
</form-beans>
<action-mappings>
<action path="网址访问的资源名称一般为(/资源名)" name="关联表单类的表单名" type="指定控制器类的全路径" attribute="属性名(放入数据对象中对应的属性名)" scope="request/session(表单类数据保存在的对象,默认session)validate="false/true(是否对表单进行校验)">
<forward name="指定跳转名" path="指定跳转的页面"></forward>
</action>
</action-mappings>
</struts-config>
form-beans:配置表单
action-mappings:配置所有分控制器
action:配置分控制器
forward:配置跳转页面
web.xml文件配置:
<servlet>
<servlet-name>总控制器名</servlet-name>
<servlet-class>指定总控制器全路径(一般是引用路径org.apache.struts.action.ActionServlet)</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>指定配置信息路径即struts-config.xml的路径 [,struts-config.xml的路径(多个配置文件)]</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>总控制器名</servlet-name>
<url-pattern>指定请求都通过总控制器(一般是*.do)</url-pattern>
</servlet-mapping>
mapping.findForward("指定页面的跳转名"); 跳转页面
提交表单数据后,总控制器通过反射机制实例化对应表单类,并调用相应的set方法存放表单数据
struts1的所有控制器(包括总控制器)都是单态的,即在整个程序运行工程中,始终是一个对象
jstl(jsp standard tag libaray)jsp标准标签库
优点:
提供应用程序服务器之间统一的接口,web应用可以在不同服务器之间移植
简化jsp在web应用程序中的开发
减少jsp中java片段甚至没有,代码更简洁
提高jsp开发速度,缩短开发周期
jsp使用jstl标签库需要下载相应的jar包,并在jsp开始部分引入
tld:tag library description标签库描述文件
<%@ taglib prefix="标签前缀(一般是c)" uri="对应标签的资源地址名(在对应的tld文件中)"%>
jstl标签分类:
一般标签:
<c:out value=”在页面上输出的内容/${属性名.变量名}” default=”当value没有值或未找到对应属性名时默认输出的内容” escapeXml=”输出value值的形式[true(文本)/false(html形式)]”></out>:
相当于<%out.println(“内容/( (属性名)数据对象域.getAttribute(“属性名”) ).get变量名”) %> 不同对象域中相同属性名在c:out中的优先级从高到低pageContext,request,session,application
<c:set var=”属性名” value=”属性值” scope=”存放的数据对象域”></c:set>
相当于<%数据对象域.setAttribute(“属性名”,”属性值”) %>
<c:remove var=”属性名” scope=”数据对象域(默认所有数据对象域)”></c:remove>删除指定数据对象域中的指定属性名的值
<c:catch var=”异常名”></c:catch>将捕获的异常信息存入指定异常名中,取出异常信息可以使用异常名.message
条件标签:
<c:if test=”${判断表达式(变量值会根据判断类型转换成相应的数据类型,字符串使用单引号,对象名.属性名)}”>执行的语句</c:if> 对象名.属性名相当于对象名.get属性名()的调用
jsp可以有多个引入指令
<c:choose>
<c:when test=”${判断表达式}”></c:when>
[<c:when test=”${判断表达式}”></c:when>]
<c:otherwise></c:otherwise>
</c:choose> 多分支判断语句相当于switch,case,default语句
迭代标签:
<c:forEach items=”${属性名}” var=”变量名(相当于for循环的i变量)” begin=”变量名取值开始位置” end=” 变量名取值结束位置” step=”变量名每循环一次取值长度”>循环执行的语句</c:forEach>相当于for循环语句,将指定属性名的集合对象中每个对象取出放入变量名中
<c:forTokens items=”${属性名}/(字符串 [,字符串])” delims=”分割items的分隔符(,)” var=”变量名(相当于for循环的i变量)” begin=”变量名取值开始位置” end=” 变量名取值结束位置” step=”变量名每循环一次取值长度”>将指定属性名的集合对象或字符串中通过分割符分割后依次放入变量名中
判断变量是否为空的表达式:${empty/(!empty) 变量名}
url相关标签:
<c:redirect url=”url地址”></c:redirect> 重定向到指定url地址
<c:import url=”url地址”> 将指定url地址文件导入本jsp页面中
<c:param name=”属性名” value=”属性值”></c:param> 引入文件时传入的参数以及url地址跳转传入的参数都是通过${param.属性名}获取
</c:import>
struts标签分类:
html标签:
<html:button property=”名字” value=”值”></html:button>相当于<input type=”button” name=”名字” value=”值”>
<html:base ref=”url地址”></html:base> 设置超链接默认url地址
<html:image src=”图片地址”></html:image>相当于<input type=”image” name=”” src=”图片地址”> 显示指定图片按钮
<html:img src=”图片地址”/>相当于<image src=”图片地址”> 显示指定图片
<html:link href=”url地址”></html:link>相当于<a href=”url地址”></a> 显示指定的超链接
struts的有信息输入的html标签需要放在表单标签(<html:form></html:form>)中,否则会出错
get提交方式可以让浏览器收藏页面url地址时把url地址后面的参数一起收藏
struts的html标签与普通的html标签可以一起使用
多个过滤器执行顺序是根据部署顺序决定的
bean标签:
<bean:write name=”属性名” property=”对象的成员变量名” scope=”数据对象域(默认所有数据对象域)”/> 显示数据对象域中属性名对应的对象的指定成员变量名的值
property不是根据成员变量名指定属性名,而是根据set属性名()和get属性名()中的属性名指定属性名
使用工具引入struts会自动生成资源文件ApplicationResources.properties,资源文件中存入参数的格式:
变量名={参数个数号(0到4)} 外部输入的参数根据参数号可以替换指定位置的参数
#号表示注释
<bean:message key=”变量名” arg参数号(0到4)=”参数值”/> 将资源文件中变量名指定参数号的参数替换后显示
资源文件中中文字符需要转换成ASCII码
jdk中ASCII码转换器在jdk安装目录下的bin\native2ascii.exe
<bean:define id=”标识号” name=”变量名” value=”变量值” scope=”存入的数据对象域” property=”属性名”/> 定义变量或者对象存入数据对象域中
<jsp:useBean id=”对象名” class=”类名(包含包名)”></jsp:useBean> 实例化一个指定类名的对象
<jsp:useBean name=”对象名” property=”成员变量名” value=”值”></jsp:useBean> 给对象的指定成员变量赋值
logic标签
<logic:iterate id=”对象名” name=”属性名”>每个对象执行语句</logic:iterate> 将指定属性名对应的集合中的对象依次取出放入指定对象名中
一般标签选择使用顺序是jstl标签,el表达式,struts标签
<logic:empty/notEmpty name=”属性名”>执行语句</logic:iterate> 指定属性名是否空执行相应语句
<logic:greaterThan name=”对象名” property=”成员变量名” value=”值”>执行语句</logic:greaterThan > 对象的指定成员变量名的值大于指定值执行相应语句
控制器action继承DispatchAction(分派控制器)用于处理一类请求,配置分派控制器是指定parameter属性名称,属性名称对应的值用于指定请求处理的函数
使用分派控制器函数名一般自定义,指定处理的函数是在跳转重定向时在url地址后面加入参数parameter属性名称=属性值(指定处理函数的函数名),默认不加参数会指定默认函数execute()进行处理
数据对象域.getSession().invalidate(); 设置所有session失效
数据对象域.getSession().removeAttribute(属性名); 设置指定属性名的session失效
action标签中的forward标签是局部跳转,这个forward只能被这个action使用
<global-forwards>
[<forward name=”跳转名” path=”跳转路径”></forward>]
</global-forwards> 全局跳转,所有的action都能通过跳转名进行跳转
dynimic form(动态表单)不需要创建一个表单类直接在struts-config.xml中进行配置:
<form-beans>
<form-bean name=”表单名” type=”表单类型(org.apache.struts.action.DynaActionForm)”>
[<form-property name=”参数名” type=”参数类型”></ form-property>]
</form-bean>
</form-beans>
动态表单名.getString(“参数名”); 取出动态表单的指定参数名的参数值
动态表单名.get (“参数名”); 取出动态表单的指定参数名的参数对应的对象
表单中有文件控件需要重新指定表单的编码方式:
<form enctype=”multipart/form-data” ></form>
FormFile 文件名 定义表单文件变量
<input type="file"/> jsp页面文件输入
页面文件上传需要通过控制器将文件以流的形式存入服务器内存中
InputStream 文件流名称=FormFile.getInputStream(); 获得表单文件输入流对象
String 变量名=UUID.randomUUID().toString(); 获得一个不会重复的16进制数
int 变量名=字符串.lastIndexOf(“指定字符串”); 获得指定字符串在字符串最右边出现的位置
字符串.substring(开始位置(从0开始),结束位置(不包括结束位置)); 返回字符串从开始位置到结束位置的截取子字符串
上传文件名称中文乱码问题可以通过过滤器解决
response.setHeader(“Content-Disposition”,”attachment;filename=下载的文件名”); 下载文件时设置返回浏览器的响应信息,表示要下载文件
java.net.URLEncoder.encode(“中文字符串”,”编码格式”); 下载的文件名中文需要转换
所有文件类型种类可以在web.xml文件中查看