Struts2入门

来源:互联网 发布:linux shell 编程入门 编辑:程序博客网 时间:2024/05/21 10:47

1. struts2与MVC

Struts2是当前流行的Java web MVC框架,MVC指的是Model,Controller,View相互分离的思想,Controller接收来自用户的输入,将用户输入的指令和数据传递给业务模型,即Model层,该层主要进行业务逻辑判断,对数据库进行操作,最后根据业务的不同选择不同的视图View,并将结果反馈给用户
MVC


2. struts2基本工作原理

Struts2的工作原理如下图:
工作原理
用户发送的HttpServletRequest经过一系列的过滤器后到达ActionMapper,找到对应的Action的操作并调用相应的方法,得到结果结果类型。并以String类型返回,并根据不同的类型跳转到相应的视图。
返回的类型有SUCCESS , NONE , ERROR , LOGIN , INPUT,具体返回的情况如下
处理结果类型


3. struts2核心文件的配置

要实现上述的功能,需要对几个核心文件进行配置:web.xml,struts.xml(可以用include包含其他的xml文件)。

  1. web.xml:基本上每个框架都有的,因为都需要与web应用整合,只有配置在web.xml文件中Servlet才会被应用加载。
    通常所有的MVC框架都需要Web应用加载一个核心控制器,对应Struts2而言,需要加载StrutsPrepareAndExecuteFilter,只要Web应用加载了StrutsPrepareAndExecuteFilter,StrutsPrepareAndExecuteFilter就会加载Struts2框架。下面是一个栗子
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <display-name>HelloWorld</display-name>  <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>  <welcome-file-list>    <welcome-file>index.html</welcome-file>    <welcome-file>index.htm</welcome-file>    <welcome-file>index.jsp</welcome-file>    <welcome-file>default.html</welcome-file>    <welcome-file>default.htm</welcome-file>    <welcome-file>default.jsp</welcome-file>  </welcome-file-list></web-app>

其中 /* 表示对都有的文件都过滤
2. struts.xml:struts2的核心配置文件,主要负责管理应用中的Action映射,以及该Action包含的Result定义。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <include file="helloworld.xml"></include></struts>

其中包含的helloworld.xml为:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="default" namespace="/" extends="struts-default">        <default-action-ref name="index"></default-action-ref>        <action name="index">            <result >/error.jsp</result>        </action>        <action name="helloworld_*" method="{1}" class="com.action.HelloWorldAction">            <result >/result.jsp</result>            <result name="add">/add.jsp</result>        </action>        <action name="login" method="login" class="com.action.LoginAction">            <result >/success.jsp</result>            <result name="input">/login.jsp</result>        </action>    </package></struts>

根标签是struts标签,一个标签下有多个package,一个package下有多个action,action标签下有对应不同结果String的result标签。
先看package标签,

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

有三个属性,分别是name,名字空间namespace,以及action的后缀extends属性,默认后缀为.action。
action标签定义了相应的处理逻辑和要显示的视图

<action name="index" method="login" class="com.action.LoginAction">            <result >/error.jsp</result></action>

即在LoginAction.java中处理完逻辑(method不写的话默认是execute方法),返回后,如果返回结果是默认的SUCCESS就跳转到error.jsp页面,很好的体现了MVC的思想。

配置完成后在浏览器中输入相应的Action就可以实现不同页面的跳转。

除了上述的web.xml和Struts.xml外,还可以有struts.properties文件,但不是必须的。


3. 几点注意

  1. Action搜索顺序:Action搜索顺序

  2. 为了解决避免Action太多,可以在使用动态方法调用

    • 指定method属性,如上所示
    • 感叹号方式(官方不推荐)
    • 通配符方式,如
<action name="helloworld_*" method="{1}" class="com.action.HelloWorldAction">

3, 接收参数的3种方法

  1. 使用Action的属性接收,自动的,java文件中的属性要与表单中的name要一样
  2. 将属性封装到自定义类中接收,在jsp页面中的name中写类.属性 接收即可
  3. 使用ModelDriven接收,实现ModelDriven<>接口,如:
public class LoginAction extends ActionSupport implements ModelDriven<User> {    private User user = new User();    public String login() {            return INPUT;        }        return SUCCESS;    }    @Override    public User getModel() {        return user;    }

此时不能又set,get方法,也要自行new User();
4. List集合在jsp中对应的name为name="books[0].username" 等的形式
5. 返回INPUT实现表单验证,示例代码:

if (user.getUsername() == null || "".equals(user.getUsername())){            this.addFieldError("username", "username can not be empty");            return INPUT;        }
1 0
原创粉丝点击