Достаточно начать работу со Struts2.

Java Java EE

предисловие

Это начало Struts, в основном знакомство с инфраструктурой Struts... Зачем внедрять Struts, каковы преимущества внедрения Struts и простое введение в Struts2....

Зачем вводить стойки?

Поскольку сервлеты могут что-то делать, почему мы используем фреймворки? ?

  • Фреймворк помогает нам инкапсулировать многие часто используемые функции.
    • Автоматически инкапсулировать параметры, полученные из Интернета, в JavaBeans [раньше, когда мы только начинали учиться, мы получали параметры по отдельности, а позже мы использовали BeanUtils для написания инструментальных методов, помогающих нам инкапсулировать]. Теперь, если мы используем Struts2, внутренняя часть фреймворка может помочь нам в инкапсуляции.
  • Более гибкий [не нужно писать путь и другую информацию о программе], для пути мы используем файл конфигурации для управления им.Если каталог меняется, нет необходимости изменять путь каждой программы по отдельности.
  • В каждом сервлете есть такие методы, как doGet и doPost, которые не нужны. Извлекаем его и заменяем эти два метода через конфигурационный файл, тогда наша программа будет более изящной.

В результате появился struts2.


пользовательские стойки

Прежде чем формально объяснить распорки, давайте посмотрим, как мы можем оптимизировать их на нашем текущем уровне. .

Возьмем случай регистрации входа пользователя в качестве иллюстрации.

Традиционный вход пользователя и регистрация

  • dao
public class UserDao {

    public User login(User user) {

        if ("aaa".equals(user.getUsername()) && "123".equals(user.getPsd())) {

            System.out.println("登陆成功!");
            return user;

        } else {
            System.out.println("登陆失败!");
            return null;
        }
    }

    public void register(User user) {

        System.out.println("注册成功!" + user.getUsername());
    }


}
  • service

public class UserService {

    private UserDao userDao = new UserDao();

    public User longin(User user) {
        return userDao.login(user);
    }

    public void register(User user) {
        userDao.register(user);
    }

}
  • loginServlet

@javax.servlet.annotation.WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        //得到用户带过来的数据,封装到Bean对象中
        String username = request.getParameter("username");
        String psd = request.getParameter("psd");

        User user = new User();
        user.setPsd(psd);
        user.setUsername(username);

        try {
            //调用Service方法
            UserService userService = new UserService();
            userService.longin(user);

            //登陆成功跳转到首页
            request.getRequestDispatcher("/index.jsp").forward(request, response);

        } catch (Exception e) {
            e.printStackTrace();

            //登陆失败,跳转到相关的提示页面
            request.setAttribute("message","登陆失败了!!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }

    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        this.doPost(request, response);

    }
}

  • registerServlet

@javax.servlet.annotation.WebServlet(name = "RegisterServlet",urlPatterns = "/RegisterServlet")
public class RegisterServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        //得到用户带过来的数据,封装到Bean对象中
        String username = request.getParameter("username");
        String psd = request.getParameter("psd");

        User user = new User();
        user.setPsd(psd);
        user.setUsername(username);

        try {
            //调用Service方法
            UserService userService = new UserService();
            userService.register(user);

            //注册成功跳转到登陆界面
            request.getRequestDispatcher("/login.jsp").forward(request, response);

            //注册成功,我也可以跳转到首页
            //request.getRequestDispatcher("/index.jsp").forward(request, response);

        } catch (Exception e) {
            e.printStackTrace();

            //注册失败,跳转到相关的提示页面
            request.setAttribute("message","注册失败了!!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }

    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        this.doPost(request, response);

    }
}
  • login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>


  <form action="${pageContext.request.contextPath}/LoginServlet" method="post">

    用户名:<input type="text " name="username">
    密码:<input type="password " name="psd">
    <input type="submit" value="登陆">
  </form>
  </body>
</html>

  • register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>


  <form action="${pageContext.request.contextPath}/RegisterServlet" method="post">

    用户名:<input type="text " name="username">
    密码:<input type="password " name="psd">
    <input type="submit" value="注册">
  </form>
  </body>
</html>

Вышеуказанный код был протестирован и может быть запущен.


①: Путь перехода на страницу жестко запрограммирован. После успешной регистрации я могуЧтобы перейти на домашнюю страницу, вы также можете перейти к интерфейсу входа в систему.. Если бы мне пришлось выбирать одного из них, я быИсходный код должен быть изменен...

②:Функция соответствует сервлету, Это слишком хлопотно... Я написал LoginServlet, и еще я написал RegisterServlet....


Регистрация нового пользователя

мы найдем,Независимо от того, какой сервлет, он в конечном итоге перейдет на соответствующую страницу JSP...то есть на первом и втором шагах [инкапсулировать данные, вызвать Сервис] мы можеминкапсулировать...если толькоПросто верните uri сервлету и перейдите на страницу JSP..


LoginAction

Возвращенный uri делится на два случая:

  • Если это переадресация, то возвращается объект RequestDispatcher.
  • Если это перенаправление, то возвращается строка

/**
 * Created by ozc on 2017/4/26.
 * <p>
 * 一个Action对应一个Servlet,Action负责处理具体的请求
 */
public class LoginAction {


    public Object login(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        Object uri ;

        //得到用户带过来的数据,封装到Bean对象中
        String username = request.getParameter("username");
        String psd = request.getParameter("psd");

        User user = new User();
        user.setPsd(psd);
        user.setUsername(username);

        try {
            //调用Service方法
            UserService userService = new UserService();
            userService.longin(user);

            //登陆成功跳转到首页
            request.getSession().setAttribute("user", user);

            //跳转到首页的时候需要重定向
            //response.sendRedirect(request.getContextPath() + "/index.jsp");

            //如果是重定向,那么返回的是字符串
            uri = "/index.jsp";
            return uri;

        } catch (Exception e) {
            e.printStackTrace();

            //登陆失败,跳转到相关的提示页面
            request.setAttribute("message","登陆失败了!!!");
            //request.getRequestDispatcher("/message.jsp").forward(request, response);

            //如果是转发,那么返回的是RequestDispatcher对象
            uri = request.getRequestDispatcher("/message.jsp");
            return uri;
        }
    }
}

  • LoginServlet можно написать так:

    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        //得到LoginAction对象
        LoginAction loginAction = new LoginAction();
        Object uri = loginAction.login(request, response);


        //是重定向
        if (uri instanceof String) {
            response.sendRedirect(request.getContextPath() + uri);
        } else {

            //是转发,强转成是RequestDispatcher对象
            ((RequestDispatcher) uri).forward(request, response);
        }
    }


RegisterAction

  • RegisterAction


/**
 * Created by ozc on 2017/4/26.
 * 
 * 一个Action对应一个Servlet,Action负责处理具体的请求
 */
public class RegisterAction {


    public Object register(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        Object uri ;

        //得到用户带过来的数据,封装到Bean对象中
        String username = request.getParameter("username");
        String psd = request.getParameter("psd");

        User user = new User();
        user.setPsd(psd);
        user.setUsername(username);

        try {
            //调用Service方法
            UserService userService = new UserService();
            userService.register(user);

            //登陆成功跳转到登陆页面
            uri = request.getRequestDispatcher("/login.jsp");
            return uri;

        } catch (Exception e) {
            e.printStackTrace();

            //注册失败,跳转到相关的提示页面
            request.setAttribute("message","注册失败了!!!");
            //request.getRequestDispatcher("/message.jsp").forward(request, response);

            uri = request.getRequestDispatcher("/message.jsp");
            return uri;
        }
    }
}

  • RegisterServlet

    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        //得到RegisterAction
        RegisterAction registerAction = new RegisterAction();

        Object uri = registerAction.register(request, response);

        //是重定向
        if (uri instanceof String) {
            response.sendRedirect(request.getContextPath() + uri);
        } else {

            //是转发,强转成是RequestDispatcher对象
            ((RequestDispatcher) uri).forward(request, response);
        }
    }


считать

На данный момент мы создали два класса Action для инкапсуляции логического кода сервлета, и мы вернемся к коду сервлета.

这里写图片描述

这里写图片描述

Ясно видно, что: дваСервлеты, которые реализуют разные функции, вызывают только разные действия..... Если различаются только вызываемые действия [вызов разных действий посредством отражения], то нам следует подумать об использовании сервлета для управления всем проектом, ** то есть: весь веб-проект имеет только один основной контроллер

проблема:

①: Мы прямо указали путь сопоставления сервлета раньше, теперьПусть ActionServlet обрабатывает все запросыМы просто установили правило:Пока суффикс .action, он будет управляться контроллером ядра ActionServlet.....

②: Теперь, когда все запросы переданы ActionServlet, как узнать, какое действие вызывается? ? ? Мы можем передать uri запроса, например:http://localhost:8080/login.action, где login означает вызов LoginAction.. То есть login=LoginAction, мы можем настроить его через файл свойств..

③: Теперь мы знаем, какое действие вызывается, но у действия может быть не только один метод, нам также нуженПри вызове какое имя указанного метода?.Это очень просто, обычно у нас есть четкое разделение обязанностей, метод = логин.... и,Вызванное действие также связано с конкретным методом и не может существовать изолированно.Поэтому нашФайл конфигурации не может использовать свойства, вам нужно использовать XML

④: При вызове метода он возвращает uri объекта.Тип uri может быть String или RequestDispatcher, а возвращаемый результат может быть в нескольких случаях [может перейти на домашнюю страницу или может перейти к интерфейсу входа]

⑤:Метод, вызываемый действием, также связан с возвращаемым uri!.....Различные действия вызывают разные методы, и возвращаемый uri также отличается.....

⑥: На какую страницу перейти, вы можетеОпределить по сумме идентификации....Например: успех означает успешное выполнение, если вы хотите перенаправить столько типов, добавьте тип, если вы не перенаправляете, тип типа отсутствует. Путь представлен путем. Поэтому вВ конкретном действии нет необходимости возвращать конкретный uri, если возвращается идентификатор.


Нарисуйте картинку, чтобы разобраться в идее:

这里写图片描述


XML-конфигурация

Мы можем написать XML-конфигурацию следующим образом:Когда ActionServlet инициализируется, он считывает файл конфигурации XML, чтобы узнать, какое действие вызывается, какой метод в действии и на какую страницу нужно перейти..

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

        <action name="login" className="zhongfucheng.servlet.LoginServlet" method="login">
            <!--是否存在type属性,存在则是重定向,不存在则是转发-->
            <!--result的值表示的就是跳转的路径-->
            <result name="success" type="redirect">/index.jsp</result>
            <result name="fail">/message.jsp</result>

        </action>
        <action name="register" className="zhongfucheng.servlet.RegisterServlet" method="register">
            <!--是否存在type属性,存在则是重定向,不存在则是转发-->
            <!--result的值表示的就是跳转的路径-->
            <result name="success">/message.jsp</result>
            <result name="fail">/message.jsp</result>
        </action>
    </package>

</mystruts>

Чтобы лучше управлять этой информацией, мы должны использовать JavaBean для ее инкапсуляции.

  • ActionMappingManager ------- Управляет всеми действиями
/**
 * Created by ozc on 2017/4/26.
 * 
 * 该类管理着全部的Action
 *
 * 要管理全部的Action,就需要用一个容器来装载这些Action
 *
 * 选择Map集合是最合适的,可以通过key来得到Action,key就是<action name=><action/>中的name属性
 *
 */
public class ActionMappingManager {

    private Map<String, ActionMapping> map = new HashMap<>();
    
    //注意:外界都是通过name来得到对应的Action的,并不会获取得到整个Manager
    public ActionMapping getActionMapping(String name) {
        return map.get(name);
    }

}

  • ActionMapping ---- представляет одно действие

public class ActionMapping {

    //所有的results
    private Map<String, Results> results;

    //关键字name
    private String name;

    //要调用的Action路径
    private String className;

    //Action中的方法
    private String method;

    public Map<String, Results> getResults() {
        return results;
    }

    public void setResults(Map<String, Results> results) {
        this.results = results;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }
}

  • Результаты --- представляет представление результатов


/**
 * Created by ozc on 2017/4/26.
 *
 * 该类表示的是结果视图
 *
 *
 *
 */
public class Results {

    //方法返回的标识
    private String name;

    //要跳转的方式
    private String type;

    //要跳转的页面
    private String page;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }
}


ActionMappingManager читает файл конфигурации

В ActionMappingManager вы должны прочитать файл конфигурации, а затем упаковать информацию для внутренней ...


/**
 * Created by ozc on 2017/4/26.
 *
 * 该类管理着全部的Action
 *
 * 要管理全部的Action,就需要用一个容器来装载这些Action
 *
 * 选择Map集合是最合适的,可以通过key来得到Action,key就是<action name=><action/>中的name属性
 *
 */
public class ActionMappingManager {
    private Map<String, ActionMapping> allAction ;

    public ActionMappingManager() {
        this.allAction = new HashMap<>();

        //读取配置文件信息
        init();

    }


    public void init() {
        /********通过DOM4J读取配置文件信息*********/

        try {
            //得到解析器
            SAXReader saxReader = new SAXReader();

            //读取在类目录下的mystruts.xml文件
            InputStream stream = ActionMappingManager.class.getClassLoader().getResourceAsStream("mystruts.xml");

            //得到代表XML文件的Document对象
            Document document = saxReader.read(stream);

            //通过XPATH直接得到所有的Action节点
            List list = document.selectNodes("//action");

            //得到每个Action节点
            for (int i = 0; i < list.size(); i++) {
                Element action = (Element) list.get(i);

                //把得到每个Action的节点信息封装到ActionMapping中
                ActionMapping actionMapping = new ActionMapping();

                String name = action.attributeValue("name");
                String method = action.attributeValue("method");
                String className = action.attributeValue("className");
                actionMapping.setName(name);
                actionMapping.setMethod(method);
                actionMapping.setClassName(className);

                //得到action节点下的所有result节点
                List results = action.elements("result");

                //得到每一个result节点
                for (int j = 0; j < results.size(); j++) {
                    Element result = (Element) results.get(j);

                    //把得到每个result节点的信息封装到Results中
                    Results results1 = new Results();

                    //得到节点的信息
                    String name1 = result.attributeValue("name");
                    String type = result.attributeValue("type");
                    String page = result.getText();

                    results1.setName(name1);
                    results1.setType(type);
                    results1.setPage(page);

                    //把result节点添加到ActionMapping的集合中
                    actionMapping.getResults().put(name1, results1);
                }

                //最后把得到每个ActionMapping的信息添加到ActionMappingManager中
                allAction.put(name, actionMapping);

            }



        } catch (DocumentException e) {

            new RuntimeException("初始化的时候出错了!“" + e);
        }
    }

    //注意:外界都是通过name来得到对应的Action的,并不会获取得到整个Manager
    public ActionMapping getActionMapping(String name) {
        return allAction.get(name);
    }
}


ActionServlet

Используйте метод init () для загрузки только нагрузки и создания объекта ActionManagermapping и установить его для начала, когда веб-контейнер запускает сервлет


/**
 * Created by ozc on 2017/4/26.
 *
 *
 * Web容器一启动的时候,该类就应该加载了,在web.xml文件中配置onloadStart
 */

public class ActionServlet extends HttpServlet {


    //该对象封装了所有的XML信息
    ActionMappingManager actionMappingManager ;
    @Override
    public void init() throws ServletException {

        //让ActionMappingManager对象只有一个!
        actionMappingManager = new ActionMappingManager();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
            //得到用户的uri
            String uri = request.getRequestURI();

            //截取uri的关键部分-----截完应该是login
            uri = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));

            //通过uri得到配置文件中的action信息
            ActionMapping actionMapping = actionMappingManager.getActionMapping(uri);

            //得到action的类名,方法名
            String className = actionMapping.getClassName();
            String method = actionMapping.getMethod();

            //通过反射创建出Action的对象,调用对应的方法
            Class t = Class.forName(className);
            Object o = t.newInstance();

            //注意:这里的参数是接口的class,不是单纯的request的class,单纯的class是实现类
            Method m = t.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);

            //调用方法,得到标记
            String returnFlag = (String) m.invoke(o, request, response);


            //通过标记得到result的具体信息
            Results result = actionMapping.getResults().get(returnFlag);
            String type = result.getType();
            String page = result.getPage();

            //判断是重定向还是转发,为空就是转发,反则是重定向
            if (type == null) {
                response.sendRedirect(page);
            } else {
                request.getRequestDispatcher(request.getContextPath() + page).forward(request, response);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        this.doPost(request, response);

    }
}

Конкретный метод Action должен возвращать только идентификатор. Мы можем получить конкретный URL-адрес страницы перехода и метод перехода через идентификатор. . .


Эффект:

这里写图片描述


Пользовательская сводка MyStruts:

Из-за недостатков традиционного модуля веб-контроллера:

  • Некоторые функции используются повторно, а код слишком повторяющийся.
  • Прыгающая страница написана мертвой. Меняйте исходный код при изменении требований

Этот пост в блоге в основном имитирует процесс разработки Struts.

  • использоватьОсновной контроллер ActionServlet для управления всеми веб-запросами., записывать файлы конфигурации XML, читать файлы конфигурации.
  • ActionMapping инкапсулирует основную информацию Action.В файле конфигурации XML он считывает основную информацию Action, инкапсулирует ее в JavaBean и, наконец, использует набор классов ActionMapping для единообразного управления.
  • Когда пользователь получает доступ, мы используем URL-адрес, который является именем действия.Отразите соответствующий класс, чтобы работать с ним.
  • СноваОпределите метод перехода и URL-адрес перехода в соответствии с информацией о конфигурации XML-файла.

То, что мы сейчас изучаем, — это Struts2, на самом деле Struts1 и Struts2 находятся в разработке.Технически это не очень актуально. Struts2 на самом деле основан на фреймворке Web Work., но его продвижение не так хорошо, как Struts1, поэтому он взял имя Struts и запустил фреймворк Struts2.

Поэтому при изучении Struts2 не имеет значения, что вы не знаете Struts1.

В начале было объяснено, почему вводится структура Struts, на самом деле она предназначена для повышения эффективности разработки...

В фреймворке Struts2 предварительно реализованы некоторые функции:

  • Автоматическая инкапсуляция данных запроса
  • Функция загрузки файлов
  • Упрощение функций интернационализации
  • Функция проверки данных....и т.д.

Struts2 шага разработки

Давайте сразу объясним, каковы этапы разработки Struts2... Прежде чем разбираться в деталях, сначала настройте среду конфигурации!

импортировать JAR-файл

В комплектных стойках более 80 пакетов jar, и нам не нужно столько в нашей ежедневной разработке.Как правило, мы импортируем 8 банок:

  • commons-fileupload-1.2.2.jar [Пакеты, связанные с загрузкой файлов]
  • commons-io-2.0.1.jar [пакеты, связанные с загрузкой файлов]
  • struts2-core-2.3.4.1.jar [пакет основных функций struts2]
  • xwork-core-2.3.4.1.jar [основной пакет Xwork]
  • ognl-3.0.5.jar [таблица поддержки функций выражений Ognl]
  • commons-lang3-3.1.jar [расширение struts для пакета java.lang]
  • freemarker-2.3.19.jar [файл jar библиотеки шаблонов этикеток struts]
  • javassist-3.11.0.GA.jar [jar, связанный с обработкой байт-кода struts]

这里写图片描述


настроить web.xml

Фильтр, настроенный в web.xml, фактически находится вРабота по инициализации для стоек

Стоит отметить, что:Если web.xml настроен с несколькими фильтрами, то фильтр struts должен быть в конце!


<!-- 引入struts核心过滤器 -->
	<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>


Разработать действие

Во вступительной главе мы уже говорили, что для бизнес-кода сервлета мы все используем действие, чтобы заменить...Классы действий обычно наследуют ActionSupport

Класс действий также называется классом действий.Класс, который обрабатывает запрос.


public class HelloAction extends ActionSupport {

    @Override
    public String execute() throws Exception {

        System.out.println("helloworld");
        
        return "success";
    }
}

Что касается метода execute(), давайте оставим его в покое, зачем возвращать String, а нам на это наплевать....Просто помните шаги разработки, и нашКласс действий должен наследовать класс ActionSupport.

Настройка struts.xml

Что касается конфигурации 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>
<package name="hello" extends="struts-default">
    <action name="hello" class="action.HelloAction" method="execute">
        <result name="success">/index.jsp</result>

    </action>
</package>
</struts>

После прочтения приведенного выше файла конфигурации он очень похож на файл конфигурации фреймворка struts, который мы написали во вступительной главе....

Эффект:

Введите hello прямо в адресную строку, чтобы перейти на страницу index.jsp. И оператор в execute() выполняется...

这里写图片描述


Процесс выполнения Struts2

Давайте кратко разберемся с процессом выполнения Struts, а затем медленно объясним часть вышеперечисленных шагов разработки....

запуск сервера

Ниже я говорю о фокусе процесса распорок:

  • Загрузите файл web.xml
  • Найдите фильтр в нашей конфигурацииStrutsPrepareAndExecuteFilter
  • StrutsPrepareAndExecuteFilter выполняет метод init() внутри
  • до того какDispatcher dispatcher = init.initDispatcher(config);, инициализировать диспетчер
  • Загрузите struts-default.xml и наш настроенный struts.xml при инициализации диспетчера.

Давайте используем изображение GIF, чтобы увидеть процесс его выполнения:

这里写图片描述

Внимательные друзья могут обнаружить, что мыВ узле пакета struts.xml расширяет struts-defaultСтойки - по умолчанию .... это именно то, что это?

Находим его исходный код:

这里写图片描述

Мы нашли много бинов, перехватчик, результат-тип, перехватчик-стек... позвольте мне объяснить, для чего они используются...

  • Компонент указывает тип объекта, который Struts должен создать во время выполнения.
    • При запуске Struts вам может потребоваться создать некоторые объекты, то укажите их через бобы
  • перехватчик - это перехватчик, определяемый распорками, всего их 32
    • Как упоминалось ранее, Struts реализовал для нас некоторые функции, т.е.через перехватчик.
  • result-type — это тип результата прыжка.
    • Возвращаемое значение в бизнес-методе Action, мы нашли несколько полезных: redirect [перенаправление], диспетчер [forward], redirectAction [перенаправление на ресурс Action], stream [используется при загрузке файлов]... Здесь также определяется тип результата перехода
  • interceptor-stack — это стек перехватчиков
    • Есть 32 перехватчика, мы можем использовать много перехватчиков,Вызывать по одному нельзя, поэтому предусмотрен стек-перехватчик... на самом деле это можно просто рассматривать как отношения между **папками и файлами**
  • default-interceptor-ref — это стек перехватчика, выполняемый по умолчанию.
  • класс default-class-ref — это класс действий выполнения по умолчанию.

Добавить это:Стек перехватчиков по умолчанию имеет 18 перехватчиков.....


Перехватчики и фильтры

И перехватчики, и фильтры перехватывают ресурсы

Перехватчики перехватывают только запросы действий, что является концепцией struts...

Фильтр перехватывает все ресурсы Интернета, что является концепцией сервлета...


краткое содержание

Когда сервер запускается, он фактическизагруженный файл web.xml,ПотомВызовите метод init() для загрузки таких файлов, как struts.xml и struts-default.xml......

Уведомление:Перехватчик не был вызван в это время.


этап доступа

существуетНа этапе запуска сервера он просто загружает различные xml-файлы... Итак, когда мы обращаемся к Action, каков его поток выполнения?

  • Во-первых, это будетСоздайте объект Action, который мы настроили в struts.xml.
  • Тогда это будетВыполнить 18 перехватчиков в порядке по умолчанию [то есть вызвать стек перехватчиков по умолчанию]
  • Наконец, это будетБизнес-метод, который выполняет действие[То есть execute(), какой бизнес-метод выполняется в соответствии с тем, что мы настроили в файле struts.xml]

Стоит отметить, что:Каждый раз, когда к действию обращаются, оно создает объект... это не просто один объект, например сервлет...Так что это потокобезопасно.


Подробное объяснение struts.xml

Это содержимое нашего struts.xml, думаю, теперь оно не будет слишком незнакомым...


<struts>
<package name="hello" extends="struts-default">
    <action name="hello" class="action.HelloAction" method="execute">
        <result name="success">/index.jsp</result>
    </action>
</package>
</struts>


package

Пакет на самом деле является пакетом.Для чего используется пакет?Пакеты используются для управления действиями

Обычно мыБизнес-шаблон соответствует пакету

name

name — это имя пакета, стоит отметить, что имя пакета не может повторяться.


extends

extends представляет, какой пакет наследует текущий пакет.В struts пакеты должны наследовать struts-default


abstract

Также в пакете присутствует абстрактный атрибут, при использовании которого:Указывает, что текущий пакет наследуется другими пакетами...и,Под пакетом не может быть никаких действий, иначе произойдет ошибка!


namespace

В пакете также есть атрибут пространства имен --- пространство имен.... Этокак часть пути, по умолчанию "/"


actoin

action:Настройте отношение сопоставления между путем запроса и классом действия.


name

name — это имя пути запроса


class

Класс - это полное имя класса, которое обрабатывает действие


method

Метод называется имя метода


result

результат представляет собой значение, возвращаемое бизнес-методом в действии.


name

имя — это значение, возвращаемое обработкой действия


type

тип это тип прыжка


текстовое значение

Текстовое значение — это путь для перехода


деталь

Как упоминалось ранее, пакет должен соответствовать бизнес-модулю.Разбейте функции...

struts, чтобы мы могли лучше управлять XML-файлами, он также может сделать это:Описано в разных xml файлах в разных модулях...

这里写图片描述

Наконец, вы можете импортировать его в файл struts.xml...


<!--struts在运行的时候总会加载这个文件-->
<!--总配置文件总引入其他的文件-->
<struts>
    <include file="privilegeaction/privilege.xml"/>
    <include file="useraction/hello.xml"/>
</struts>


Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом.Учащиеся, которые привыкли читать технические статьи в WeChat и хотят получить больше ресурсов по Java, могут подписаться на общедоступную учетную запись WeChat: Java3y.