struts2入门2
来源:互联网 发布:淘宝提交多个订单 编辑:程序博客网 时间:2024/05/16 11:39
1、web.xml下配的struts的filter(执行了这个filter到struts.xml就不会再回来执行其它的filter),所以要放在最后执行。
2、对于Action里封装的是bean类的时候
public class paramAction extends ActionSupport{
private User user;
public User getUser() {
System.out.println("user get");
return user;
}
public void setUser(User user) {
System.out.println("user set");
this.user = user;
}
public class User {
private int id;
private String name;
private int age;
public User(){
System.out.println("constructer");
}
public int getId() {
System.out.println("get id");
return id;
}
public void setId(int id) {
System.out.println("set id");
this.id = id;
}
public String getName() {
System.out.println("get name");
return name;
}
public void setName(String name) {
System.out.println("set name");
this.name = name;
}
public int getAge() {
System.out.println("get age");
return age;
}
public void setAge(int age) {
System.out.println("set age");
this.age = age;
}
}
结果是:user get
constructer
user set
set age
user get
set id
user get
set name
分析:他第一次调用getUser()会去调用构造函数,去产生一个到后面调用这个getUser()时
就不会产生了。并且他只会调User类的setXx()方法。去赋值。并不会用到getXx()方法。
一定要有getUser()方法,否则每次都产生一个对像,也就只能赋一个性。下回又产生一个。
3、对于Action里封装的是implements ModelDriven的类时候
public class modelAction extends ActionSupport implements ModelDriven<User>{
private User user;
public User getUser() {
System.out.println("model get");
return user;
}
public void setUser(User user) {
System.out.println("model set");
this.user = user;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
if(user==null){
user=new User();
return user;
}
return user;
}
结果:constructer
set age
set id
set name
分析:他不会调用Action类下的getXX()和setXx()方法,不过注意的是上面的对于jsp页面name="user.id" 这里直接写name="id"其它项一样。
4、跳转
内部:
Action类-->前台显示页面(jsp)用 type="Dispatcher"
Action类-->Action类 用 type="chain"
对于跨包的Action类得配
<result type="chain">
<param name="actionName">first</param>
<param name="namespace">/basic</param>
</result> -->
重定向:
Action类-->前台显示页面(jsp)用 type="Redirect"
Action类-->Action类 用 type="RedirectAction"
5、配置全局的返回
<global-results>
<result name="error">error.jsp</result>
</global-results>
对于全部的action类返回的error字符串,都利到error.jsp
6、要是把上面这句话配置到一个包(package)中,这样全部的包都继承它(添加abstract="true"),这样所有的包都共用这个error.jsp。
abstract="true"意味着这个包中的方法是继承的,并不能用来访问。
<package name="default" extends="struts-default" abstract="true">
<global-results>
<result name="error">error.jsp</result>
</global-results>
</package>
7、配置package中默认的action(出错时跳转的页面)
对于web.xml下也可以配
<error-page>
<error-code>404</error-code>
<location>/index.jsp</location>
</error-page>
法一:(DMI)动态方法调用
actionName!methodName.action
法二:
在struts.xml下为每个method配置action.
第三种创建Action的方法
pbulic class CustomerAction extends ActionSupport{
public String execute(){
return null;
}
publci String login(){
return null;
}
public String register(){
return null;
}
}
多了一个login()方法;
此时如果配<action name="customer" class="CustomerAction">
访问customer.action。还是执行的execyute()方法
根据法一如果你访问:customer!login.action就能执行 login()方法
customer!register.action就能执行register()方法
这些方法都要返回字符串。
根据法二配struts.xml
<action name="customer_execute" class="CustomerAction">
<result>/index.jsp</result>
</action>
<action name="customer_login" class="CustomerAction" mehtod="login">
<result>/index.jsp</result>
</action>
<action name="customer_register" class="CustomerAction" mehtod="register">
<result>/index.jsp</result>
</action>
8、使用通配符来配置Action
CustomerLoginAction
CustomerRegisterAction
常规配:
<action name="Customerlogin" class="CustomerLoginAction"></action>
<action name="Customerregister" class="CustomerRegisterAction"></action>
换成:
<action name="Customer*" class="Customer{1}Action"></action>
访问CustomerLogin.action
此时:
*代表Login {1}代表第一个*的值。
有二个*的情况:
<action name="*_*" class="{1}{2}Action"></action>
类名:
CustomerLoginAction
ProductAddAction
对应:
CustomerLogin
ProductAdd
访问Customer_Login.action
第一个*代表Customer第二个*代表Login
{ 1}{2}分别代表Customer和Login
如果对应的是AddProduct
访问Add_Product.action
产生的class为AddProducAction和所产生的类不符出错
他的应用一般是
<action name="*">
<result>/404.jsp</result>
</action>
应当放在最后面,其它的action找不到时,就运行它。
有专门的标签管理这个应用
<default-action-ref name="default"></default-action-ref>
<action name="defalut">
<result>/404.jsp</result>
</action>
配到那个abstract="true"的大家就都可以使用了。
9在action中获取web元素(request,session,application)
requst里面保存属性是以一个Map保存的
所以我们有二种方式获取request
法一:
直接获取request
第一种方式:自己主动获得
获得原类型request对象
HttpServletRequest req = ServletActionContext.getRequest();
获得原类型response对象
HttpServletResponse res = ServletActionContext.getResponse();
获得原类型session对象
HttpSession sess = req.getSession();
获得原类型application对象
ServletContext app1 = sess.getServletContext();
或者
ServletContext app2 = ServletActionContext.getServletContext();
第二种方式:自己被动接收
struts2框架中提供了一个接口,可以用来获得原类型的request对象,因为通过原类型的request对象就可以获得原类型的session对象和原类型的application对象
实现接口:ServletRequestAware,然后struts2框架会通过action所实现的抽象方法,把原类型的request对象自动放到action里面.
类似的还有一接口:ServletResponseAware,和上面的效果、用法是一样的。
法二:
2、对于Action里封装的是bean类的时候
public class paramAction extends ActionSupport{
private User user;
public User getUser() {
System.out.println("user get");
return user;
}
public void setUser(User user) {
System.out.println("user set");
this.user = user;
}
public class User {
private int id;
private String name;
private int age;
public User(){
System.out.println("constructer");
}
public int getId() {
System.out.println("get id");
return id;
}
public void setId(int id) {
System.out.println("set id");
this.id = id;
}
public String getName() {
System.out.println("get name");
return name;
}
public void setName(String name) {
System.out.println("set name");
this.name = name;
}
public int getAge() {
System.out.println("get age");
return age;
}
public void setAge(int age) {
System.out.println("set age");
this.age = age;
}
}
结果是:user get
constructer
user set
set age
user get
set id
user get
set name
分析:他第一次调用getUser()会去调用构造函数,去产生一个到后面调用这个getUser()时
就不会产生了。并且他只会调User类的setXx()方法。去赋值。并不会用到getXx()方法。
一定要有getUser()方法,否则每次都产生一个对像,也就只能赋一个性。下回又产生一个。
3、对于Action里封装的是implements ModelDriven的类时候
public class modelAction extends ActionSupport implements ModelDriven<User>{
private User user;
public User getUser() {
System.out.println("model get");
return user;
}
public void setUser(User user) {
System.out.println("model set");
this.user = user;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
if(user==null){
user=new User();
return user;
}
return user;
}
结果:constructer
set age
set id
set name
分析:他不会调用Action类下的getXX()和setXx()方法,不过注意的是上面的对于jsp页面name="user.id" 这里直接写name="id"其它项一样。
4、跳转
内部:
Action类-->前台显示页面(jsp)用 type="Dispatcher"
Action类-->Action类 用 type="chain"
对于跨包的Action类得配
<result type="chain">
<param name="actionName">first</param>
<param name="namespace">/basic</param>
</result> -->
重定向:
Action类-->前台显示页面(jsp)用 type="Redirect"
Action类-->Action类 用 type="RedirectAction"
5、配置全局的返回
<global-results>
<result name="error">error.jsp</result>
</global-results>
对于全部的action类返回的error字符串,都利到error.jsp
6、要是把上面这句话配置到一个包(package)中,这样全部的包都继承它(添加abstract="true"),这样所有的包都共用这个error.jsp。
abstract="true"意味着这个包中的方法是继承的,并不能用来访问。
<package name="default" extends="struts-default" abstract="true">
<global-results>
<result name="error">error.jsp</result>
</global-results>
</package>
7、配置package中默认的action(出错时跳转的页面)
对于web.xml下也可以配
<error-page>
<error-code>404</error-code>
<location>/index.jsp</location>
</error-page>
法一:(DMI)动态方法调用
actionName!methodName.action
法二:
在struts.xml下为每个method配置action.
第三种创建Action的方法
pbulic class CustomerAction extends ActionSupport{
public String execute(){
return null;
}
publci String login(){
return null;
}
public String register(){
return null;
}
}
多了一个login()方法;
此时如果配<action name="customer" class="CustomerAction">
访问customer.action。还是执行的execyute()方法
根据法一如果你访问:customer!login.action就能执行 login()方法
customer!register.action就能执行register()方法
这些方法都要返回字符串。
根据法二配struts.xml
<action name="customer_execute" class="CustomerAction">
<result>/index.jsp</result>
</action>
<action name="customer_login" class="CustomerAction" mehtod="login">
<result>/index.jsp</result>
</action>
<action name="customer_register" class="CustomerAction" mehtod="register">
<result>/index.jsp</result>
</action>
8、使用通配符来配置Action
CustomerLoginAction
CustomerRegisterAction
常规配:
<action name="Customerlogin" class="CustomerLoginAction"></action>
<action name="Customerregister" class="CustomerRegisterAction"></action>
换成:
<action name="Customer*" class="Customer{1}Action"></action>
访问CustomerLogin.action
此时:
*代表Login {1}代表第一个*的值。
有二个*的情况:
<action name="*_*" class="{1}{2}Action"></action>
类名:
CustomerLoginAction
ProductAddAction
对应:
CustomerLogin
ProductAdd
访问Customer_Login.action
第一个*代表Customer第二个*代表Login
{ 1}{2}分别代表Customer和Login
如果对应的是AddProduct
访问Add_Product.action
产生的class为AddProducAction和所产生的类不符出错
他的应用一般是
<action name="*">
<result>/404.jsp</result>
</action>
应当放在最后面,其它的action找不到时,就运行它。
有专门的标签管理这个应用
<default-action-ref name="default"></default-action-ref>
<action name="defalut">
<result>/404.jsp</result>
</action>
配到那个abstract="true"的大家就都可以使用了。
9在action中获取web元素(request,session,application)
requst里面保存属性是以一个Map保存的
所以我们有二种方式获取request
法一:
直接获取request
第一种方式:自己主动获得
获得原类型request对象
HttpServletRequest req = ServletActionContext.getRequest();
获得原类型response对象
HttpServletResponse res = ServletActionContext.getResponse();
获得原类型session对象
HttpSession sess = req.getSession();
获得原类型application对象
ServletContext app1 = sess.getServletContext();
或者
ServletContext app2 = ServletActionContext.getServletContext();
第二种方式:自己被动接收
struts2框架中提供了一个接口,可以用来获得原类型的request对象,因为通过原类型的request对象就可以获得原类型的session对象和原类型的application对象
实现接口:ServletRequestAware,然后struts2框架会通过action所实现的抽象方法,把原类型的request对象自动放到action里面.
类似的还有一接口:ServletResponseAware,和上面的效果、用法是一样的。
法二:
获取他里面保存的map
未完明天继续。。。。。 0 0
- struts2入门(2)
- struts2入门2
- Struts2入门2
- struts2 入门训练2
- struts2入门(2)
- 2-struts2入门-action
- struts2入门2
- struts2(2)---入门示例
- Struts2 + Spring + Hibernate 入门 2
- Struts2入门基础小结2!
- Struts2入门
- struts2 入门
- struts2入门
- struts2-入门
- struts2入门
- struts2入门
- Struts2入门
- struts2入门
- apt-get update,apt-get upgrade,apt-get dist-upgrade的作用
- Mac 配置JDK 1.7
- 有用的网站
- 第三周项目3-时间类
- 两个数的最大公约数------欧几里德算法(辗转相除法)
- struts2入门2
- ASP.NET程序运行出现WebDev.WebServer40.exe已停止工作解决方法(netsh winsock reset)
- pip list Exception
- 黑马程序员-C语言基础学习(五)
- 23. 微软面试题:跳台阶问题
- 摄像头 由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。 (代码 19)
- 2014Android开发热门资料(110个)
- 关于Linux 系统下 C++ 的多线程基类 Thread
- LeetCode :: Container With Most Water