下载链接:https://download.csdn.net/download/mmzian/12058806
项目涵盖知识点
- Struts2框架运行原理
首先,判断请求是否需要Struts2管理,然后获得核心配置文件信息,请求相关的action信息交给拦截器组,之后经过拦截器过滤获得string类型的结果,根据string类型的返回结果与核心配置文件中的相匹配,最后,经过拦截器将最终结果返回给客户。
2. Action访问Servlet API
在struts2中,虽然 Action 已经与Servlet API完全分离,但在实现业务逻辑时,还是经常要访问servlet API 中的对象。通常开发时需要访问Servlet API中的 HttpServletRequest、HttpSession 和 ServletContext 三个接口,它们分别对应JSP内置对象 request、session 和 application。在 Struts2 中,访问 Servlet API 通常采用两种方式,分别是通过 ActionContext 访问和通过 ServletActionContext 访问,本节将针对这两种访问方式进行讲解。一种是通过actioncontext访问:ActionContext 是 Action 执行的上下文对象,在 ActionContext 中保存了 Action 执行所需要的所有对象,包括 request、session 和 application 等。另一种是通过servletactioncontext访问,该类中的方法都是静态方法。
3.时间戳:获取系统当前时间
我们在jsp页面获取当前时间的函数,用的是.date函数(并将服务器的时间格式化)。代码 :
function disptime()
{
var today=new Date();
var year = today.getFullYear();
var month=today.getMonth()+1;
var day=today.getDate();
var hh=today.getHours();
var mm=today.getMinutes();
var ss=today.getSeconds();
if(month<10)
{
month="0"+month;
}
if(day<10)
{
day="0"+day;
}
if(mm<10)
{
mm="0"+mm;
}
if(ss<10)
{
ss="0"+ss;
}
if(ss%2==0){
document.getElementById("myclock").innerHTML="<font color='green'>"+year+"-"+month+"-"+day+
" "+hh+":"+mm+":"+ss+"</font>";
}else
{
document.getElementById("myclock").innerHTML="<font color='red'>"+year+"-"+month+"-"+day+
" "+hh+":"+mm+":"+ss+"</font>";
}
}
var mytime=setInterval("disptime()",1000);
4.批量删除:全选和反选
通过JS技术的selectall()和selectother()来实现全选和反选,代码如图2-2:
<!--全选或全不选-->
function selectAll(){
var items = document.getElementsByName("checkItem");
var checkAll = document.getElementById("checkAll");
var checkOther = document.getElementById("checkOther");
checkOther.checked = false;
for(var i=0;i<items.length;i++){
items[i].checked = checkAll.checked;
}
}
<!--反选-->
function selectOther(){
var items = document.getElementsByName("checkItem");
var checkAll = document.getElementById("checkAll");
var checkOther = document.getElementById("checkOther");
checkAll.checked = false;
for(var i=0;i<items.length;i++){
items[i].checked = !items[i].checked;
}
}
5.不同用户登录进行判断
public boolean login(User user) {
// TODO Auto-generated method stub
boolean flag=false;
con=BaseDao.getConnection();
try {
ps=con.prepareStatement("select * from t_users where username=? and password=?");
ps.setString(1, user.getUsername());//设置第一个变量
ps.setString(2,user.getPassword());//设置第二个变量
rs=ps.executeQuery();
if(rs.next())
{
user.setId(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
user.setName(rs.getString(4));
user.setNic(rs.getString(5));
user.setSex(rs.getString(6));
user.setAge(rs.getInt(7));
user.setEmail(rs.getString(8));
user.setPhone(rs.getString(9));
user.setSelfshow(rs.getString(10));
user.setRoleId(rs.getInt(11));//给user对象赋值
flag=true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
BaseDao.cloasAll(rs, ps, con);//关闭数据库的连接
}
return flag;
}
6.文件上传
上传界面
<s:form action="upload"
enctype="multipart/form-data">
<s:textfield name="title" label="身份证正面证件号"/>
<s:file name="upload" label="选 择 正 面 文 件"/><br/><br>
<s:textfield name="title1" label="身份证反面有效期"/>
<s:file name="upload" label="选 择 反 面 文 件"/>
<s:submit value="上传"/>
</s:form>
上传成功界面
添加成功!<br/>
证件号码:<s:property value=" + title"/><br/>
正面为:<img src="<s:property value="'uploadFiles/'
+ uploadFileName"/>"/><br/>
有效日期:<s:property value=" + title1"/><br/>
正面为:<img src="<s:property value="'uploadFiles/'
+ uploadFileName"/>"/><br/>
上传文件执行的后台bean
public class UploadAction extends ActionSupport
{
// 封装文件标题请求参数的属性
private String title;
// 封装文件标题请求参数的属性
private Date date;
// 封装上传文件域的属性
private File upload;
// 封装上传文件类型的属性
private String uploadContentType;
// 封装上传文件名的属性
private String uploadFileName;
// 直接在struts.xml文件中配置的属性
private String savePath;
// 接受struts.xml文件配置值的方法
public void setSavePath(String value)
{
this.savePath = value;
}
// 获取上传文件的保存位置
private String getSavePath() throws Exception
{
return ServletActionContext.getServletContext()
.getRealPath(savePath);
}
// title的setter和getter方法
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return (this.title);
}
// title1的setter和getter方法
public void setDate(Date date)
{
this.date = date;
}
public Date getDate()
{
return (this.date);
}
// upload的setter和getter方法
public void setUpload(File upload)
{
this.upload = upload;
}
public File getUpload()
{
return (this.upload);
}
// uploadContentType的setter和getter方法
public void setUploadContentType(String uploadContentType)
{
this.uploadContentType = uploadContentType;
}
public String getUploadContentType()
{
return (this.uploadContentType);
}
// uploadFileName的setter和getter方法
public void setUploadFileName(String uploadFileName)
{
this.uploadFileName = uploadFileName;
}
public String getUploadFileName()
{
return (this.uploadFileName);
}
@Override
public String execute() throws Exception
{
// 以服务器的文件保存地址和原文件名建立上传文件输出流
FileOutputStream fos = new FileOutputStream(getSavePath()
+ "\\" + getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0)
{
fos.write(buffer , 0 , len);
}
fos.close();
return SUCCESS;
}
}
7.添加用户验证
<!-- 校验用户名 -->
<field name="admin.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{6,25})]]></param>
<message>用户名长度必须在6到25之间,且必须是字母和数字</message>
</field-validator>
</field>
<!-- 校验用户密码 -->
<field name="admin.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{6,25})]]></param>
<message>用户密码长度必须在6到25之间,且必须是字母和数字</message>
</field-validator>
</field>
<!-- 校验用户昵称 -->
<field name="admin.nic">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户昵称不能为空</message>
</field-validator>
</field>
<!-- 校验用户真实姓名 -->
<field name="admin.name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>真实姓名不能为空</message>
</field-validator>
</field>
<!-- 校验年龄 -->
<field name="admin.age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">100</param>
<message>请输入合法的年龄 范围:1-100</message>
</field-validator>
</field>
<!-- 校验email -->
<field name="admin.email">
<field-validator type="email">
<message>请填写正确的email格式</message>
</field-validator>
</field>
整体页面展示
- 运用标签列表
1、控制标签
1.1 If/elseif/else标签
If/elseif/else标签用来控制选择输出。必须指定test属性,是一个Boolean类型值,决定是否显示if标签内容。
1.2 iterator标签
iterator标签 (迭代)用于遍历集合(java.util.collection)List,Map,数组或枚举值(java.util.iterator)。
1.3 generator标签
generator标签用来将指定的字符串按规定的分隔符分解为多个字符串,生成的多个字符串可以使用iterator标签输出。separator和val为必填值,都为string类型值。Separator用来指定分解字符串的分隔符,val用来指定被分解的字符串。
2、数据标签
2.1 property标签
property标签可以与<s:bean>标签结合使用,一个是给bean赋值,一个是从bean中读取值。
2.2 URL标签
URL标签用于生成一个URL地址,可以通过param向url标签指定参数,从而指定URL发送请求参数。
2.3 param标签
param标签用于传递参数,比如给<s:bean>标签传递参数。它有两个属性:Name和value。
2.4 debug标签
debug标签主要用于辅助测试,它在页面上生成一个超链接,通过该链接可以查看Value Stack和Stack Context 中的所有值信息。使用debug标签只有一个id属性,这个属性仅仅是该元素一个引用id。在页面上增加<s:debug/>标签,通过debug标签,可以看的系统中Value Stack离得全部信息,并可以看到Stack Context中的属性。
3、表单标签
3.1 Textfield标签
Textfield标签输出一个HTML单行文本输入控件。
3.2 Radio标签
radio标签输出一个HTML单选按钮。
3.3 checkboxlist标签
checkboxlist标签使用一个列表创建一系列复选框,属性设置与<s:select/>和<s:radio/>类相似,只是创建的是HTML复选框。不同的是,checkboxlist标签多选标签。
3.4 Select标签
select标签输出一个HTML列表框。
3.5 Optiontransferselect标签
Optiontransferselect标签会生成连个列表选择框,并生成系列的按钮用于控制各选项在两个列表框之间的移动升级。
3.6 textarea标签
textarea标签输出一个HTML多行文本输入控件。
3.7 其他表单标签
(1)、form标签
(2)、fielderror标签
(3)、submit标签:submit标签输出一个提交按钮,submit标签和form标签一起使用可以提供异步表单提交功能。
(4)、file标签:file标签输出一个HTML文件选择框。
(5)、password标签:password标签输出一个HTML口令输入控件。