为了学习struts2框架,这次练习完成了一个简单的功能,希望能够在struts表单标签的使用以及传值方面能够对大家的学习起到参考作用。
- 项目功能
项目的功能是在提交页面输入个人信息之后点击提交跳转到一个新的页面,新的页面会显示之前所填写的个人信息。
- 开发环境和工具
已配置最新版Java开发环境的Windows系统、MyEclipse 2014/2016、Tomcat服务器7.0/8.0/9.0。
- 内容介绍
本次练习中出现的struts2表单标签:
<s:textfield/>文本输入框<s:select/>选择输入框
<s:radio/>选择按钮
<sx:datetimepicker/>时间输入
<s:checkboxlist/>选择按钮(复选)
<s:combobox/>选择输入+直接输入
本次项目中所出现的其他struts2标签:
<s:include/> 可以导入页面<s:property/>显示对应数据栈栈顶值(也就是输出值)
<s:if>、<s:elseif>、<s:else>控制标签
<s:date>格式化输出日期标签
- 实现代码:
首先需要配置strut2的环境,预先在WebRoot/WEB-INF/lib里面导入struts常用的几个包。此处需要留意的是,我们项目中所用到的<sx:datetimepicker/>在包 struts2-dojo-plugin-2.3.24.1.jar 里面,记得导入。
然后是web.xml的配置。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <filter> <filter-name>struts 2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts 2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>还有struts.xml的配置。
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default" > <action name="save" class="org.action.StrutsAction" > <result name="error">/error.jsp</result> <result name="input">/index.jsp</result> <result name="success">/success.jsp</result> </action> </package> </struts>这些配置都是常用的也是必须的就不用说了。
struts.xml里面result的意思是如果验证成功了那么跳转到success.jsp,如果验证失败了跳转到error.jsp(实际上这个项目不会失败),如果输入校验失败了那么会回到index.jsp并且输出提示信息。
下面是重点内容了:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <%@taglib prefix="sx" uri="/struts-dojo-tags"%> <html> <head> <title>struts2标签学习</title> <sx:head/> <s:head/> </head> <body> <div style="margin-top:140px;margin-left:38%;font-family:Microsoft YaHei;text-align:center"> <s:form action="save.action" method="post" > <table> <s:param name="id" value="学生"/> <tr> <s:textfield label="学号 " name="number"></s:textfield> </tr> <tr> <s:textfield label="姓名 " name="name"></s:textfield> </tr> <tr> <s:select list="#{0:'计算机专业',1:'通信专业',2:'机械工程及自动化',3:'文学院'}" label="专业" name="profe" ></s:select> </tr> <tr> <s:radio list="#{1:'男',0:'女'}" name="sex" label="性别 " > </s:radio> </tr> <tr> <sx:datetimepicker name="birthday" label="出生日期 "></sx:datetimepicker> </tr> <tr> <s:set name="list" value="{'数据结构','离散数学','计算机组成原理'}"></s:set> <s:checkboxlist list="#list" name="course" label="选择课程" ></s:checkboxlist> </tr> <tr> <s:combobox list="{'上海市','北京市','重庆市','天津市','河南省','河北省','广东省'}" name="addr" label="籍贯"></s:combobox> </tr> <tr> <s:textfield label="总分 " name="grade"></s:textfield> </tr> <tr> <td><s:submit value="提交"></s:submit> <s:reset value="重置"></s:reset></td> </tr> </table> </s:form> </div> </body> </html>标签的具体介绍就不多说了,大家可以自行修改尝试一下。
然后是
StrutsAction.java
package org.action; import java.util.*; import java.util.Map; import java.util.Date; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class StrutsAction extends ActionSupport{ private String number; //每一个在index.jsp填写的数据都需要有get和set方法,名字与value相对应。 private String name; private String profe; private String sex; private Date birthday; private String grade; private String course; private String addr; public String getNumber() { return number; } public void setNumber(String number) { this.number=number; } public String getName() { return name; } public void setName(String name) { this.name=name; } public String getProfe() { return profe; } public void setProfe(String profe) { this.profe=profe; } public String getSex() { return sex; } public void setSex(String sex) { this.sex=sex; } public Date getBirthday(){ return birthday; } public void setBirthday(Date birthday){ this.birthday = birthday; } public String getCourse() { return course; } public void setCourse(String course) { this.course=course; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr=addr; } public String getGrade(){ return grade; } public void setGrade(String grade){ this.grade=grade; } public String execute() throws Exception { String[] courseValues = this.getCourse().split(", "); //这句代码的意思是把复选的不同选项 String[] profeValues = this.getProfe().split(", "); //拼接成为一个字符串,且以","分隔 return SUCCESS; //直接返回成功 } public void validate() { //输入校验,如果任何一项输入值为空那么返回并重新输入 if(this.getNumber()==null||this.getNumber().trim().equals("")) addFieldError("number","学号不能为空"); else if(this.getName()==null||this.getName().trim().equals("")) addFieldError("name","姓名不能为空"); else if(this.getProfe()==null||this.getProfe().trim().equals("")) addFieldError("profe","专业不能为空"); else if(this.getSex()==null||this.getSex().trim().equals("")) addFieldError("sex","性别不能为空"); else if(this.getBirthday()==null) addFieldError("birthday","生日不能为空"); else if(this.getCourse()==null||this.getCourse().trim().equals("")) addFieldError("course","课程不能为空"); else if(this.getAddr()==null||this.getAddr().trim().equals("")) addFieldError("addr","籍贯不能为空"); else if(this.getGrade()==null||this.getGrade().trim().equals("")) addFieldError("grade","成绩不能为空"); } }接下来是输出信息的代码:
success.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@page import="java.util.Date"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>信息显示</title> </head> <body> <div style="margin-left:37%;margin-top:100px;font-family:Microsoft YaHei"> <!-- 这是一个测试。<br/> <s:property value="id"/> <s:property value="name"/> <s:property value="number"/> <br/> 这是另一个测试:<br/> <s:property value="#request.id"/><br/> <s:property value="#request.name"/><br/> <s:property value="#request.number"/><br/> <s:property value="#request.zhuanye"/><br/> <s:property value="#request.sex"/><br/> <s:property value="#request.birthday"/><br/> <s:property value="#request.course"/><br/> <s:property value="#request.addr"/><br/> <s:property value="#request.grade"/><br/> <br/> --> 带参数的导入:<br/> <s:include value="includer.jsp"> <s:param name="java" value="'终于成功了哈哈哈哈'"/> </s:include> <br> <table border="1"> <caption>提交的信息</caption> <tr> <td>学号:</td> <td><s:property value="number"/></td> </tr> <tr> <td>姓名:</td> <td><s:property value="name"/></td> </tr> <tr> <td>所在专业:</td> <td><s:if test='profe == "0" '> 计算机专业 </s:if> <s:elseif test='profe == "1" '> 通信专业 </s:elseif> <s:elseif test='profe == "2" '> 机械工程及自动化 </s:elseif> <s:elseif test='profe == "3" '> 文学院 </s:elseif> </tr> <tr> <td>性别:</td> <td> <s:if test='sex == "1" '> 男 </s:if> <s:else> 女 </s:else> </td> </tr> <tr> <td>出生日期:</td> <td><s:date name="birthday" format="yyyy-MM-dd" nice="false"/></td> </tr> <tr> <td>进修课程:</td> <td><s:property value="course"/></td> </tr> <tr> <td>籍贯:</td> <td><s:property value="addr"/></td> </tr> <tr> <td>总分:</td> <td><s:property value="grade"/></td> </tr> </table> </div> </body> </html>另外值得一提的是,<s:include/>标签因为导入了另外一个界面的信息,所以还有一个文件:
includer.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>被导入的页面</title> </head> <body> 该页面已被导入,携带的参数值为: ${param.java} </body> </html>代码到这里就差不多了,看看效果吧。
- 效果图
OK~大功告成~
代码在稍后会上传的。