Struts2入门学习(二)
来源:互联网 发布:移动网络机顶盒遥控器 编辑:程序博客网 时间:2024/06/07 13:44
1、Struts2配置:
1.1:Struts2的Action开发方式
方式一:继承ActionSupport (如果需要数据校验,则必须此类)
public class UserAction2 extends ActionSupport { // Action中业务处理方法 public String login() { System.out.println("UserAction.login()"); return SUCCESS; }}
方式二:实现Action接口 (5个常量)
public static final String SUCCESS = “success”
pubic static final String NONE = “none”
public static final String ERROR = “error”
public static final String INPUT = “input”
public static final String LOGIN = “login”
public String execute() throws Exception;
public class UserAction3 implements Action { // Action中业务处理方法 public String login() { System.out.println("UserAction.login()"); return "success"; } @Override public String execute() throws Exception { return null; }}
方式三:不继承任何类,不实现任何接口(代码自动封装)
public class UserAction { private String userName; public void setUserName(String userName) { this.userName = userName; } // Action中业务处理方法 public String login() { System.out.println("UserAction.login()" + userName); return "login"; } public String register() { System.out.println("register()" + userName); return "register"; }}
1.2:Struts2的通配符
在struts中可以用通配符的方式来优化配置代码 如 *与{1}
<struts> <package name="config" namespace="/user" extends="struts-default" abstract="false"> <!-- 使用通配符优化上面的步骤 --> <!-- http://localhost:8080/struts02/user_login --> <action name="user_*" class="cn.itcast.a_config.UserAction" method="{1}"> <result name="{1}">/{1}.jsp</result> </action> </package> </struts>
1.3:Struts2路径匹配原则
http://ip:端口/项目名称/namespace/Action配置的name值
如:http://localhost:8080/struts2/user/name
1.4:Struts常量
1.struts1中默认访问后缀.do;
2.struts1中默认访问后缀.action;
1.4.1 如何更改访问后缀?
1.Struts2后缀在哪里定义?
Struts核心包下的default.properties下面的常量 struts.action.extension = action,,
2.在struts.xml中修改常量配置。
Struts2中常用的常量:// 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出<constant name="struts.i18n.encoding" value="UTF-8"/>// 自定义后缀修改常量<constant name="struts.action.extension" value="do"/>// 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 <constant name="struts.serve.static.browserCache" value="false"/>// 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 <constant name="struts.configuration.xml.reload" value="true"/>// 开发模式下使用,这样可以打印出更详细的错误信息 <constant name="struts.devMode" value="true" />// 默认的视图主题 <constant name="struts.ui.theme" value="simple" />// 与spring集成时,指定由spring负责action对象的创建 <constant name="struts.objectFactory" value="spring" />// 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为 false<constant name="struts.enable.DynamicMethodInvocation" value="false"/>// 上传文件的大小限制<constant name="struts.multipart.maxSize" value=“10701096"/>
1.4.2 如何配置全局跳转视图,配置各项默认值?
<!-- 配置全局跳转视图 --> <global-results> <result name="success">/index.jsp</result> </global-results> <!-- 配置各项默认值 --> <!-- 什么情况不配置class? 即处理的aciton --> <!-- 答案: 当只是需要跳转到WEB-INF下资源的时候。 --> <action name="test2"> <result name="success">/WEB-INF/index.jsp</result> <!--重定向(type="redirect")无法访问WEB—INFO下的资源文件,必须是转发跳转 --> </action>
2 、Struts2数据处理:
- 数据保存在作用域中
/** *1. 请求数据封装; 2. 调用Service处理业务逻辑,拿到结果数据 *3. 数据保存到域中 */public class DataAction_bak extends ActionSupport{ @Override public String execute() throws Exception { /* Struts中对数据操作, 方式1: 直接拿到ServletApi, 执行操作 HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); ServletContext application = ServletActionContext.getServletContext(); // 操作 request.setAttribute("request_data", "request_data1"); session.setAttribute("session_data", "session_data1"); application.setAttribute("application_data", "application_data1"); */ // 【推荐:解耦的方式实现对数据的操作】 // Struts中对数据操作,方式2: 通过ActionContext类 ActionContext ac = ActionContext.getContext(); // 得到Struts对HttpServletRequest对象进行了封装,封装为一个map // 拿到表示request对象的map Map<String,Object> request = ac.getContextMap(); // 拿到表示session对象的map Map<String, Object> session = ac.getSession(); // 拿到表示servletContext对象的map Map<String, Object> application = ac.getApplication(); // 数据 request.put("request_data", "request_data1_actionContext"); session.put("session_data", "session_data1_actionContext"); application.put("application_data", "application_data1_actionContext"); return SUCCESS; }}
/** * 数据处理, 方式3: 实现接口的方法 * @author Jie.Yuan * */public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{ private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; // struts运行时候,会把代表request的map对象注入 @Override public void setRequest(Map<String, Object> request) { this.request = request; } // 注入session @Override public void setSession(Map<String, Object> session) { this.session = session; } // 注入application @Override public void setApplication(Map<String, Object> application) { this.application = application; } @Override public String execute() throws Exception { // 数据 request.put("request_data", "request_data1_actionAware"); session.put("session_data", "session_data1_actionAware"); application.put("application_data", "application_data1_actionAware");// return SUCCESS; }}
- 请求数据自动封装
实现原理:执行了参数拦截器
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
- 方式一:JSP表单数据填充到action中的 属性
<body> <form action="${pageContext.request.contextPath }/user_register.action" method="post"> 用户名:<input type="text" name="name"><br/> 密码:<input type="text" name="pwd"><br/> 年龄:<input type="text" name="age"><br/> 生日:<input type="text" name="birth"><br/> <input type="submit" value="注册"> </form> </body>
public class UserAction { // 封装请求数据 private String name; // 必须给set / get可以不用给 private String pwd; private int age; private Date birth; public void setName(String name){ this.name = name; } public void setPwd(String pwd){ this.pwd= pwd; } public void setAge(String age){ this.age= age; } public void setBirth(Date birth){ this.birth= birth; } // 处理注册请求 public String register() { System.out.println(name); System.out.println(pwd)); System.out.println(age); System.out.println(birth)); return "success"; }}
- 方式二:JSP表单数据填充到action中的对象中的属性 -
<body> <form action="${pageContext.request.contextPath }/user_register.action" method="post"> 用户名:<input type="text" name="user.name"><br/> 密码:<input type="text" name="user.pwd"><br/> 年龄:<input type="text" name="user.age"><br/> 生日:<input type="text" name="user.birth"><br/> <input type="submit" value="注册"> </form> </body>
public class UserAction { // 对象类型,一定给get方法 private User user; public void setUser(User user) { this.user = user; } public User getUser() { return user; } // 处理注册请求 public String register() { System.out.println(user.getName()); System.out.println(user.getPwd()); System.out.println(user.getAge()); System.out.println(user.getBirth()); return "success"; }}
3、类型转换
- Struts2中为什么要类型转换?
HTML表单采集数据提交表单Action底层依赖HTTP传递数据,而HTTP协议中 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组。因此在服务器端Action中必须把 String 转换为业务需要的特定的数据类型
- Struts2中如何传递请求参数给Action?
Struts2框架会将表单的参数以同名的方式设置给对应Action的属性中。
该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了
String到基本数据类型之间的转换工作。类似于: Beanutils工具。
- Struts2中如何配置自定义转换器?
一:Struts2自定义局部类型转换器1、自定义转换器继承StrutsTypeConverter2、重写convertFromString和convertToString方法3、注册转换器 3.1 在Action所在包中建立 Action名-conversion.properties 3.2 在3.1文件中添加以下数据 需要转换的字段名=自定义转换器类的权限定名 birthday=cn.itcast.convertor.DateTypeConvertor将格式为yyyy/MM/dd的字符串转换为日期:/** * 自定义类型转换器类 * */public class MyConverter extends StrutsTypeConverter { // 新需求: 要求项目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日.. // 先定义项目中支持的转换的格式 DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"), new SimpleDateFormat("yyyyMMdd"), new SimpleDateFormat("yyyy年MM月dd日") }; /** * 把String转换为指定的类型 【String To Date】 * * @param context * 当前上下文环境 * @param values * jsp表单提交的字符串的值 * @param toClass * 要转换为的目标类型 */ @Override public Object convertFromString(Map context, String[] values, Class toClass) { // 判断: 内容不能为空 if (values == null || values.length == 0) { return null; } // 判断类型必须为Date if (Date.class != toClass) { return null; } // 迭代:转换失败继续下一个格式的转换; 转换成功就直接返回 for (int i=0; i<df.length; i++) { try { return df[i].parse(values[0]); } catch (ParseException e) { continue; } } return null; } @Override public String convertToString(Map context, Object o) { return null; }}
二:Struts2自定义全局类型转换器(注意)1、自定义转换器继承StrutsTypeConverter2、重写convertFromString和convertToString方法3、注册转换器 3.1 在项目src目录下建立以下固定文件 xwork-conversion.properties 3.2 在3.1文件中添加以下数据 需要转换的类类型=转换器类的权限定名 如: 在项目/src/xwork-conversion.properties 配置上java.util.Date= cn.itcast.converter.DateConverter
end:自定义转换器总结:
该拦截器负责对错误信息进行拦截器<interceptor name="conversionError“ class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
- Struts2入门学习(二)
- struts2 入门(二)
- Struts2自学入门(二)
- Struts2入门详解(二)
- Struts2学习笔记二之入门案例
- struts2学习(二)
- Struts2学习笔记(3)-----Struts2入门
- struts2学习笔记(二) 初识Struts2
- struts2学习笔记(二) 初识Struts2
- Struts2学习笔记(二)
- struts2学习笔记(二)
- Struts2学习笔记(二)
- Struts2学习笔记(二)
- struts2学习笔记(二)
- Struts2学习笔记(二)
- Struts2学习笔记(二)
- 深入Struts2学习(二)
- Struts2入门--namespace属性详解(二)
- java中选择排序法和求出数组中的最大值
- 项目登录功能
- 调用notify,wait的线程一定会获得锁吗?
- 求二叉树的镜像
- PyQt5学习笔记06----Qt Designer自定义信号emit及传参
- Struts2入门学习(二)
- RN 学习笔记
- 使用sklearn进行数据预处理 —— 归一化/标准化/正则化
- lesson24 if语句嵌套
- for循环的几种写法
- C模拟打开浏览器百度搜索词条单击结束浏览器进程
- nutch2.x在eclipse+windows环境下运行遇到的一些问题的解决方案
- seq命令,tr命令,sort命令,cut命令
- 半夜二更