struts2

    xiaoxiao2022-07-07  198

     

    Struts2 的作用

    前台mvc的实现   请求到视图的分离

    配置Struts2 

    在web.xml里配置struts2的过滤器

    根据需求配置src目录下的struts2.xml文件

    Struts2.xml 标签详解

    <struts> <!-- ----------------------------------------------constant标签------------------------------------------------- --> <!-- 开发者模式,改了配置文件无需重新部署即可看到效果 --> <constant name="struts.devMode" value="true" /> <!-- 打开动态方法调用,url后面跟!add 可以指定该action调用的class 方法 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"/> <!-- 指定Struts2默认的ObjectFactoryBean:action实例由spring创建 --> <constant name="struts.objectFactory" value="spring" /> <!-- 可选值(name, type, auto, constructor,name)(默认name),设置spring的自动装配方式,只有引入spring插件后才有效 --> <constant name="struts.objectFactory.spring.autoWire" value="type" /> <!--国际化--> <constant name="struts.custom.i18n.resources" value="messagesource"></constant> <!-- 上传文件大小限制设置 --> <constant name="struts.multipart.maxSize" value="629145600"/> <!-- ------------------------------------------------package标签-------------------------------------------------- --> <!-- package:利用不同的namespace解决action的name相同的问题,即:前台和后台的index页面 --> <!-- namespace:定义了访问该package下action里jsp程序的URL路径的格式,即:http://localhost:8088/项目名/front/action名,默认为"",即处理你输入的URL找不到指定的action时候的跳转页面 --> <package name="global" extends="struts-default" namespace=""> <!-- --------------------------------------------interceptors标签-------------------------------------------- --> <interceptors> <interceptor-stack name="defaultStack"> <interceptor-ref name="defaultStack"> <param name="exception.logEnabled">true</param> <param name="exception.logLevel">error</param> </interceptor-ref> </interceptor-stack> </interceptors> <!-- --------------------------------------------global-results标签-------------------------------------------- --> <!-- 公用result ,可以被同package下的其他action实现类返回global-results标签下的result的name值从而访问对应的资源(jsp文件)   --> <!-- 不同的package的extends如果指向包裹global-results标签的package的name(extends="global"),也可以通过其下的action实现类返回global-results标签下的result的name值从而访问对应的资源(jsp文件)--> <!-- 也能被通过extends公共result的 package 的name 的其他的package 里的action 实现类返回mainpage 从而访问 main.jsp --> <global-results> <result name="globalError">/WEB-INF/contents/public/error.jsp</result> </global-results> <!-- --------------------------------------------global-exception-mappings标签-------------------------------------------- --> <!-- 全局申明式异常捕获:所有的action抛出的异常如果没有在对应的exception-mapping中处理,则会在global-exception-mappings中的exception-mapping寻找对应的exception,找到后跳转到global-results中对应result(result name="globalError")--> <global-exception-mappings> <exception-mapping result="globalError" exception="java.lang.Exception"></exception-mapping> </global-exception-mappings> </package> <package name="default" namespace="/" extends="struts-default"> <!-- --------------------------------------------default-action-ref标签-------------------------------------------- --> <!-- 访问该package下不存在的 action时默认返回 name=aa的action --> <default-action-ref name="aa"> <action name="aa"> <result>/default.jsp</result> </action> </default-action-ref> </package> <package> <!-- --------------------------------------------action标签-------------------------------------------- --> <!-- class:定义了访问该package下action里JAVA程序的路径,即不同的action封装不同的包,该包下的class类必须继承ActionSupport接口,默认调用public String execute()方法,因为ActionSupport接口里封装了一系列我们可以方便调用的方法,然后根据该class返回的值a即为接下来要跳转的result-name=a下面的jsp文件 --> <!-- method = "a": 不推荐使用:动态指定该使用class类里的a方法,必须有Stringl类型返回值b,再取name=b的result  --> <!-- method:class里有几个方法,就要配置几个不同的action,麻烦.改用在url中指定method的方法,只要一个action,即: /localhost:8088/项目名+namespace/action名/action名!class里的某方法名 或者通配符 --> <action name="index " class="package包名.class类名" method="add">  <!-- --------------------------------------------result标签-------------------------------------------- -->                                                                  <!-- 指定访问该result的页面跳转方式 --> <!-- 不指定时 默认为 dispatcher 方式,服务器端跳转(jsp:forward) --> <!-- type="redirect":客户端跳转(目标不能为Action) --> <!-- type="chain":服务器端forword跳转(目标可以是Action) --> <!-- type="redirectAction":客户端跳转(目标可以是Action) --> <result name="a" type="dispatcher">/Hellow.jsp</result>             <result name="b">/World.jsp</result> </action>     </package> <!-- --------------------------------------------include标签-------------------------------------------- --> <!-- 引入指定的strut2.xml文件 --> <include file="struts/struts-security.xml" /> </struts>

     

    Struts2 的action如何动态调用实现类的指定方法

    1.url后面加上 !方法名  指定该action调用的具体方法

    2.通配符来实现使配置文件最简化

    <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}"> <result>/Student{1}_success.jsp</result> </action> <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> <!-- {0}_success.jsp --> </action>

    /actions/Teacher_add 即可访问  TeacherAction.java 里的add 方法,如果返回sucess 则 访问  Teacher_add_success.jsp.jsp

    Struts2的 action实现类如何接受参数,该参数有什么用

         action接受参数的方式

    URL格式:http://localhost:8088/项目名+spacename/action名/action名!class里的c方法名?a=1&b=2 action接受参数的方式是调用对应的class里的设置参数的方法:对应的class里要有对应类型的成员变量x,y,seta(){this.x=a}和setb(this.y=b)的方法,才能拿到传递进来的参数,至于c()里怎么用这俩参数无所谓

        DomainModel接受参数的方式:

    public class UserAction extends ActionSupport { private User user; //private UserDTO userDTO; public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }

    ModelDriven接收参数的方式:

    public class UserAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); public String add() { System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); return SUCCESS; } @Override public User getModel() { return user; } }

    Struts2的 action实现类如何给request,session,application里塞值

    public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware { private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; //DI dependency injection 依赖注入 //IoC inverse of control 控制反转 public String execute() { request.put("r1", "r1"); session.put("s1", "s1"); application.put("a1", "a1"); return SUCCESS; } @Override public void setRequest(Map<String, Object> request) { this.request = request; } @Override public void setSession(Map<String, Object> session) { this.session = session; } @Override public void setApplication(Map<String, Object> application) { this.application = application; } }

    前台通过s标签或者jsp去获取 request,session,application

    <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %>

    Struts2 如何动态的给将要访问的result 的页面传值

    <li><a href="user/user?type=1">传参数</a></li> <package name="user" namespace="/user" extends="struts-default"> <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result type="dispatcher">/user_success.jsp?t=${type}</result> </action> </package> public class UserAction extends ActionSupport { private int type; public int getType() { return type; } public void setType(int type) { this.type = type; } @Override public String execute() throws Exception { return "success"; } }

    注意  : action实现类里的属性要设置get set 方法

     

    最新回复(0)