struts1和el表达式

struts是对mvc框架的实现

●配置struts
  1.拷贝struts lib下的所有jar包到web-inf/lib
  2.配置web.xml
 <!-- Standard Action Servlet Configuration (with debugging) -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup><!-- 越小优先级越高 --!>
  </servlet>


  <!-- Standard Action Servlet Mapping -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  3.配置Struts-config.xml(/web-inf/目录下)

●使用struts
1.建立xxxActionForm类 从ActionForm类继承
  建立属性必须与html中表单中需要收集的输入域的名称相同
2.建立xxxAction类 从Action类继承
  重写execute方法
3.配置配置Struts-config.xml
<struts-config>
 <form-beans>
  <form-bean name="loginform" type="com.bjsxt.struts.LoginActionForm"/>
 </form-beans>
 <action-mappings>
  <action path="/login"
  type="com.bjsxt.struts.LoginAction"
  name="loginform"
  scope="request"
  validate="true">
   <forward name="success" path="/login_success.jsp"></forward>
   <forward name="error" path="/login_error.jsp"></forward>
  </action>
 </action-mappings>
 <message-resources parameter="MessageResources" />
</struts-config>
4.ActionForm中有初始化方法reset()和validate()方法
可以重写它们实现业务逻辑。
在struts-config.xml中,<action validate="false">不使用验证方法
5.配置国际化
在struts-config.xml文件中加入
<message-resources parameter="MessageResources" />
拷贝MessageResources.properties到src下

●<bean:write> 输出标签
首先在jsp页面中加入
<%@ taglib prefix="bean" uri="http://struts.apache.org/tag-bean" %>
·输出普通属性
<bean:write name="XXXX"/>
ps:测试程序中XXXX为普通属性存入了request中。
·以标签形式而非字符串输出html文本
<bean:write filter="false">
·输出日期 后台setAttribute("today",new Date());
<bean:write name="today">
输出效果为Fri Mar 28 15:02:41 CST 2008
<bean:write name="today" format="yyyy-MM-dd HH:mm:ss"/>
输出效果为2008-03-28 15:04:21
·格式化数字 后台setAttribute("n",1234567.345);
<bean:write name="n" format="###,###.0000" />
输出为123,456,7.3450
·将后台对象的特定属性取出
<bean:write name="user" property="group.name" />

●<logic:empty>为空<logic:notempty>不为空

<%@ taglib prefix="logic" uri="http://struts.apache.org/tag-logic" %>

<logic:empty name="xxxx">
xxxx为空时执行这里的代码 (空串或者不存在)
</logic:empty>
<logic:notempty name="xxxx">
xxxx不为空时执行这里的代码
</logic:notempty>
<logic:present name="xxxx">
xxxx存在时执行这里的代码
</logic:present>
<logic:notpresent name="xxxx">
xxxx不存在时执行这里的代码  (没声明)
</logic:notpresent>

●<logic:iterate>
<logic:iterate id="xxx" name="list">
xxx为每次的元素 name为迭代的列表
(可以用bean:write标签输出)
</logic:iterate>

●el表达式 (只能输出)
使用方法$和{} 
前台页面写1+1=${1+1}
输出为 1+1=2
·取普通字符串
${hello}
将request中名为hello的字符串取出
未指定隐式对象scope的话,它会从所有隐式对象中搜索
el表达式的隐式对象有:
pageScope,requestScope,sessionScope,applicationScope
${requestScope.hello}
此时直接从request中搜索
·取对象及对象属性(属性必须有get方法)当内容为空时 el内部自动转换成空串  ${user }
  原因是el表达式访问数据他是表现层的一个技术 尽量规避空指针
${user.username}
·取map的key对应的value
${mapname.key}    当key为数字时${mapname.["1"]}
·取字符串数组
${arrayname[index]}
·取对象数组的对象的属性
${arrayname[index].param}
·集合中的对象的属性
${listname[index].param}
·对运算符的支持情况
加+ 减- 乘* 除div 除/ 取余%
== != < > <= >= && || !都支持
·判断 空串 空列表 非空
${empty XXXX} XXXX是否为空
当空串、空列表为true 非空为false
${!empty XXXX} 是否非空
·取actionForm中对象
${actionFormName.paramName}
·取actionForm中数组变量
${XxxxForm.ArrayName }


●JSTL标签
将JSTL的jstl.jar和standard.jar
包复制到web-inf/lib
在前台页面<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
找到你的jstl的jar包,解压后,找到META-INF下的tld文件。
根据tld中的 <uri>http://java.sun.com/jsp/jstl/core</uri>

1.核心库

1)输出
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
·<c:out value="${hello}"/>
直接输出attribute中hello的内容
·<c:out value="${aaa}" default="empty"/>
aaa为空,什么都不输出,当配置了default时,输出default值
·<c:out value="${xx}" escapeXml="true" />
xx为html标签文本,escapeXml="false"时,输出标签表现

2)设置变量或值
·<c:set value="10" var="v" scope="page"/>在页面中设置临时变量v=10

·<c:remove var="v"/>清除页面中v变量

3)条件控制标签
<c:if test="${v1 < v2}" scope="page" var="n">
 v1<v2时输出此处内容,结果存入变量n中
</c:if>

<c:if test="${empty v3}" scope="page" var="n">
v3为空时输出此处内容,结果存入变量n中
</c:if>

4)多种条件控制
<c:choose>
 <c:when test="${v1 < v2}">
 v1小于v2输出此处
 </c:when>
 <c:otherwise>
 否则进入这里
 </c:otherwise> 
</c:choose>
必须出现when标签 否则出错

5)循环控制标签 就是增强for
  items写成el是要去四个域中找userlist
  var是pageContext域中的一个变量
<c:forEach var="user1" items="${userlist}">
 ${user1.username}<br>
 ${user1.age}<br>
 ${user1.user.group.name}<br>
</c:forEach>

<c:forEach var="entry" items="${map}">
 ${entry.key}<br>
 ${entry.value}<br>
</c:forEach>

<c:forEach var="user1" items="${userlist}" varStatus="vs"> varStatus为迭代状态
 <c:choose>
  <c:when test="${vs.count % 2 == 0}">
   行号为基数输出此处
  </c:when>
  <c:otherwise>
   行号为偶数输出此处
  </c:otherwise>
 </c:choose>
</c:forEach>
此例中varStatus为索引对象,count方法取其中数字.

<c:forEach var="user1" items="${userlist}" var="user1" begin="2" end="8" step="2">
 从第二个输出到第八个 ,间隔两个输出:${user1}
</c:forEach>

<c:forEach begin="0" end="5">
 此处内容输出6次
</c:forEach>

<c:forEach items="${map}" var="entry">
 ${entry.key}输出map的key
 ${entry.value}输出map的value
</c:forEach>

6)分割字符串s="1,2,3,4,5"
<c:forTokens items="${s}" delims="," var="v">
 ${v} 将逗号去掉,输出为12345
</c:forTokens>

7)抓异常
<c:catch var="e">
<%
Integer.parseInt("abcde");
%>
</c:catch>
错误信息在e中,打印出:${e}

8)引入页面
<c:import url="http://localhost:8080/"></c:import>

9)组装url与url传参 还有当cookie禁用时url重写传sessionid 对参数url编码
<c:url value="http://localhost:8080/" var="v">
 <c:param name="username" value=""${name}/>
<c:url>
此时打印出的v这个url地址为http://localhost:8080/?username=XXX

10)
<c:redirect context="/struts_taglib" url="/index.jsp"/></c:redirect>
此时会重定向到/struts_taglib/index.jsp

2.格式化
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
1)日期
·<fmt:formatDate value="${today}" />
输出为2011-3-15
·<fmt:formatDate value="${today}" type="time" />
输出为13:23:19
·<fmt:formatDate value="${today}" type="date" />
输出为2011-3-15
·<fmt:formatDate value="${today}" type="both" />
输出为2011-3-15 13:23:19
·<fmt:formatDate value="${today}" dateStyle="short" />
输出为11-3-15
·<fmt:formatDate value="${today}" dateStyle="medium" />
输出为2011-3-15
·<fmt:formatDate value="${today}" dateStyle="long" />
输出为2011年3月15日
·<fmt:formatDate value="${today}" dateStyle="full" />
输出为2011年3月15日星期二
·<fmt:formatDate value="${today}" pattern="yyyy/mm/dd HH:mm:ss"/>
输出为2011/03/15 13:35:12
·<fmt:formatDate value="${today}" pattern="yyyy/mm/dd HH:mm:ss" var="d"/>
${d}显示 变量d
2)数字格式化 setAttribute("n",1234567.1234)
·<fmt:formatNumber value="${n}" />
输出为1,234,567.123
·<fmt:formatNumber value="${n}" type="number"/>
输出为1,234,567.123
·<fmt:formatNumber value="${n}" type="currency"/>
输出为¥1,234,567,12
·<fmt:formatNumber value="${n}" type="currency" currencySymbol="$"/>
输出为$1,234,567,12
·<fmt:formatNumber value="${n}" groupingUsed="false"/>
输出为1234567.123
·<fmt:formatNumber value="${n}" minFractionDigits="5" minIntegerDigits="10"/>
整数10位小数5位,输出为0,001,234,567,12340
·<fmt:formatNumber value="${n}" pattern="###,###.000000" />
输出为1,234,567.1234000
·<fmt:formatNumber value=".1234567" type="percent" />
输出为12%
·<fmt:formatNumber value=".1234567" type="percent" maxFractionDigits="2"
 maxIntegerDigits="2" />
输出为12.34%

3.函数库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function"%>
函数调用在el表达式中采用 前缀+冒号+函数名
1)取长度 (hello="helloWorld")
${fn:length(hello)}
${fn:length(list)}
唱歌
2)自定义函数
i.建立类
ii.建立 必须公共静态 方法
iii.在web-inf/建立File XXX.tld
将fn.tld中的内容复制过去
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
   
<description>JSTL 1.1 functions library</description>
<display-name>JSTL functions</display-name>
<tlib-version>1.1</tlib-version>
<short-name>my</short-name>
<uri>http://java.sun.com/jsp/jstl/functions</uri>

<function>
    <name>say</name>  页面调用时叫什么这里就写什么
    <function-class>com.bjsxt.struts.MyFunctions</function-class>方法的类
    <function-signature>java.lang.String sayHello(java.lang.String)
    </function-signature>方法的描述
</function>
</taglib>

前台可以调用
<%@ taglib prefix="上面定义的shortname" uri="上面定义的uri" %>
${my:say("Tom")}

●路径问题
使action的path和jsp页面的路径相同会很方便。
如path="/user/add"虽然user不存在,但是这样设置。
jsp的真实路径为/webroot/user/user_add.jsp
这样可以直接在jsp页面中将action写add而不用写路径。

●对象的copy拷贝
struts包中有BeanUtils工具包,我们可以直接使用
BeanUtils.copyProperties(目标,源);
完成从源向目标的拷贝。
源和目标必须属性一样并且get、set方法符合标准。

●动态actionForm dynamicActionForm
为了避免标准actionForm膨胀而设计
<form-bean name="dynaUserActionForm"
    type="org.apache.struts.action.DynaActionForm">
 <form-property name="name" type="java.lang.String"/>
 <form-property name="age" type="java.lang.Integer"/>
</form-bean>

这样这个actionForm就拥有了两个属性
动态ActionForm其实吧html页面中的元素的值放到map中所以
前台取${dynaAction.map.name}
${dynaAction.map.age}

●actionForm的reset初始化
actionForm的reset方法每次往进设值时都会调用
所以我们假如只想每次只调用一次时
可以自定义reset方法 重置actionForm的成员变量
在初始页面调用(初始页面的action要配此actionForm)

●上传组件
struts中有fileupload.jar包
前台页面:
<form action="upload.do" method="post" enctype="multipart/form-data">
    标题:<input type="text" name="title"><br>
    文件名:<input type="file" name="myfile"><br>
    <input type="submit" value="上传"><br>
 </form>
后台页面:
ActionForm中
private String title;
private FormFile myfile;
Action中
UploadActionForm uaf = (UploadActionForm)form;
FormFile myfile = uaf.getMyfile();
//存入磁盘
FileOutputStream fos = new FileOutputStream("c:\\"+myfile.getFileName());
fos.write(myfile.getFileData());
fos.flush();
fos.close();

控制上传大小在
<action-mapping>外面加标签<controller 配置属性></controller>

●测试空字段
如果html中没有写input输入域,用jsp脚本取出的胃null,
el表达式是空串。
如果html中存在input输入域,但没有输入值,
那么jsp脚本和el表达式输出都是空串。

●转换器
Struts对ActionForm类型的自动转换:
boolean: yes,y,1,true,on这些都可以转换为true类型,而且是忽略大小写的;其它情况会转换为false类型
Date类型的转换:
* 如果定义Date为: java.sql.Date类型,页面传递到后台的相应属性不能为空字符串,而且其格式
  必须是yyyy-MM-dd。
* 如果定义Date为:java.util.Date类型,默认情况下,struts无法转换此类型,我们需要定义
  自己的Converter来进行转换
自定义转换器
public class UtilDateConverter implements Converter {

 public Object convert(Class type, Object value) {
  System.out.println("UtilDateConverter=>>convert() value=" + value);
  if (value == null) {
   return value;
  }
  if (value instanceof Date) {
   return value;
  }
  if (value instanceof String) {
   SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
   try {
    return format.parse((String)value);
   } catch (ParseException e) {
    e.printStackTrace();
   }
  }
  return null;
 }

}
注册转换器(在servlet中初始化)
public class UtilDateConverterIniServlet extends HttpServlet {

 @Override
 public void init() throws ServletException {
    System.out.println("UtilDateConverterIniServlet=>>init()");
   ConvertUtils.register(new UtilDateConverter(), Date.class);
 }

}
Struts对ActionForm类型的自动转换过程:
1、搜索request中的parameter
2、把request中所有的参数名称和值(字符串类型)放到map中(key为参数名称,value为值)
3、调用BeanUtils.setProperty方法,将map中的值逐个设置到ActionForm的数性上;
   *对于ActionForm中的每一个属性,根据属性的类型,调用相应的Converter
   *调用Converter的convert方法,将相应的字符串转换成ActionForm中指定的类型
在web.xml中配
<servlet>
  <servlet-name>UtilDateConverterIniServlet</servlet-name>
  <servlet-class>com.bjsxt.struts.UtilDateConverterIniServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

●使用<Plugin>机制也可以注册

在struts1.1中利用新增的org.apache.struts.action.PlugIn 接口提供<Plugin>扩展机制。
任何的JAVA类都可以当作你自己的PLUGIN,只要该类实现前面提到的PlugIn接口。

PlugIn接口包含两个方法,如下:

public interface PlugIn {

public void init(ActionServlet servlet, ApplicationConfig config)
throws ServletException;

public void destroy();
}
在struts应用程序启动的时候,ActionServlet通过init()方法实例每一个Plugin,struts支持一个或多个Plugin,如果你的应用程序采取多模块的话,并且可以延伸到"子应用模块"(sub-application:struts1.1新增功能,此类内容我会在以后的文章中介绍)。 一旦你实现了struts的PlugIn接口,你将可以在init()方法中放一些需要初始化的东西。(这里将是一个非常好的"安放"数据库连接的地方,当然初始化数据库连接也可以通过datasource。),对于destory()方法我想你一定明白它将在你的应用程序结束时调用,这里你可以关闭你在init()方法中初始化的数据库连接等等。

在init方法中写ConvertUtils.register(new UtilDateConverter(), Date.class);就可以完成注册

在struts-config.xml中添加你的plugin

这将是非常简单的工作。如下代码:
<plug-in className="com.ifreeway.rms.v12.action.Plugins.InitDataSource"/>

●ActionForward
<forward name="XXXX" path="/XXX" redirect="true"/>
1)属性 name  此属性与action的execute方法返回的mapping.findForward("这里")相关联
2)属性 path  跳转到的页面或者action
3)属性 redirect  是否重定向
4)属性 className
全局actionForward是每个action都可以使用
<global-forwards>
 <forward name="XXXX" path="/XXX" redirect="true"/>
</global-forwards>
动态actionForward 分页应用
ActionForward af = new ActionForward();
af.setPath("/page"+page+".jsp");
af.setRedirect(true);
return af;

●Action标签
1)path 全局唯一,其实就是名字
2)forward 直接跳转到此页面,不执行action
3)type class的完整路径
4)name  关联actionform的名字
5)scope  actionform的范围session还是request还是别的
6)validate 是否执行actionForm中的validate方法
7)input 出现错误会自动转向此属性指定的页面(在execute返回中写)
8)parameter
9)unknown 当为true时 跳转到这个action指定的页面
职责
·校验输入数据
·调用业务逻辑方法
·检测处理异常
·根据逻辑进行转向操作

●i18n
国际化资源文件是由basename+locale组成 如MessageBundle_zh_CN.properties
basename可以是任意合法的字符串。
缺省的Locale是由操作系统决定,Locale是由国家和语言代码组成。

1)在 src目录下建立资源文件
缺省文件为basename.properties
配置文件为basename_zh_CN.properties
配置文件为basename_en_US.properties

2)在资源文件中以key和value格式写
key随便写,“.”没有特别含义
user.title=User Login
user.username=User Name
user.password=User Password
user.login=Login

3)在struts.xml中加入标签
<message-resources parameter="basename">

4)在前台页面中用<bean:message>
·引入<@taglib prefix="bean" uri="http://struts.apache.org/tag/tags-bean" %>
·<bean:message key="user.title" >进行输出

5)在Action类中手动改变Local
pubilc ActionForward execute(){
 Locale currentLocale = null;
 //取出链接接受到的参数
 String lang = request.getParameter("lang");
 if("zh".equals(lang)){
  currentLocale = new Locale("zh","CN");
 }else if("en".equals(lang)){
  currtenLocale = new Locale("en","us");
 }
 //在session中加入Locale信息
 requset.getSession().setAttribute(Globals.LOCALE_KEY,currentLocale);
 return mapping.findForward("success");
}
6)动态消息国际化处理
·在资源文件中写user.not.found=用户不能找到,用户名称=[{0}]
  user.password.error=密码错误
  user.login.success={0},登陆成功
·在acion类中的execute中
ActionMessages messages = new ActionMessages();//动态消息集合
ActionMessage msg = new ActionMessage("user.login.success",username);
//参数为key值和占位符
messages.add("loginsuccess",msg);//将动态消息放入集合中
this.saveMessages(request,messages);//将集合放到此页面对别的页面的request中
     /* this.saveErrors(request,messages);将error错误信息放到request*/
return mapping.findForward("success");

·在前台页面显示
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
<html:messages id="msg" message="true" property="loginsuccess">
这个标签其实就是迭代标签,每个变量放入msg中,
message="true"时读messages中的message信息,否则读error错误信息
property为分组参数,与messages.add中的第一个参数名对应
 <bean:write name="msg" />
</html:messages>

●Struts异常处理
1)编程式异常(try catch)
·截获某个异常
·创建相应异常消息
·传递异常消息
·转向到相应错误页面
2)声明式异常
·配置
  在struts-config.xml中
  action标签中 forward标签前
  <exception key="user.not.found"
      type="com.bjsxt.struts.UserNotFoundException"/>
 
  action标签中的input属性的页面就是此信息将要显示的页面
  其实就是自动给error赋值,用<html:errors/>就可以取
·全局
  在action-mapping标签外配置全局错误信息
  <global-exceptions>
  <exception key="user.not.found"
             type="com.bjsxt.struts.UserNotFoundException"
      path="/error.jsp"/><!--公共处理错误页面,优先于input--!>
  </global-exceptions>

3)个性化的异常
·单个占位符可以在异常中建立空的构造方法和带String参数的构造方法
  在new这个异常的时候 可以给它传参数 此时占位符就可以被代替了 前台就可以打印出来

●标准的BaseAction
1)DispachAction
·首先action类继承DispatchAction
·自定义方法 返回值必须是ActionForward
·自定义方法 参数ActionMapping mapping, ActionForm form,
   HttpServletRequest request,    HttpServletResponse response
·自定义方法举例
public ActionForward add(ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response) throws Exception {
 //获取从页面表单中提交过来的值
 UserActionForm uaf = (UserActionForm)form;
 //创建User实体对象,并将ActionForm中的内容设置到User对象中
 User user = new User();
 BeanUtils.copyProperties(user, uaf);
 user.setCreateDate(new Date());
 //调用业务逻辑操作
 UserManager.getInstance().addUser(user);
 return mapping.findForward("add_success"); //这里改变返回字符串
 }
·在struts-config.xml中
<action path="/user/usermaint"
 type="com.bjsxt.drp.web.usermgr.actions.UserAction" 这里注意路径问题
 name="userForm"
 scope="request"
 parameter="command"  这句话说明下面URL之后的参数的名字是什么
     >
 <forward name="add_success" path="/user/usermaint.do?command=list"  redirect="true"/>  这里同样注意url的action名字以及参数问题 成功后跳转到展示页面

</action>
·前台调用
  uri为 user/usermiant.do?command=add
这里command为上面parameter的值,action中的add为方法名。

●路径与模式匹配
·在struts-config.xml中
<action path="/user/*"  注意这里没有.do
 type="com.bjsxt.struts.UserAction"
 name="userForm"
 scope="request"
 parameter="command"  这句话说明下面URL之后的参数的名字是什么
     >
 <forward name="success" path="/user/{1}_success.jsp" />  这里同样注意url的action名字以及参数问题 成功后跳转到展示页面

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值