Как я могу показать данные из сервлета в JSP, если писать java-коды в JSP не рекомендуется? [Дубликат]

Swift

Есть тонны и тонны объяснений здесь и вокруг StackOverflow, но если вы новичок, просто пытающийся получить что-то основное для работы, попробуйте посмотреть этот учебник YouTube (это помогло мне, наконец, понять, как это сделать).

Передача данных вперед к следующему контроллеру View

Ниже приведен пример, основанный на видео. Идея состоит в том, чтобы передать строку из текстового поля в First View Controller на метку в Second View Controller.

Создать раскладку раскладки в Interface Builder.

First View Controller

Код для первого контроллера просмотра -

import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    // This function is called before the segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // get a reference to the second view controller
        let secondViewController = segue.destination as! SecondViewController

        // set a variable in the second view controller with the String to pass
        secondViewController.receivedString = textField.text!
    }

}

Контроллер второго взгляда

И код для второго контроллера просмотра -

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    // This variable will hold the data being passed from the First View Controller
    var receivedString = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // Used the text from the First View Controller to set the label
        label.text = receivedString
    }

}

Не забывайте

  • Крючок (f5) и UILabel.
  • Установите первый и второй контроллеры просмотра в соответствующие файлы Swift в IB.

Передача данных назад к предыдущему контроллеру View

Чтобы передать данные с второго контроллера представления на первый контроллер представления, вы используете протокол и делегат . Этот видеоролик - очень четкая прогулка по этому процессу:

Ниже приведен пример, основанный на видео (с некоторыми изменениями).

Создайте раскладной план в Interface Builder. Опять же, чтобы сделать segue, вы просто управляете перетаскиванием с кнопки на второй контроллер просмотра. Установите идентификатор segue на showSecondViewController. Кроме того, не забудьте подключить выходы и действия, используя имена в следующем коде.

First View Controller

Код для первого контроллера просмотра -

import UIKit

class FirstViewController: UIViewController, DataEnteredDelegate {

    @IBOutlet weak var label: UILabel!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showSecondViewController" {
            let secondViewController = segue.destination as! SecondViewController
            secondViewController.delegate = self
        }
    }

    func userDidEnterInformation(info: String) {
        label.text = info
    }
}

Обратите внимание на использование нашего пользовательского протокола DataEnteredDelegate.

Второй просмотр контроллера и протокола

Код для второго контроллера просмотра -

import UIKit

// protocol used for sending data back
protocol DataEnteredDelegate: class {
    func userDidEnterInformation(info: String)
}

class SecondViewController: UIViewController {

    // making this a weak variable so that it won't create a strong reference cycle
    weak var delegate: DataEnteredDelegate? = nil

    @IBOutlet weak var textField: UITextField!

    @IBAction func sendTextBackButton(sender: AnyObject) {

        // call this method on whichever class implements our delegate protocol
        delegate?.userDidEnterInformation(info: textField.text!)

        // go back to the previous view controller
        _ = self.navigationController?.popViewController(animated: true)
    }
}

Обратите внимание, что protocol находится вне класса View Controller.

Вот и все. Запустив приложение, вы сможете отправлять данные с второго контроллера представления на первый.

1530
задан Francesco Menzani 28 August 2015 в 16:17
поделиться

27 ответов

1855
ответ дан Jasper de Vries 25 August 2018 в 09:34
поделиться

Использование Scriptlets - очень старый способ и не рекомендуется. Если вы хотите напрямую вывести что-то на своих страницах JSP, используйте язык выражений (EL) и JSTL.

Существуют также другие варианты, такие как использование механизма шаблонов, таких как Velocity, Freemarker, Thymeleaf и т. д. Но использование простой JSP с EL и JSTL служит моей цели большую часть времени, и это также кажется самым простым для beginner.

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

1
ответ дан adn.911 25 August 2018 в 09:34
поделиться

Конечно, замените <%! counter++; %> на архитектуру производителя-потребителя событий, где бизнес-уровень уведомляется о необходимости увеличения счетчика, он реагирует соответствующим образом и уведомляет докладчиков, чтобы они обновляли представления. Применяется ряд транзакций базы данных, поскольку в будущем нам нужно будет узнать новое и старое значение счетчика, который увеличил его и с какой целью. Очевидно, что сериализация задействована, поскольку слои полностью развязаны. Вы сможете увеличить ваш счетчик на RMI, IIOP, SOAP. Но требуется только HTML, который вы не реализуете, поскольку это такой мирский случай. Ваша новая цель - достичь 250 шагов в секунду на вашем новом блестящем E7, 64-гигабайтном операционном сервере.

У меня более 20 лет в программировании, большинство проектов проваливаются до секстета: Возможность повторного использования Возможность OO-возможности Отказоустойчивость. Возможность обеспечения работоспособности даже необходима. Другие проекты, управляемые людьми, которые заботились только о функциональности, были чрезвычайно успешными. Кроме того, жесткая структура объектов, внедренная слишком рано в проекте, делает код неспособным адаптироваться к резким изменениям в спецификациях (так же гибким).

Поэтому я рассматриваю в качестве промедления активность определения «слоев» "или избыточные структуры данных либо в начале проекта, либо когда это не требуется. & NBSP; [/ д2]

11
ответ дан Alex Weitz 25 August 2018 в 09:34
поделиться

JSP 2.0 имеет функцию «Файлы тегов», вы можете писать теги без внешнего кода java и tld. Вам нужно создать файл .tag и поместить его в WEB-INF\tags, вы даже можете создать структуру каталогов для упаковки ваших тегов.

Например:

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

Используйте его как

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

Также вы можете прочитать тело тега easly

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

Использовать его

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

Сэмплы очень просты, но вы можете делать много сложных задач здесь. Пожалуйста, учтите, что вы можете использовать другие теги (например: JSTL, которые имеют контрольные метки, такие как if/forEcah/chosen манипуляции с текстом, такие как format/contains/uppercase или даже теги SQL select/update), передать все параметры вида, например Hashmap, access session ], request, ... в вашем файле тегов.

Файл тега настолько прост, что вам не нужно перезапускать сервер при их изменении, например, файлы jsp. Это делает их легкими для разработки.

Даже если вы используете фреймворк вроде struts 2, в котором есть много хороших тегов, вы можете обнаружить, что наличие собственных тегов может значительно сократить ваш код. Вы можете передать свои параметры тегов в struts, и таким образом настройте свой тег фрейма.

Вы можете использовать тег не только для избежания java, но и для минимизации своих кодов HTML. Я сам пытаюсь просмотреть HTML-коды и быстро создавать теги, как только на моих страницах начнется просмотр дубликатов кода.

(Даже если вы в конечном итоге используете java в jsp-коде, который, надеюсь, нет, вы можете инкапсулировать этот код в тег)

1
ответ дан Alireza Fattahi 25 August 2018 в 09:34
поделиться

Оптимальной идеей из мира Python являются языки атрибутов шаблона ; TAL был введен Zope (поэтому a.k.a. «Zope Page Templates», ZPT) и является стандартом, с реализациями в PHP, XSLT и Java (я использовал воплощения Python / Zope и PHP). В этом классе языков шаблонов один выше пример может выглядеть так:

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

Код выглядит как обычный HTML (или XHTML) плюс некоторые специальные атрибуты в пространстве имен XML; его можно просматривать в браузере и безопасно настраивать дизайнером. Существует поддержка макросов и для i18n:

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

Если переводы содержимого доступны, они используются.

Я не очень-то знаю о реализация Java .

15
ответ дан Betlista 25 August 2018 в 09:34
поделиться

JSTL предлагает теги для условных выражений, циклов, наборов, get и т. д. Например:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTL работает с атрибутами запроса - они чаще всего устанавливаются в запрос сервлета, который направляет в JSP.

102
ответ дан Bozho 25 August 2018 в 09:34
поделиться

Используйте JSTL Tag libraries в JSP, который будет работать идеально.

18
ответ дан Chandra Sekhar 25 August 2018 в 09:34
поделиться

Как и многие ответы, используйте JSTL или создайте свои собственные теги. Здесь является хорошим объяснением создания пользовательских тегов

0
ответ дан Code_Mode 25 August 2018 в 09:34
поделиться

Как защищать: отключить скрипты для хорошего

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

Я всегда делал это, чтобы любой разработчик не добавлял сценарии, особенно в крупных компаниях, где рано или поздно вы потеряете обзор. Настройки web.xml выглядят следующим образом:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
207
ответ дан Community 25 August 2018 в 09:34
поделиться

Если кто-то действительно против программирования на более языках, чем один, я предлагаю GWT, теоретически вы можете избежать всех элементов JS и HTML, потому что Google Toolkit преобразует весь клиентский и общий код в JS, у вас не будет проблем с их, поэтому у вас есть веб-сервис без кодирования на любых других языках. Даже вы можете использовать какой-то CSS по умолчанию, поскольку он предоставляется расширениями (smartGWT или Vaadin). Вам не нужно изучать десятки аннотаций.

Конечно, если вы хотите, вы можете взломать себя в глубину кода и ввести JS и обогатить вашу HTML-страницу, но на самом деле вы можете избежать этого, если хотите, и результат будет хорошим, поскольку был написан в любых других рамках. Я говорю, что стоит попробовать, а базовый GWT хорошо документирован.

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

16
ответ дан CsBalazsHungary 25 August 2018 в 09:34
поделиться

Ничто из этого больше не используется моим другом, мой совет состоит в том, чтобы отделить представление (css, html, javascript и т. д.) от сервера.

В моем случае я делаю свои системы, обрабатывающие представление с помощью Угловые и любые необходимые данные приводятся с сервера с использованием служб отдыха.

Поверьте, это изменит способ проектирования

1
ответ дан Eduardo 25 August 2018 в 09:34
поделиться

Используя теги JSTL вместе с выражением EL, вы можете избежать этого. На странице jsp выполните следующие действия:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
-1
ответ дан Emil Sierżęga 25 August 2018 в 09:34
поделиться

В архитектурном шаблоне MVC JSP представляют собой слой «Вид». Встраивание java-кода в JSP считается плохой практикой. Вы можете использовать JSTL , freeMarker , скорость с JSP как «движок шаблона». Поставщик данных для этих тегов зависит от структуры, с которой вы имеете дело. Struts 2 и webwork в качестве реализации шаблона MVC использует OGNL «очень интересный метод для раскрытия свойств Beans для JSP».

28
ответ дан Gherbi Hicham 25 August 2018 в 09:34
поделиться

Вы подняли хороший вопрос, и хотя у вас есть хорошие ответы, я бы посоветовал вам избавиться от JSP. Это устаревшая технология, которая в конечном итоге умрет. Используйте современный подход, например, движки шаблонов. У вас будет очень четкое разделение слоев бизнеса и презентаций и, конечно же, кода Java в шаблонах, поэтому вы можете создавать шаблоны непосредственно из программного обеспечения для редактирования веб-презентаций, в большинстве случаев используя WYSIWYG.

И, конечно, избегайте фильтров и предварительной и последующей обработки, иначе вы можете столкнуться с трудностями поддержки / отладки, поскольку вы всегда не знаете, где переменная получает значение.

22
ответ дан glen3b 25 August 2018 в 09:34
поделиться

, чтобы избежать java-кода в JSP-файлах java теперь предоставляет библиотеки тегов, такие как JSTL, также java придумал JSF, в который можно написать все структуры программирования в виде тегов

20
ответ дан mahesh 25 August 2018 в 09:34
поделиться

Технически, JSP все преобразованы в Servlets во время выполнения. Первоначально JSP был создан с целью развязки бизнес-логики и логики проектирования, следуя шаблону MVC. Таким образом, JSP представляет собой технически все java-коды во время выполнения. Но для ответа на вопрос библиотеки тегов обычно используются для применения логики (удаления кодов Java) к страницам JSP.

11
ответ дан mel3kings 25 August 2018 в 09:34
поделиться

Wicket также является альтернативой, которая полностью отделяет java от html, поэтому разработчик и программист могут работать вместе и на разных наборах кода с небольшим пониманием друг друга.

Посмотрите на Wicket.

23
ответ дан msj121 25 August 2018 в 09:34
поделиться

Если мы используем в веб-приложении java следующие вещи, java-код можно исключить из переднего плана JSP.

  1. Использовать архитектуру MVC для веб-приложения
  2. Использовать Теги JSP a. Стандартные теги b. Пользовательские теги
  3. Язык выражения
14
ответ дан RustyTheBoyRobot 25 August 2018 в 09:34
поделиться

Я не уверен, правильно ли я понял.

Вы должны прочитать что-нибудь о MVC. Spring MVC & amp; Struts 2 - два наиболее распространенных решения.

56
ответ дан Sean Patrick Floyd 25 August 2018 в 09:34
поделиться

Используйте базовую, угловатую, как javascript framework для дизайна пользовательского интерфейса, и извлекайте данные, используя rest api. Это полностью удалит зависимость java от пользовательского интерфейса.

1
ответ дан Sumesh TG 25 August 2018 в 09:34
поделиться

Просто используйте тег JSTL и выражение EL.

17
ответ дан tanglei 25 August 2018 в 09:34
поделиться

Независимо от того, насколько вы пытаетесь избежать, когда вы работаете с другими разработчиками, некоторые из них по-прежнему предпочитают скриптлет, а затем вставляют злой код в проект. Поэтому настройка проекта при первом знаке очень важна, если вы действительно хотите уменьшить код сценария. Существует несколько способов преодолеть это (в том числе несколько фреймворков, о которых упоминалось выше). Однако, если вы предпочитаете чистый JSP-путь, используйте файл тегов JSTL. Самое приятное в этом - вы также можете настроить мастер-страницы для своего проекта, чтобы другие страницы могли наследовать мастер-страницы

. Создайте главную страницу под названием base.tag под вашими WEB-INF / тегами с помощью следующий контент

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

На этой странице mater я создал фрагмент под названием «title», так что на дочерней странице я мог вставить больше кодов в это место главная страница. Кроме того, тег <jsp:doBody/> будет заменен содержимым дочерней страницы

Создайте дочернюю страницу (child.jsp) в папке WebContent:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<t:base> используется для указания главной страницы, которую вы хотите использовать (в данный момент это base.tag). Все содержимое внутри тега <jsp:body> здесь заменит <jsp:doBody/> на главной странице. Ваша дочерняя страница также может содержать любые теги lib, и вы можете использовать ее, как и другие. Однако, если вы используете код сценария здесь (<%= request.getParameter("name") %> ...) и попытаетесь запустить эту страницу, вы получите JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here. Таким образом, другие люди не могут включать злой код в файл jsp

Вызов этой страницы с вашего контроллера:

Вы можете легко вызвать файл child.jsp с вашего контроллера , Это также хорошо работает с ракурсами struts

20
ответ дан Thai Tran 25 August 2018 в 09:34
поделиться

, если вы просто хотите избежать недостатков Java-кодирования в JSP, вы можете сделать это даже с помощью скриптов. Просто следуйте некоторой дисциплине, чтобы иметь минимальную Java в JSP и почти нет вычислений и логики на странице JSP.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%//instantiate a JSP controller
MyController clr = new MyController(request, response);

//process action if any
clr.process(request);

//process page forwaring if necessary

//do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // and so on   
        </form>
    </body>
</html>
48
ответ дан Thilina Sampath 25 August 2018 в 09:34
поделиться

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

Если вы можете, то подумайте об использовании специализированной технологии для того, что вам нужно сделать. В Java EE 6 есть JSF 2.0, который обеспечивает множество приятных функций, включая склеивание Java-компонентов вместе с страницами JSF с помощью подхода #{bean.method(argument)}.

25
ответ дан Thorbjørn Ravn Andersen 25 August 2018 в 09:34
поделиться

Научитесь настраивать и писать свои собственные теги с помощью JSTL

. Заметьте, что EL - это EviL (исключения времени выполнения, рефакторинг). Калитка также может быть злой (производительность, трудная для небольших приложений или простой уровень обзора). Пример из java2s ,

Это должно быть добавлено в веб-приложение web.xml

<taglib>
    <taglib-uri>/java2s</taglib-uri>
    <taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>

создать файл: java2s.tld в / WEB-INF /

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- a tab library descriptor -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- this tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

скомпилировать следующий код в WEB-INF \ classes \ com \ java2s

package com.java2s;

import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{    
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 ) 
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // end of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany ) 
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

Запустить сервер и загрузить bodyContent.jsp в браузере

<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <java2s:bodyContentTag howMany="3">
            <li>java2s.com</li>
            </java2s:bodyContentTag>
        </ol>
    </body>
</html>
23
ответ дан tomasb 25 August 2018 в 09:34
поделиться

Существуют также основанные на компонентах фреймворки, такие как Wicket, которые генерируют много HTML для вас. Теги, которые попадают в HTML, являются чрезвычайно базовыми, и в них практически нет логики, в результате чего возникают почти пустые страницы HTML с типичными элементами HTML. Недостатком является то, что в API Wicket имеется много компонентов, и некоторые из них могут быть трудными для достижения этих ограничений.

32
ответ дан tsand 25 August 2018 в 09:34
поделиться

Как избежать кода Java в JSP-файлах?

В дополнение к языку выражений (EL) вы можете использовать теги библиотеки табуляции, такие как JSTL. Но EL не работает с JSP. Так что, вероятно, лучше полностью отказаться от JSP и использовать Facelets.

Facelets - это первый язык декларации страницы без JSP, предназначенный для JSF (Java Server Faces), который предоставил разработчикам JSF более простую и более мощную модель программирования сравнить с JSP. Он решает различные проблемы, возникающие в JSP для разработки веб-приложений.

5
ответ дан Yster 25 August 2018 в 09:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: