尚学堂马士兵struts2 课堂笔记(一)

06_尚学堂马士兵_Struts2_Struts2_HelloWorld_5

 
在默认情况下,刚修改struts.xml后在tomcat中没有立刻刷新要么重新启动tomcat,要么加上上面的常量 dev development


07_尚学堂马士兵_Struts2_Struts2_HelloWorld_6

在eclipse里的struts.xm文件敲<是没有反应的,eclipse没有给出提示,其实eclipse里面也不知道给给出怎么样的提示.

很简单 看struts.xml文件的最上面几行

http://struts.apache.org/dtds/struts-2.0.dtd

这个url就是struts的参考信息,每次去网上拿就比较慢. 打开下载的struts lib文件找到struts2-core-xxx.jar解压缩 在里面就能看到dtd文件

再下来就比较简单了 window preference 在查找里面写catalog 找到xml如下图

尚学堂马士兵struts2 课堂笔记(一)_第1张图片


09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.

   Struts的运行机制尚学堂马士兵struts2 课堂笔记(一)_第2张图片

客户端的请求通过相应的端口交给tomcat,tamcat在通过自己的web.xml把请求交给响应的webapp,webapp通过自己的web.xml里面


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




struts2
/*

找到struts.xmlstruts里面通过命名空间/actionname/result(其中命名空间后面再谈)找到响应的映射地址 返回给客户端.

其实struts干了什么,这么简单的问题为什么要搞这么复杂?

这就叫做简单问题复杂化,你只有在学习的时候能把简单的问题复杂化,当面对复杂工作的时候,你才能把复杂问题简单化.其实设计模式不就是干了个这事吗?

言归正传,struts到底干了什么?

就是把请求与视图分开!


10_尚学堂马士兵_Struts2_Struts2_Namespace_命名空间

Struts里面有package.这东西是干什么用的?

其实它和java里面的package一样.区分类而已,如果有两个action 都叫loginaction要给是前台的一个是后台的.放到要给package里面肯定不行 所以就有两个package 一个front一个back 

ok 就这么简单就 这么方便,甚至不需要动笔 人人都要称呼一声神童啊!

     
        
            /Namespace.jsp
        
    

namespace决定了action的访问路径,默认为"",可以接收所有路径的actionnamespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action/xxx/index.action,或者/xxx/yyy/index.action.namespace最好也用模块来进行命名

在上面的namespace里是因此我们要访问这个actionlocalhost:8800/webname/index.action  (.action可以省略)

如果改成 namespace="/aa/"那么访问的url就是localhost:8800/webname/aa./index.action  (.action可以省略)以此类推

另外也可以给namespace赋为空”” 这个时候其他namespace处理不了的请求都交给它来处理.

另外 项目复制后

这位置不会改变,点项目邮件properties 上面查找webok


11_尚学堂马士兵_Struts2_Struts2_Action

 
        
            /ActionIntroduction.jsp
        

index这个action指定的class可以有三种写法

一最普通的类

public class IndexAction1 {

public String execute() {
    return "success";
}
}

二实现action接口

import com.opensymphony.xwork2.Action;

public class IndexAction2 implements Action {

@Override
public String execute() {
    return "success";
}

}

三继承actionSupport

public class IndexAction3 extends ActionSupport {

@Override

public String execute() {

    return "success";

}

}

选择那种方式 ?

第三种!

第一种得自己写,第二种只是实现了action接口,actionsupport里面已经给我们写好了一些常用的方法.而且actionsupport本身就实现了action接口

 

再另外

 
            /Namespace.jsp
 

这里面怎么没有 class 

没有制定classs就默认使用actionsupport,actionsupport本身的execute方法返回的就是succes,再看rusult,如果要指定返回success的响应页面,那么success就可以不写.

在上面这种情况下,就是只要你请求index.action我就给你返回Namespace.jsp

 

12_尚学堂马士兵_Struts2_Struts2_Path_路径问题

Struts里面的如下

 
        
            /path.jsp
        



类如下

package com.bjsxt.struts2.path.action;

 
public class PathAction {
public String execute() {
return "path";
}
}


Index.jsp如下(index.jsp也在webroot下 和path.jsp同级)


<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>





Insert title here


路径问题说明



Psth.jsp如下(path.jsp放在webroot目录下)


<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
    <%@taglib uri="/struts-tags" prefix="s" %>
  





Insert title here


struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
index.jsp
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath

Index.jspwebapp的默认页面,最开始访问localhost:8080/webname/是就会看到index.jsp此时点击”路径问题说明”就跳转到了path.jsp

path.jsp里面你点击index.jsp跳转到了

Localhost:8080/webname/path/index.jsp 看到问题了吧 系统不用关注文件的真实路径.当你在path.jsp.里面点击index时它的路径就是/path!!

怎么办?使用绝对路径

绝对路径方法一

jsp加上如下java

    <%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

超链接改成

index.jsp">index.jsp

绝对路径方法二

在头部加上

" />

下面的路径就默认为bathpath

index.jsp 这样就可以访问了

 

13_尚学堂马士兵_Struts2_Struts2_ActionMethod_DMI_动态方法调用

 

    
    
       
       
            /user_add_success.jsp
                

        
            /user_add_success.jsp
        
 
        



  当在浏览器里敲http://localhost:8080/webapps/kkk/userAdd就可以调用这个action,因为后面跟有有个method=”add”所以调用的不是里面的execute()而是add方法.(不鼓励使用)

   第二中就是http://localhost:8080/webapps/kkk!Add(DMI dynamic method invocation) 不过若是你直接就输入上面的url还是不行因为struts2默认不适用dmi所以还得加上

UserAction的类

package com.bjsxt.struts2.user.action;

import com.opensymphony.xwork2.ActionSupport;

 

public class UserAction extends ActionSupport {
public String add() {
     return SUCCESS;
  }
}




你可能感兴趣的:(struts)