◆★◎☆
◆Struts就是apache提供好的免费MVC实现框架,是用来替代Servlet的。
☆注意在LoginForm.java和LoginAction.java中设置错误信息的不同之处:
前者:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();}
errors.add("errname",new ActionMessage("property_name"));
return errors;
后者:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
ActionMessages errors = new ActionMessages();
errors.add("error", new ActionMessage("errlogin"));
super.saveErrors(request, errors);
return mapping.getInputForward(); //跳转到错误页
//如何跳转到自己在struts-config.xml中设置的路径呢:
//<forward name="succ" path="/login_success.jsp"></forward>
return mapping.findForward("succ");
}
☆并同时注意两种跳转区别:
return mapping.getInputForward(); //跳转到错误页
//如何跳转到自己在struts-config.xml中设置的路径呢:
//特别是当文件不在根目录下时,好像就不能正常跳转哦?这种情况使用../或者../../XX.do后退即可
//当所有文件位于根目录下的同一个文件夹下时,从一个页面超链接到另一
个页面超链接这样写,注意没有/符号哦:<a href="login_struts/note.jsp">点击这里进入留言管理页面</a>
也就是说当需要连接action时就需要使用../或者../../XX.do后退,其他写全路径。
//<forward name="succ" path="/login_success.jsp"></forward>
return mapping.findForward("succ");
◆struts中有很多标签库,目的就是减少页面中代码段,开发原则就是尽量不出现代码段<% %>,以便维护
<bean/> <logic/> <html/>
<bean>标签:
★<bean:define/>标签:
<bean:define id="str" value="wo si"/> //如何输出定义的这个属性呢?
一是使用EL表达式: <h2>${str}</h2>
二是使用《bean》输出标签:<h2><bean:write name="str"/></h2>
这里强调一下:只要是id就表示是一个存放在4中属性范围之内的名称,只要是name就表示使用存放在四种属性范围之中的一个对象
★<bean:size/>标签:主要是求出长度(数组,Connection,Map)
Map m = new HashMap(); m.put("one",1);m.put("two","2");
//要先将Map对象放在4中属性范围之内
request.setAttribute("myMap",m);
<bean:size id = "myMapLen" name="myMap" scope="request"/>;
<h2>长度为:&{myMaplLen}</h2>
★<bean:write/>标签:打印,也可打印对象中的属性
Person p = new Person();p.setName("wjr"),p.setPassword("530");
//要先将p对象放在4中属性范围之内
request.setAttribute("myPerson",p);
&{p.name} //使用EL输出
<bean:write name="myPerson" property="name" scope="request"/>
在jsp 2.0中可以使用EL代替<bean:write/>标签
而且,只要是标签,在开发中就可以相互调用,即是jsp标签与struts标签可一起使用。因为他们都是对4中属性进行操作
★<bean:message/>标签:
作用:
1.操作struts中的properties资源文件内容:
例如,在properties资源文件中有:Welcome = <h1>jfoiajajgejg,那如何使用该值呢???
<bean:message key= "Welcome" /> //这块值就等于:.jfoiajajgejg
在该标签中,还提供了一个占位功能:Welcome = <h1>jfo{0}iajajgejg,
<bean:message key= "Welcome" arg0="wjr" /> //这块值等于:.jfowjriajajgejg
2.国际化:
即是配置多个properties资源文件,并在该文件名后加上:_语言代码就可以了:例如:
ApplicationResources.properties
ApplicationResources_en_US.properties //表示英语
然后分别在不同properties资源文件中写入相应要显示的不同内容
浏览器会自动根据它当前的语言环境自动匹配相应的properties资源文件。
Logic标签:
★<logic:present/>和<logic:notPresent>:判断某值是否在某个属性范围之内
request.setAttribute("rname","wjr"); session.setAttribute("sname","wjr");
<logic:present name="sname" scope="session">有该属性:&{sname}</logic:present>
<logic:notPresent name="sname" scope="session">没有有该属性:&{sname}</logic:notPresent>
如果你没有指定属性范围,则按照顺序进行判断
★逻辑运算标签:
=:<logic:equal name="rname" scope="request" value="wjr">该属性值等于wjr:${rname}</logic:equal>
!=:<logic:notEqual name="rname" scope="request" value="wjr">该属性值不等于wjr:${rname}</logic:notEqual>
>=:request.setAttribute("ref",new Character('1'));
<logic:greaterEqual name="rname" scope="request" value="wjr">该属性值等于wjr:${rname}</logic:greaterEqual>
<=:<logic:lessEqual name="rname" scope="request" value="wjr">该属性值等于wjr:${rname}</logic:lessEqual>
<:<logic:lessThan name="rname" scope="request" value="wjr">该属性值等于wjr:${rname}</logic:lessThan>
>:<logic:greaterThan name="rname" scope="request" value="wjr">该属性值等于wjr:${rname}</logic:greaterThan>
//注意上面属性对象,可以自动转化为整型类型进行比较
迭代标签:<logic:iterator id="实例化对象" name="属性范围" scope="查找范围"> 是struts比较重要常用的标签。
★List all = new ArrayList(); all.add("wjr"); add("huanhuan");
//先将对象保存到4重属性之中
request.setAttribute("list",all);
<logic:iterator id="str" name="list" scope="request">
<h2>&{str}</h2>
</logic:iterator>
输出Set对象也跟上面一样,但是输出Map对象就不另外了,因为本省Map对象就不支持迭代输出。
但是在struts迭代标签中。输出都一样:
Map m = new Hash Map(); m.put("name","wjr"); m.put("name2","huanhuan");
//先将对象保存到4重属性之中
request.setAttribute("map",m);
<logic:iterator id="ma" name="map" scope="request">
<h2>&{str.name}</h2><h2>&{str.value}</h2>
</logic:iterator>
要是不使用表达式语言输出怎么办呢??
<logic:iterator id="ma" name="map" scope="request" property="value">
<h2>&{str}</h2> //这时就只输出对象的value值。
</logic:iterator>
struts html标签:
★ 对于struts表单乱码设置有两种方法:
一是通过设置过滤器
二是在XXXXForm中的reset()方法中设置:request.setCharacterEncoding("gbk");
★注意:在struts表单中,给单选按钮,复选框,下拉列表框等赋初始值,不能在标签中使用 checked关键字,
要通过在XXXForm.java中设置相应初始值才行。
例如:一个性别单选按钮表单:
<html:radio property="sex" value="男">男</html:radio>
<html:radio property="sex" value="女">女</html:radio>
在XXXForm.java中是这样定义sex变量的:private String sex;
你要这样改成:private String sex = "男";
这时你再打开表单页面,男选项就自动默认选中了。
下拉列表框:
选择所喜欢的城市:
<html:select property="city">
<html:option value="BJ">北京</html:option>
<html:option value="TJ">天津</html:option>
<html:option value="NJ">南京</html:option>
<html:option value="GD">广东</html:option>
<html:option value="DB">东北</html:option>
</html:select>
同样,如果你想设置单选或者下拉列表默认选项,就像下面这样在XXXForm.java中修改:
private String sex = "女";
private String city="TJ";
但是复选框就有点不一样了,因为复选框选中之后返回的是一个字符串数组,所以定义的时候就要定义成数组:
private String fruit[];
表单内容为:
选择所爱吃的水果:
<html:checkbox property="fruit" value="orange"/>橘子
<html:checkbox property="fruit" value="banana"/>香蕉
<html:checkbox property="fruit" value="apple"/>苹果
<html:checkbox property="fruit" value="watermelon"/>西瓜
<html:checkbox property="fruit" value="cherry"/>樱桃
因为输出的结果是一个数组,所以这样输出:
for(int i=0;i<tag_htmlForm.getFruit().length;i++)
{
System.out.println("你爱吃的水果是:"+tag_htmlForm.getFruit()[i]);
}
那如何设置复选框的默认选项呢??是否还是直接设置默认值就可以了呢??答案是不行
在struts中这种情况要使用<html:multibox>标签并配合<logic:iterate>一起使用才行:
表单具体内容现在变为:
选择所爱吃的水果:
<logic:iterate id="fru" name="tag_htmlForm" property="fruit">
<html:multibox property="select">${fru}</html:multibox>${fru}
</logic:iterate>
那么上面的<html:multibox>又该如何设置呢?变量定义直接变为如下了:
private String sex ;
private String city ;
private String fruit[] = {"橘子","苹果","cherry","香蕉","watermelon"} ;
private String select[] = {"橘子","苹果","cherry"} ;
当然这时输出就得从tag_htmlForm.getSelect()中输出了:
for(int i=0;i<tag_htmlForm.getSelect().length;i++)
{
System.out.println("你爱吃的水果是:"+tag_htmlForm.getSelect()[i]);
}
★
★