كيف يمكنني استبدال أحرف السطر الجديد باستخدام JSP وJSTL؟

StackOverflow https://stackoverflow.com/questions/58054

سؤال

لدي قائمة بكائنات الفول التي تم تمريرها إلى صفحة JSP الخاصة بي، وأحدها عبارة عن حقل تعليق.قد يحتوي هذا الحقل على أسطر جديدة، وأريد استبدالها بفواصل منقوطة باستخدام JSTL، بحيث يمكن عرض الحقل في إدخال النص.لقد وجدت حلاً واحدًا، لكنه ليس أنيقًا جدًا.سأنشر أدناه كاحتمال.

هل كانت مفيدة؟

المحلول

هذا هو الحل الذي وجدته.ومع ذلك، لا يبدو أنيقًا جدًا:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>

${fn:replace(item.comments, newLineChar, "; ")}

نصائح أخرى

مجرد استخدام fn:replace() وظيفة ليحل محل \n بواسطة ;.

${fn:replace(data, '\n', ';')}

في حال كنت تستخدم تطبيق Apache's EL بدلاً من تطبيق Oracle's EL المرجعي (أي.عندما تستخدم Tomcat، وTomEE، وJBoss، وما إلى ذلك بدلاً من GlassFish، وPayara، وWildFly، وWebSphere، وما إلى ذلك)، فأنت بحاجة إلى إعادة الهروب من الشرطة المائلة العكسية.

${fn:replace(data, '\\n', ';')}

يشبه هذا الإجابة المقبولة (لأنها تستخدم Java لتمثيل السطر الجديد بدلاً من EL) ولكن هنا يتم استخدام عنصر <c:set/> لتعيين السمة:

<c:set var="newline" value="<%= \"\n\" %>" />
${fn:replace(myAddress, newline, "<br />")}

يعمل المقتطف التالي أيضًا، ولكن لا يمكن وضع مسافة بادئة للسطر الثاني من عنصر <c:set/> (وقد يبدو أقبح):

    <c:set var="newline" value="
" /><!--this line can't be indented -->
    ${fn:replace(myAddress, newline, "<br />")}

يعد هذا الحل أكثر أناقة من الحل الخاص بك والذي يقوم بتعيين سمة pagecontext مباشرة.يجب عليك استخدام <c:set> علامة لهذا:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="newLine" value="\n"/>
${fn:replace(data, newLine, "; ")}

بالمناسبة: ${fn:replace(data, "\n", ";")} لا يعمل.

هذا لا يعمل بالنسبة لي:

<c:set var="newline" value="\n"/>
${fn:replace(data, newLine, "; ")}

هذا لا:

<% pageContext.setAttribute("newLineChar", "\n"); %> 
${fn:replace(item.comments, newLineChar, "; ")}

يمكنك إنشاء وظيفة JSP الخاصة بك.http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

هذا هو تقريبا ما عليك القيام به.

قم بإنشاء ملف واصف لمكتبة العلامات
/src/META-INF/sf.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>sf</short-name>
  <uri>http://www.stackoverflow.com</uri>
  <function>
    <name>clean</name>
    <function-class>com.stackoverflow.web.tag.function.TagUtils</function-class>
    <function-signature>
      java.lang.String clean(java.lang.String)
    </function-signature>
  </function>
</taglib>

قم بإنشاء فئة Java لمنطق الوظائف.
com.stackoverflow.web.tag.function.TagUtils

package com.stackoverflow.web.tag.function;

import javax.servlet.jsp.tagext.TagSupport;

public class TagUtils extends TagSupport {
  public static String clean(String comment) {
    return comment.replaceAll("\n", "; ");
  }
}

في JSP الخاص بك، يمكنك الوصول إلى وظيفتك بالطريقة التالية.

<%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%>
${sf:clean(item.comments)}

إذا كان ما تحتاجه حقًا هو رمز فيمكنك استخدام النصيحة منه هنا:

${fn:replace(text, "
", "<br/>")}

أو

<c:set var="nl" value="
" /><%-- this is a new line --%>

يتضمن هذا السطر الجديد في السلسلة الحرفية الخاصة بك.

يجب أن تكون قادرًا على القيام بذلك باستخدام fn:replace.

ستحتاج إلى استيراد مكتبة العلامات إلى JSP الخاص بك مع الإعلان التالي:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

ثم يمكنك استخدام التعبير التالي لاستبدال تكرارات السطر الجديد في ${data} بفاصلة منقوطة:

${fn:replace(data, "\n", ";")}

الوثائق ليست رائعة في هذه الأشياء ولم تتح لي الفرصة لاختبارها.

لا يمثل حرف السطر الجديد في تعبير EL.

الحل الذي يحدد أ pageContext ينسب إلى حرف السطر الجديد ثم يستخدمه مع JSTL fn:replace الوظيفة تعمل.

ومع ذلك، أفضل استخدام مكتبة Jakarta String Tab لحل هذه المشكلة:

<%@ taglib prefix="str" uri="http://jakarta.apache.org/taglibs/string-1.1" %>
...
<str:replace var="result" replace="~n" with=";" newlineToken="~n">
Text containing newlines
</str:replace>
...

يمكنك استخدام ما تريد لـ newlineToken؛من غير المرجح أن تظهر "~n" في النص الذي أقوم بالاستبدال عليه، لذلك كان اختيارًا معقولًا بالنسبة لي.

اكثر سهولة:

<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>  

هذا حل صالح لـ JSP EL:

"${fn:split(string1, Character.valueOf(10))}"

يمكنك كتابة وظيفة JSP الخاصة بك للقيام بالاستبدال.

هذا يعني أنك ستنتهي بشيء مثل:

<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}

أين ns هي بادئة مساحة الاسم التي تحددها و replace هي وظيفة JSP الخاصة بك.

من السهل جدًا تنفيذ هذه الوظائف (إنها مجرد طريقة ثابتة) على الرغم من أنني لا أستطيع العثور على مرجع جيد لكتابة هذه الوظائف في الوقت الحالي.

في القيمة أثناء تعيين var، اضغط على ENTER بين علامتي الاقتباس.

${fn:replace(data, newLineChar, ";")}

للعلم، صادفتني هذه المشاركة أثناء معالجة هذه المشكلة:

تتم إضافة سلسلة متعددة الأسطر في JSTL كسمة عنوان لمنطقة النص.تقوم Javascript بعد ذلك بإضافة هذا النص باعتباره النص الافتراضي لمنطقة النص.لمسح هذا النص عند التركيز، يجب أن تكون القيمة مساوية للعنوان...ولكنه يفشل حيث يقوم العديد من محرري النصوص بوضع بدلاً من .وبالتالي فإن التالي سوف يتخلص من غير المرغوب فيه:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top