web学习笔记24-Struts2结果视图
来源:互联网 发布:淘宝卖家发错快递 编辑:程序博客网 时间:2024/06/10 12:17
1、Struts2的结果视图:
a.局部视图
<package name="p1" extends="default"> <action name="demo1" class="com.example.action.Demo1Action"> <result>/demo1.jsp</result> </action> <action name="demo2"> </action> </package>
b.全局视图:<global-results>
<package name="default" extends="struts-default"> <global-results> 全局视图:访问动作时,如果没有局部视图,则找全局视图 <result name="success" type="dispatcher">/demo1.jsp</result> </global-results> </package>
2、result元素的配置:
属性: name:逻辑视图名称。它对应的是动作方法的返回值。默认值:success。 type:到达目标的形式。默认值:dispatcher。转发。Struts2提供的结果类型(result type属性) 在struts-default.xml中有定义,可以看看源码就知道 chain:用户转发到另外一个动作。 dispatcher(默认):用于转发到另外一个JSP页面。 freemarker:用于转发到另外一个freemarker模板。(页面静态化) velocity:用于转发到另外一个velocity模板。 httpheader:用于输出http协议的消息头。 xslt:XML有关的样式 redirect(常用):用于重定向到另外一个JSP页面。 redirectAction(常用):用于重定向到另外一个动作。 stream(常用):用于文件下载(日后再讲。文件上传和下载) plainText:以纯文本的形式展现页面。输出源码。
3、自定义结果视图:(输出页面上的验证码)
例如我们自定义一个 captcha 输出结果类型步骤:a.编写一个类,直接或间接实现com.opensymphony.xwork2.Result接口。一般继承org.apache.struts2.dispatcher.StrutsResultSupport类
public class CaptachaResult extends StrutsResultSupport{ private int width = 120; private int height = 80; private int numCount = 4; private int grLineNum = 100; public void setWidth(int width) { this.width = width; } public void setHeight(int height) { this.height = height; } public void setNumCount(int numCount) { this.numCount = numCount; } public void setGrLineNum(int grLineNum) { this.grLineNum = grLineNum; } //实现这个方法,输出你的结果即可 protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { ValidateCode vc = new ValidateCode(width, height, numCount, grLineNum); BufferedImage image = vc.getBuffImg(); //输出即可 HttpServletResponse response = ServletActionContext.getResponse(); ImageIO.write(image, "jpeg", response.getOutputStream()); } }
b.声明结果类型,然后才能使用(struts.xml配置)
<package name="p3" extends="struts-default"> <result-types> <!-- 结果类型定义 --> <result-type name="captcha" class="com.example.results.CaptachaResult"></result-type> </result-types> <action name="captcha"> <result name="success" type="captcha"> <param name="width">200</param> </result> </action> </package>
c.使用
我们在jsp页面中使用 <body> <form action=""> username:<input/><br/> password:<input/><br/> 验证码:<input name="code" size="4"/><img src="${pageContext.request.contextPath}/captcha.action"/><br/> <input type="submit" value="登录"/> </form> </body>
界面上就可以显示4位数字的随机验证码了。
4、封装请求参数-动态参数注入-方式1:
动态参数注入:(请求参数,用户输入的)。用Action动作类作为模型对象: 例如: jsp页面:
<body> <form action="${pageContext.request.contextPath}/regist.action" method="post"> 用户名:<input type="text" name="username"/><br/> 密码:<input type="password" name="password"/><br/> <input type="submit" value="登录"/> </form> </body>
struts.xml配置:
<package name="p1" extends="struts-default"> <action name="regist" class="com.example.action.UserAction" method="regist"> <result>/success.jsp</result> <result name="login">/login.jsp</result> </action> </package>
动作类:
public class UserAction extends ActionSupport { private String username; private String password; public String getUsername() { return username; } //框架会按照表单的name值,调用对应的setter属性 public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String regist(){ System.out.println(username+":"+password); if("wzhting".equals(username)&&"sorry".equals(password)) return SUCCESS; else return LOGIN; } }
这种方式是直接用动作类来封装请求的参数
5、封装请求参数-动态参数注入-方式2(推荐):
动作类和模型分开a.编写一个javabean用来封装请求的参数
Person.java: public class Person implements Serializable { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Person [username=" + username + ", password=" + password + "]"; } }
b.编写动作类:
PersonAction.java: public class PersonAction extends ActionSupport { private Person person = new Person();//这种方法可以直接new个Person对象初始化,也可以不用。 //private Person person;//如果不new,框架也会帮你new出来 public Person getPerson() { System.out.println("getter"); return person; } public void setPerson(Person person) { System.out.println("setter"); this.person = person; } public String regist(){ System.out.println(person); //如果用户 hehe 密码123 就成功 if("hehe".equals(person.getUsername())&&"123".equals(person.getPassword())) return SUCCESS; else return LOGIN; } }
c.编写struts.xml配置文件:
<package name="p2" extends="struts-default" namespace="/person"> <action name="regist" class="com.example.action.PersonAction" method="regist"> <result>/success.jsp</result> <result name="login">/login1.jsp</result> </action> </package>
d.编写jsp页面:**(特别注意使用person.username)**
<body> <form action="${pageContext.request.contextPath}/person/regist.action" method="post"> 用户名:<input type="text" name="person.username"/><br/> 密码:<input type="password" name="person.password"/><br/> <input type="submit" value="登录"/> </form> </body>
这种方式就是动作和模型分开了,比较清晰。
优点;动作类写起来简单点;
弊端:页面需要用到命名空间person.username
6、封装请求参数-动态参数注入-方式3:
模型驱动:ModelDriven配置的要求就要高一点a.编写一个javabean用于封装参数:(对属性字段要求比较高)Customer.java:
//属性和form中的字段名一致 public class Customer implements Serializable { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
b.编写一个动作类:**(这个地方要求比较高)**CustomerAction.java:
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{ private Customer customer = new Customer();//注意一定要初始化这个地方 public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } public String regist(){ System.out.println(customer); if("hehe".equals(customer.getUsername())&&"123".equals(customer.getPassword())) return SUCCESS; else return LOGIN; } //此方法会在动作方法执行前先执行;得到当前对应的模型对象并把模型对象压入值栈的栈顶。setUsername先调用栈顶对象的该方法。 public Customer getModel() { return customer; } }
c.编写struts.xml配置文件:
<package name="p3" extends="struts-default" namespace="/customer"> <action name="regist" class="com.example.action.CustomerAction" method="regist"> <result>/success.jsp</result> <result name="login">/login2.jsp</result> </action> </package>
d.编写jsp页面:(页面写起来就不用customer.username了,相对简单)
<body> <form action="${pageContext.request.contextPath}/customer/regist.action" method="post"> 用户名:<input type="text" name="username"/><br/> 密码:<input type="password" name="password"/><br/> <input type="submit" value="登录"/> </form> </body>
优点:页面不需要用到命名空间contomer.username了。弊端:动作类写法相对麻烦点,写javabean的时候属性要和这个页面的这个name值对应起来。个人推荐使用第二种方式。
7、封装请求参数-静态参数注入:
动作类:
public class StudentAction extends ActionSupport { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public String regist(){ System.out.println(name); return null; } }
struts.xml配置:
<package name="p4" extends="struts-default" namespace="/student"> <action name="regist" class="com.example.action.StudentAction" method="regist"> <!-- 静态参数注入 --> <param name="name">游客</param> </action> </package>
阅读全文
0 0
- web学习笔记24-Struts2结果视图
- [学习笔记]web视图
- Struts2中的结果视图
- Struts2结果视图result
- Struts2的结果视图
- Struts2结果视图result
- 配置处理结果---struts2学习笔记
- Java.Web学习笔记 Struts2
- struts2中的结果视图类型
- Spring学习笔记之渲染Web视图
- struts2系列学习笔记(6)---------------Action的结果处理
- struts2系列学习笔记(7)---------------其它形式的结果处理
- Struts2学习笔记(六) 结果(Result)(上)
- Struts2学习笔记(七) 结果(Result)(下)
- Struts2学习笔记(七) 结果(Result)(上)
- Struts2学习笔记(八) 结果(Result)(下)
- Struts2学习笔记(五)——result结果类型
- Java Web学习笔记(七)struts2
- 页面静态化和缓存的区别是什么
- jdbc中哪里用得到反射
- 图像数据增强:平移、加噪、旋转、缩放(padding)
- Android NDK开发中java数据类型与C/C++数据类型的对应关系
- 对CSDN十分失望,现决定废弃该空间
- web学习笔记24-Struts2结果视图
- Multiclass Learning with ECOC
- Python査漏
- n个数的排序
- MFC学习笔记12 创建动态DLL库
- HDU 2007 平方和与立方和
- 机器学习——梯度下降算法
- Non-square Equation CodeForces
- java基础之多线程