Struts2学习--配置及原理简述

一、配置

这里写图片描述

如图所示,开发前先配好工作环境。
1. 将Structs压缩包(自行下载后)解压缩,将目录 struts-2.3.20\apps\struts2-blank\WEB-INF\lib 下的jar包全部导入到项目的WEB-INF的lib目录下。

2 WEB-INF下建立web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts Blank</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>
</web-app>

3 src下建立struts.xml,并做相应的配置(配置package、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>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <package name="default"  extends="struts-default">
        <action name="*" class="com.csp.servlet.LoginAction"  method="login">
            <!-- <result type="json"></result> -->
            <result >/WEB-INF/{1}.jsp</result>
        </action>
    </package>
</struts>

4.在src下写各种Action的处理类
举例如下

package com.csp.servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Servlet implementation class LoginAction
 */

public class LoginAction extends ActionSupport implements ServletRequestAware,ServletResponseAware {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    HttpServletRequest request;
    HttpServletResponse response;

    private String username;
    private String password;


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public void setServletResponse(HttpServletResponse arg0) {
        // TODO Auto-generated method stub
        this.response=arg0;
    }

    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        // TODO Auto-generated method stub
        this.request=arg0;
    }

    public void login(){
        response.setContentType("text/json;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        Map<String,String> json=new HashMap<String,String>();
        if("admin".equals(username)&&"123456".equals(password)){
            json.put("message","欢迎管理员登陆");

        }else if(!"admin".equals(getUsername())&&"123456".equals(getPassword())){
            json.put("message","欢迎"+getUsername()+"登陆!");
        }else{
            json.put("message","非法登陆信息");
        }
        try {
            byte[] jsonBytes=json.toString().getBytes("utf-8");
            response.setContentLength(jsonBytes.length);
            response.getOutputStream().write(jsonBytes);
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
}

参考:
http://blog.csdn.net/killmice/article/details/9114331

二、原理
1. web.xml 在学习SSH之前,主要是用来配置Servlet。学习了Struts框架后,Servlet的概念被Action替代,尽管底层仍然是Servlet。web.xml主要是针对tomcat服务器而言,主要配置核心控制器,各种过滤器,项目运行的时候首先运行该配置文件。

2. struts.xml 主要是Struts框架的配置文件,用来配置Action。相当于以前的Servlet。客户端发来的请求进行预处理,然后可以查询struts.xml文件得到相应的处理类和处理方法,配置action的时候,method不写,默认是execute方法。配置处理结果,说白了就是将逻辑结果映射到物理页面

3. 是什么让http请求和action关联在一起的?
返回上面看web.xml的内容,web.xml对任何请求进行过滤,通过反射,调用org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,类的方法,方法的调用顺序如下:
init—>doFilter—>destroy
init()中Dispatcher被初始化,加载struts2的相关配置文件,将按照顺序逐一加载:default.properties,struts-default.xml,struts-plugin.xml,struts.xml,……
参考:
http://www.iteye.com/topic/829843
这个时候,struts.xml就粉墨登场,struts.xml也就和web.xml联系起来了。不难想到,框架中大量用到了反射技术,比如在struts.xml文件中找到了处理类,然后根据这个类名,创建对象,反射的方式调用处理方法。另一方面,也调用了get和set方法,自动的完成请求参数的传递,不用像以前那样getHttpRequest().getParameter()。使用更加方便了。

发布了34 篇原创文章 · 获赞 5 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章