新手学习Struts2的简单总结

//Struts2的核心控制器(web.xml):对框架进行初始化;以及处理所有的请求


<filter>
<filter-name>struts2</filter-name>
<filter-class>

org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter

</filter-class></filter>


<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>
</filter-mapping>




//核心配置文件(struts.xml)负责管理Action,通常放在src或者WEB-INF/classes
<----------------------------//struts.xml配置 //头部------------------------------------------>
<?xml version="1.0" encoding="UTF-8" ?> 


<!DOCTYPE struts PUBLIC  
   
 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
     
"http://struts.apache.org/dtds/struts-2.3.dtd">  
<----------------------------//struts.xml配置------------------------------------------------>
<struts>
<package="包名" namespace="/" extends="struts-default">//包名类似与Java的分包作用,namespace可不写(默认就是这样)extends,一定要写,且不要轻易修改
<action name="虚拟路径" class="全类名(包名+类名)" method="方法名">//访问路劲是namespace+name;method默认不写是execute方法
<result name="success">/welcome.jsp</result>//成功跳转的页面(默认以转发形式跳转),可进行设置为重定向
<result name="input">/errop.jsp</result>//失败或者错误是的跳转页面
</action>
</package>
<!-- 设置所有请求中的中文乱码,相当于request.setCharsetEncoding -->
<constant name="struts.i18n.encoding" value="utf-8" />
</struts>


<----------------------------//详解package属性---------------------------------------------->
name属性必需的且唯一;用于指定包的名称,extends属性指的是要扩展的包,一般不要改,对应的值是:struts-default;namespace属性定义该包中的action的命名空间,(可选属性)
<package name="" namespace="" extends="struts-default"></package>
<----------------------------//详解action属性----------------------------------------------->
//表示的是一个struts请求,每一个action都必须有一个name属性表示虚拟路径;class虚拟属性访问的XxxAction(全类名);method属性配置该类的一个动作方法,默认是execute方法
<action name="login" class="com.zdl.XxxAction" method=""></action>
可通过修改action中的method属性,来实现Action中不同的方法;
<action name="register" class="com.zdl.XxxAction" method="register"></action>
<----------------------------//详解action属性-------------------------------->
result:实现对结果的调用,result元素的值对应的实际资源位置,name属性表示result逻辑名
<result name="success">/success.jsp</result>
<result name="input">/login.jsp</result>
页面跳转,默认的是转发。也可用转发type="dispatcher"
<result name="success" type="redirectAction">虚拟路线</result>//多用于虚拟路径的跳转
<--------------------Action接收参数的三种方式------------------------------------->
【1】.form中元素name取值属性名;Action中私有化表单中的属性,并生成getter/setter方法
<form action="login" method="post">
用户名:<input type="text" name="username" /><br/>
用户密码:<input type="password" name="password"/><br>
    
<input type="submit" value="登录">
</form>
public class UserAction extends ActionSupport{
private String username;
private String password;
public void setUsername(String username){
this.username=username;
}
public void set Passeord(String password){
this.password=password;
}
public String getUsername(){
return username;
}
public String getPassword(){
return password;
}
}
【2】.javaBean方式:form中元素name取值对象名.属性名;为Action添加实体属性以及getter/setter方法
<form action="login" method="post">
用户名:<input type="text" name="user.username" /><br/>
用户密码:<input type="password" name="user.password"/><br>
    
<input type="submit" value="登录">
</form>
public class UserAction extends ActionSupport{
private User user;
public void setUser(User user){
this.user=user;
}
public User getUser(){
return user;
}
}
【3】.form中元素:name取值属性名;Action实现ModelDriven接口,重写getModel()。需要在Action中进行实例化,单不需要getter/setter方法
<form action="login" method="post">
用户名:<input type="text" name="username" /><br/>
用户密码:<input type="password" name="password"/><br>
    
<input type="submit" value="登录">
</form>
public class UserAction extends ActionSupport implements ModelDriven{
private User user=new User();
   
@Override
    
public User getModel() {
       
return user;
    
}
}
<------------------Struts2访问ServletAPI对象-------------------------------------->
【1】与ServletAPI解耦的访问方式:提供三个map对象分别访问request、session、application作用域
//解耦:Object get("request");getSession();getApplication()
public class LoginAction implements Action {
//省略了属性个getter、setter方法
@Override
 
public String execute(){
if("admin".equal(username)&& "123".equals(password)){
Map<String,Object>session = ActionContent.getContext().getSession();
session.put(CURRENT_USER, username);
return "success";
}else{
return "error";
}
}
}
//耦合:ServletContext getServletContext()
; HttpServletResponse getResponse();HttpServletRequest  getRequest()
HttpServletRequest request = ServletActionContext. getRequest();
<-------------------------struts2数据校验:两种方式------------------------------------->
【1】.使用ActionSupport编码实现验证:在Action业务方法中直接验证;重新validate方法;使用validateXxx()方法
[1]
public String execute() {

if (name.length() == 0) {

addFieldError("name", "用户名不能为空");


} else {

// 注册成功,返回SUCCESS


return SUCCESS;
}
}
[2]
public class RegisterAction extends ActionSupport{
public void validate() {
if(name.length()==0){

addFieldError("name","用户名不能为空");

}
}
}
[3]
public class RegisterAction extends ActionSupport{
public void validateXxx() {
if(name.length()==0){

addFieldError("name","用户名不能为空");

}
}
public String Xxx(){
return SUCCESS;

}
【2】.使用验证框架实现校验(常用)
校验器类型 校验器名称 说明
必填 required 字段不能为空
必填字符串 requiredstring 字段不能为空长度要大于0
整数 int 字段在整数值范围内
字符串长度 stringlength 字段值的长度的范围
正则表达式 regex 字段是否匹配一个正则表达式
字段表达式 fieldexpression 字段必须满足一个逻辑表达式
日期 date 日期输入是否在指定的范围内
双精度 double 字段值必须是双进度类型


步骤:编写表单;编写Action及其配置文件;在Action类相同目录下创建ActionName-validation.xml,其中ActionName与要验证的Action类名相同;编写校验规则
[1].编写Action(javaBean方式接收的参数)
public class RegisterAction extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String reg() throws Exception{
return SUCCESS;
}
}
[2].struts.xml配置文件
<action name="register" class="" method="reg">
<result name="success">/success.jsp</result>
<result name="input">/register.jsp</result>
</action>
[3].ActionName-validation.xml(与ActionXxx在同一包下)
//头部
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="user.name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空<message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">16</param>
<param name="minLength">6</param>
<!--形似el语句,但不是;作用:动态获取param的值-->
<message>用户名长度必须在${minLength}和${maxLength}之间</message>
</field-validator>
</filed>
</validators>
<!--注册时:验证密码与确认密码一样;-->
<field-validator type="fieldexpression">
<param name="expression">user.password==user.repassword
<message>密码与确认密码不一致
<!--验证整数数字时-->
<field name="user.age">
<field-validator type="int">
<param name="max">100</param>
<param name="min">1</param>
<message>年龄不在${min}和${max}之间</message>
</field-validator>
</field> 
<!-- 校验电话号码格式 -->
<field name="user.tel">
<field-validator type="regex">
<param name="expression">
^(\d{3,4}-){0,1}(\d{7,8})$
</param>
<message>电话号码格式不正确</message>
</field-validator>
</field>
<-------------核心控制器interceptor----------------------------------->
Interceptor是一个拦截器,类似与filter。但是只拦截Action,且执行于Action之前和之后
(了解)struts2自带的拦截器,在struts-defaul.xml中
常用内置拦截器
拦截器 作用
parames 负责将请求参数设置到Action类中的对应的属性中
servletConflg 将源于servletAPI的各种对象注入Action
validation 调用验证框架进行数据校验
exception 进行异常处理,并将异常映射为结果
i18n 设置编码格式
fileUpload 对文件上传提供支持
workflow 调用Action类的validate(),执行数据验证


<--------struts2的文件上传与下载----------------------------------------->
【1】.文件上传
//提交方式为post,enctype告诉以二进制流的方式读取
表单属性:<form action="" method="post" enctype="multipart/form-data">
//文件上传的Action
public class UploadAction{
//与表单的属性对应,upload的属性为表单中type="file" name="upload"
private File upload;
private String uploadContentType;
private String uploadFileName;
private String username;//文件上传者的名字
//对应的getter、setter方法
public String execute()throw Exception{
//获取到要保存的文件夹的路径(一般在webapps下)
String savePath = ServletActionContext.getServletContext.getRealPath("/upload");
/*
*也可以判断文件是否存在,当不存在时需要创建等等。。。
*为了防止名字相同,上传文件覆盖的情况。可使用UUID和时间毫秒值进行组装名字
*/
//获取到真正的文件名字:路径+文件名
String realName = savePath +"\\"+uploadFileName;
//借用IOUtils
IOUtils.copy(new FileInputStream(upload),new FileOutStream(realName));
<----------接下来操作是将上传的文件存数据库-------------->
//调用一个jdbcutils工具类
Query runner = new QueryRunner(JdbcUtils.getDataSource());
try{
//保存的是上传者的名字和文件的名字
String sql ="insert into picture(name,picpath) values(?,?)";
Object[] params ={name,uploadFileName};
runner.update(sql, params);
}catch (Exception e) {
throw new RuntimeException(e);
}
return SUCCESS;
}


}
//文件上传的struts.xml的配置---------------------包含页面展示------------和文件下载的xml配置
//设置文件上传的大小的全局配置
<constant name="struts.multipart.maxSize" value="20*1024"/>
<package name="包名" namespace="/" extends="struts-default">
<action name="upload" class="com.zdl.UploadAction" method="">
//interceptor-ref 是struts2的拦截器,有些是常用的,有些不是常用的,在使用需要申请
<interceptor-ref name="fileUpload">
<param name="maximumSize>2*1024</param>//设置一次上传的文件大小
<param name="allowedExtension">png,img,txt</param>//设置运行上传的文件格式
</interceptor-ref>
<!--当设置不常用的拦截器后,一些常用的默认拦截器将不会在生效,因此也要再此申请下-->
<interceptor-ref name="defaultStack" />
<!-----------------上传部分就完成了----------------------------------------->
<!-------这是上传之后jsp的页面展示------------------------------------------>
<result name="success" type="redirectAction"/>listpic</result>//listpic是一个虚拟路径
<result name="input">/upload.jsp</result>//上传失败后的操作,会到上传页面继续上传
</action>

<action name="listpic" class="com.zdl.ListpicAction">
<result name="success">/listpic.jsp </result>
<result name="input">/404.jsp</result>
</action>

<action name="down" class="com.zdl.DownAction">
<result type="stream">//下载时的类型一定要写上
<param name="contentType">application/octet-stream</param>
<!-- 与action中inputstream流对象属性名字一样 -->
<param name="inpurName" >inputstram</param>
<!-- ${}中的字符串要与action中表示文件名字的属性名一样 -->
<param name="contentDisposition">
attachment;filename="${filename}"
</param>
<param name="bufferSize">2*1024</param>//设置缓存区大小
</result>
</action>
</package>
【2】.文件下载的Action
public class DownAction extends ActionSupport{
private InputStream inputstream;//提供给客户端进行下载的文件转成的流
private String filename;//提供 给客户端进行下载的文件的名字
//getter、setter方法
@Override
public String execute() throws Exception {
String savePath = ServletActionContext.getServletContext.getRealPath("/upload");
String realName=savePath+"\\"+filename;
File file = new File(realName);
inputstream =new FileInputStream(file);
filename =file.getName();
return SUCCESS;
}
}
【3】展示页面的Action
public class ListPicAction extends ActionSupport {
private List<User> list;
//getter、sett方法
@Override
public String execute() throws Exception {
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
try {
String sql = "select * from picture";
list =  (List<User>) runner.query(sql, new BeanListHandler(User.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
return SUCCESS;
}
}































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值