strus2应用
?
?
Struts2大致原理:
页面---动作---struts.xml---动作处理类---跳转页面;
表单,Action,配置文件;
实体类传递页面数据;(ognl)
Validate()简单验证;
动作处理类,结果,跳转页面;
?
Struts2的其它配置文件中:
<package?name="loginOpra"?namespace="/WebsiteBackstage"?extends="struts-default">
Namespace?struts2命名空间,默认为当前空间
最好用模块命名,
http://localhost:8080/sshWeb/WebsiteBackstage/login.jsp?
命名为/WebsiteBackstage;
?
Action实现类:
使用继承ActionSupport的写法;
?
Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法:
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
<action?name="userAdd"?class="com.bjsxt.struts2.user.action.UserAction"?method="add">
????????????<result>/user_add_success.jsp</result>
</action>
????这样,只要在action的对象中有一个add的方法,并且返回类型为String就可以了。如果没有method属性,则默认执行execute()方法。
import?com.opensymphony.xwork2.ActionSupport;
public?class?UserAction?extends?ActionSupport?{
????public?String?add()?{
???????return?SUCCESS;
????}??
}
?
登录验证提示:
动作实现类方法中:
this.addFieldError("userError",?"用户名或密码错误,请检查!");
?
<s:fielderror?fieldName="userError"?theme="simple"/>?
<s:fielderror>标签:获取使用addFieldError()方法添加的信息。
???????????????????FiledName:指定信息的名称。
???????????????????Theme:?指定显示的主题。
?注:使用此标签获取的错误信息,Struts强制添加了css的修饰。生成的HTML代码如下(不长用):
<ul?style="text-indent: 18pt; margin-bottom: 0pt; margin-top: 0pt; line-height: 19.5pt; padding: 0pt;">???????????????<li><span>name?is?error</span></li>
???????????????<li><span>name?is?too?long</span></li>
?????</ul>
Class=”errorMessage”是Struts2已经设置好的一个css了。这个方式不方便我们自定义样式。
另,非空的验证:
两种方式,上面的一种,validate的一种,
非空,错误验证,都要搭配action配置文件中的
<result?name="input">/WebsiteBackstage/login.jsp</result>;
?
列表页面数据绑定;
类:
List<Admin>?list?=??adminDao.getAll();
ActionContext.getContext().put("admins",?list);
页面:
<s:iterator?value="admins"?status="itStatus">
??<li>
??<s:property?value="#itStatus.count"?/>
??<s:property?value="name"/>
??<s:property?value="pwd"/>
??</li>
</s:iterator>
?
重定向错误:---1个action有重定向错误,分成两个就好了。
<action?name="admin_*"?class="service.AdminService"??method="{1}">
???<result?name="success"?type="redirect">admin_list2.action</result>
???<result?name="update"?>/WebsiteBackstage/sysMana/admin_update.jsp</result>
???<result?name="input">/WebsiteBackstage/sysMana/admin_add.jsp</result>
??</action>
??<action?name="admin_list2"?class="service.AdminService"?method="list">
<result?name="success">/WebsiteBackstage/sysMana/admin_list.jsp</result>
</action>
?
动作带id的简单写法:
<a?href="admin_delete?id=<s:property?value='id'/>">删除</a>?
复杂的:
?<s:url?action="admin_delete"?id="myUrl">
???????<s:param?name="id"?value="id"/>
????</s:url>
????????<a?href='<s:property?value="#myUrl"?/>'>删除</a>
?
页面路径:
使用绝对路径;
<%
String?path?=?request.getContextPath();??//项目文件名;
String?basePath?=?request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";???//http路径;
%>
---获取到http://localhost:8080/sshWeb/到这里的路径;?
页面使用方式两种:
1),<a?href="<%=basePath%>WebsiteBackstage/sysMana/admin_add.jsp">添加管理员</a>---单个超链中补全使用。
2),在head中加<base?href="<%=basePath%>">?,所有超链默认加载前缀;
?
<s:date?format="yyyy-MM-dd"????name="date"?/>
?
全选删除:
页面checkbox:
<s:form?id="adminForm"?action="admin_deleteMore"??method="post"?enctype="multipart/form-data">??
????????全选:<input?type="checkbox"?name="allselect"?id="allselect"?onclick="check()"/>
????????<input?type="submit"?name="submit"?value="批量删除"?onclick="return?confirm('确定删除该?')?true:false;"?/>
???<s:iterator?value="admins"?status="itStatus">
??<li>
??<s:property?value="#itStatus.count"?/>
??<s:property?value="name"/>
??<s:property?value="pwd"/>
??<s:url?action="admin_goUpdate"?id="myUrl">
???????<s:param?name="id"?value="id"/>
????</s:url>
????????<a?href='<s:property?value="#myUrl"?/>'>修改?</a>
???????????
????????<a?href="admin_delete?id=<s:property?value='id'/>"???onclick="return?confirm('确定删除?');">删除</a>
????????<input?type="checkbox"?name="chkbox"?id="chkbox"?value='<s:property?value="id"/>'?/>??
??</li>
</s:iterator>
</s:form>?
Js全选:
<script?type="text/javascript">??
????function?check()?{??
????????var?confirmBox?=?document.getElementById("allselect");//??
????????if?(confirmBox.checked)?{??
????????????var?arryObj?=?document.getElementsByName("chkbox");??
????????????for?(?var?i?=?0;?i?<?arryObj.length;?i++)?{??
????????????????if?(typeof?arryObj[i].type?!=?"undefined"??
????????????????????????&&?arryObj[i].type?==?'checkbox')??
????????????????arryObj[i].checked?=?true;?
????????????}??
????????}?else?{??
????????????var?arryObj?=?document.getElementsByName("chkbox")??
????????????for?(?var?i?=?0;?i?<?arryObj.length;?i++)?{??
??
????????????????if?(typeof?arryObj[i].type?!=?"undefined"??
????????????????????????&&?arryObj[i].type?==?'checkbox')??
????????????????????arryObj[i].checked?=?false;??
????????????}??
????????}??
????}
</script>?
实现类:
//多选删除|?数组获取;循环删除;
?public?String?deleteMore()?throws?Exception{??
?DaoDemoUtils.buildJndi();
?ApplicationContext?ac?=?new?ClassPathXmlApplicationContext("/dao/datasource-context-dao.xml");
?AdminDAO?adminDao?=?(AdminDAO)?ac.getBean("AdminDao");
?HttpServletRequest?request=ServletActionContext.getRequest();??
?String[]?ids?=?request.getParameterValues("chkbox");
?
?for(int?i?=?0;?i?<?ids.length;?i++)
?{
?Long?id?=?Long.parseLong(ids[i].toString());
?adminDao.delete(id);
?}
?return?"success";??
?}??
?
编辑器:
见编辑器的实现文档;
?
修改页面编辑器不现实;
---路径不对,使用绝对路径。
?
jquery输入验证:
见jquery输入验证的文档。
?
?
添加:
private?DownloadFile?downloadFile;
public?DownloadFile?getDownloadFile()?{
return?downloadFile;
}
public?void?setDownloadFile(DownloadFile?downloadFile)?{
this.downloadFile?=?downloadFile;
}
---其中,downloadFile必须是DownloadFile这个的首字母小写,否则出错。
?
?
上传下载:
文件路径;
文件大小;
下载次数;
添加时间;
软件性质;状态;---单选按钮组;
?
?
集合组件:---给定集合选项。
1),最简单的静态写法:
添加页面,
<s:radio?list="#{'0':'正常','1':'结束'}"?name="downfile.state"?value="0"?label="状态"/>
修改页面,
<s:radio?list="#{'0':'正常','1':'结束'}"?name="downloadFile.state"??label="状态"/>????//struts2会自动绑定value对应的值;
2),简单动态的写法:
实体类;无数据表;
?
?
列表页面,显示值对应的汉字;
?
?
///////////////////////////////////////////////////////////////////////////////////////////////////
?
页面数据操作:
1,表单页面数据获取;---登录页面,已解决。
添加;---管理员添加;
列表页面数据绑定;---管理员列表页面;
删除;---管理员删除;
修改;---管理员修改;
全选删除;---管理员批量删除;
添加内容的编辑器;---关于我们添加、修改页面;