Struts2学习笔记

用自己的话简要阐述struts2的执行流程。 Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。

核心控制器FilterDispatcherStruts 2框架的基础,包含了框架内部的控制流程和处理机制。

业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。

Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2WebWork的升级版本。基本简要流程如下:

1、客户端浏览器发出HTTP请求。

2、根据web.xml配置,该请求被FilterDispatcher接收。

3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton

4Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。

5Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

6、返回HTTP响应到客户端浏览器。

(1)关于配置

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

<constant name="struts.configuration.xml.reload" value="true"></constant>

    <package name="system" namespace="/system" extends="struts-default">

        <action 

        name="user"

        class="cn.com.leadfar.UserAction"

        >

       <result name="add_input">/user/add_input.jsp</result>

       <!--  name是add方法的返回值-->

       <result name="success">/user/add_success.jsp</result>

        </action>

    </package>

</struts>

②web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" 

xmlns="http://java.sun.com/xml/ns/javaee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

   <filter>

            <filter-name>struts2</filter-name>

            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

        </filter>

        <filter-mapping>

            <filter-name>struts2</filter-name>

            <url-pattern>/*</url-pattern>

        </filter-mapping>

</web-app>

③      add_input.jsp

 <body>

  <!--  action中的system/user是struts2里面对应的namespace="/system和 name="user" add是UserAction里面的add方法-->

  <form action="system/user!add" method="post">

  姓名:<input type="text" name="name"><br/>

  年龄:<input type="text" name="age"><br/>

 性别: <select name="sex">

     <option value="true"></option>

     <option value="false"></option>

     </select> <br/>

 存款:<input type="text" name="money"><br/>

<input type="submit" val④ue="提交">  

  </form>

  </body>

④UserAction.java

package cn.com.leadfar;

import com.opensymphony.xwork2.ActionContext;

public class UserAction {

private String name;

private int age;

private boolean sex;

private double money;

public String add_input(){

return "add_input";

}

public String add(){

ActionContext.getContext().put("name""杨幂");

ActionContext.getContext().put("age""23");

return "success";

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public boolean isSex() {

return sex;

}

public void setSex(boolean sex) {

this.sex = sex;

}

public double getMoney() {

return money;

}

public void setMoney(double money) {

this.money = money;

}

}

add_success.jsp

<body>

通过el表达式

用户名:${name}<br/>

性别:${sex} <br/>

通过taglib

用户名:<s:property value="name"/><br/>

年龄:<s:property value="sex"/><br/>

<hr/>

通过ognl表达式取值<br/>

 #name:<s:property value="#name"/><br/>

#age:<s:property value="#age"/><br/>

  </body>

(2)如何在jsp页面获得数据库层(或者dao)数据 Ognl

用户id:<input type="text" name="id" value="<s:property value="id"/>"><br/>

用户名:<input type="text" name="name" value="<s:property value="name"/>"><br/>

性别:<input  type="text" name="sex" value="<s:property value="sex"/>"><br/>

年龄:<input type="text" name="age" value="<s:property value="age"/>"><br/>

薪资:<input type="text" name="salary" value="<s:property value="salary"/>"><br/>

配置struts.xml文件

struts2-core-2.2.1jar包下找到struts-default.xml文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

<constantname="struts.configuration.xml.reload"value="true"></constant>

<packagename="system" namespace="/system" extends="struts-default">

<interceptors>

 <interceptor-stack name="defaultStack">

                <interceptor-ref name="exception"/>

                <interceptor-ref name="alias"/>

                <interceptor-ref name="servletConfig"/>

                <interceptor-ref name="i18n"/>

                <interceptor-ref name="prepare"/>

                <interceptor-ref name="chain"/>

                <interceptor-ref name="debugging"/>

                <interceptor-ref name="scopedModelDriven"/>

                <interceptor-ref name="modelDriven">

                 <param name="refreshModelBeforeResult ">true</param>

                 </interceptor-ref>

                <interceptor-ref name="fileUpload"/>

                <interceptor-ref name="checkbox"/>

                <interceptor-ref name="multiselect"/>

                <interceptor-ref name="staticParams"/>

                <interceptor-ref name="actionMappingParams"/>

                <interceptor-ref name="params">

                  <param name="excludeParams">dojo\..*,^struts\..*</param>

                </interceptor-ref>

                <interceptor-ref name="conversionError"/>

                <interceptor-ref name="validation">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

                <interceptor-ref name="workflow">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

            </interceptor-stack>

</interceptors>

<action 

name="user"

class="cn.com.leadfar.UserAction"

method="add"

>

<result name="add_input">/user/add_input.jsp</result>

<result name="success">/user/add_success.jsp</result>

<result name="update_input">/user/update_input.jsp</result>

</action>

</package>

</struts>

2.UserAction里面的方法中添加

public String update_input(){

int id=user.getId();

user=new UserDao().findById(id);

CompoundRootroot=ActionContext.getContext().getValueStack().getRoot();

return "update_input";

}

(3)文件的上传

值得注意的是在文件上传时,在Action类里面定义的中的uploadFile属性名必须与jsp页面上传的

File:<input type="file" name="uploadFile" ><br/> 保持一致

private File uploadFile;

private String uploadFileFileName

当需要上传的文件保存在硬盘中的时候,可以这样做

public String addsuccess(){

try {

FileUtils.copyFile(uploadFilenew File("d:/temp/"+uploadFileFileName));

catch (IOException e) {

e.printStackTrace();

}

return "addsuccess";

当上传文件过大时,必须要在struts.xml文件中进行配置,否则报错

<constant name="struts.multipart.maxSize" value="318736010"></constant>

如果通过web上传文件过大(如超过100M),则必须用第三方插件(通讯软件),不能通过web上传!

通过web不稳定

多文件上传定义成数字类型,或者集合类型

Action

private File []uploadFile;

private String []uploadFileFileName;

public String addsuccess(){

if(uploadFile!=null){

for(int i=0;i<uploadFile.length;i++){

try {

FileUtils.copyFile(uploadFile[i], new File("d:/temp/"+uploadFileFileName[i]));

catch (IOException e) {

e.printStackTrace();

}

}

}

ActionContext.getContext().put("upload""上传成功");

return "addsuccess";

Jsp页面

File1:<input type="file" name="uploadFile" ><br/>

File2:<input type="file" name="uploadFile" ><br/>

File3:<input type="file" name="uploadFile" ><br/>

(4)struts2中的拦截器

自定义LoginInterceptor继承AbstractInterceptor基类

public String intercept(ActionInvocation invocation) throws Exception {

String login=(String)ActionContext.getContext().getSession().get("login");

if(login==null){

return "login";

}

return invocation.invoke();

}

修改配置文件,讲通用的拦截器,配置到comm.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

<constant name="struts.configuration.xml.reload" value="true"></constant>

<constant name="struts.multipart.maxSize" value="318736010"></constant>

<package name="comm" extends="struts-default" abstract="true">

<interceptors>

<interceptor name="loginInterceptor" class="cn.com.leadfar.Actions.LoginInterceptor"></interceptor>

             <interceptor-stack name="defaultStack">

                <interceptor-ref name="exception"/>

                <interceptor-ref name="alias"/>

                <interceptor-ref name="servletConfig"/>

                <interceptor-ref name="i18n"/>

                <interceptor-ref name="prepare"/>

                <interceptor-ref name="chain"/>

                <interceptor-ref name="debugging"/>

                <interceptor-ref name="scopedModelDriven"/>

                <interceptor-ref name="modelDriven">

                 <param name="refreshModelBeforeResult ">true</param>

                 </interceptor-ref>

                <interceptor-ref name="fileUpload"/>

                <interceptor-ref name="checkbox"/>

                <interceptor-ref name="multiselect"/>

                <interceptor-ref name="staticParams"/>

                <interceptor-ref name="actionMappingParams"/>

                <interceptor-ref name="params">

                  <param name="excludeParams">dojo\..*,^struts\..*</param>

                </interceptor-ref>

                <interceptor-ref name="conversionError"/>

                <interceptor-ref name="validation">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

                <interceptor-ref name="workflow">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

            </interceptor-stack>

            

            

            

            

             <interceptor-stack name="needLoginStack">(自定义拦截器,拦截自己定义的action)

                <interceptor-ref name="exception"/>

                <interceptor-ref name="loginInterceptor"/>

                <interceptor-ref name="alias"/>

                <interceptor-ref name="servletConfig"/>

                <interceptor-ref name="i18n"/>

                <interceptor-ref name="prepare"/>

                <interceptor-ref name="chain"/>

                <interceptor-ref name="debugging"/>

                <interceptor-ref name="scopedModelDriven"/>

                <interceptor-ref name="modelDriven">

                 <param name="refreshModelBeforeResult ">true</param>

                 </interceptor-ref>

                <interceptor-ref name="fileUpload"/>

                <interceptor-ref name="checkbox"/>

                <interceptor-ref name="multiselect"/>

                <interceptor-ref name="staticParams"/>

                <interceptor-ref name="actionMappingParams"/>

                <interceptor-ref name="params">

                  <param name="excludeParams">dojo\..*,^struts\..*</param>

                </interceptor-ref>

                <interceptor-ref name="conversionError"/>

                <interceptor-ref name="validation">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

                <interceptor-ref name="workflow">

                    <param name="excludeMethods">input,back,cancel,browse</param>

                </interceptor-ref>

            </interceptor-stack>

</interceptors>

<default-interceptor-ref name="needLoginStack"></default-interceptor-ref>

<global-results><!--全局,如果登录失败继续返回index.jsp-->

<result name="login">/index.jsp</result>

</global-results>

</package>

</struts>

struct.xml中包含comm.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

<include file="comm.xml"></include>

<package name="system" namespace="/system" extends="comm">

<action name="login" class="cn.com.leadfar.Actions.LoginAction"> (loginLoginAction 里面的session中的key)

:ActionContext.getContext().getSession().put("login",username);

<interceptor-ref name="defaultStack"></interceptor-ref>

<result name="index">/index.jsp</result>

<result name="login_success">/login_success.jsp</result>

</action>

</package>

</struts>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值