OpenReports中文支持方案

此文章在《OpenReports中文支持完全解决方案.doc》的基础上做优化,并贴出代码。已测试通过。

 

一、主要解决的问题                    

1 页面显示支持中文

2 与服务器或数据库的交互支持中文

3 查询结果支持中文

4 导出文件名及内容支持中文

二、解决方案及方法

1 增加的类

1.1 cn.ExportDelegate

  直接来自原文件org.displaytag.filter.ExportDelegate,只是将文件名转码,

解决中文表格数据和导出中文文件名时,会产生乱码现象。被cn.ResponseOverrideFilter调用。

package cn;/*** Licensed under the Artistic License; you may not use this file* except in compliance with the License.* You may obtain a copy of the License at**      http://displaytag.sourceforge.net/license.html** THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.*/import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Map;import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.filter.BufferedResponseWrapper;
import org.displaytag.tags.TableTag;
import org.displaytag.tags.TableTagParameters;/*** Actually writes out the content of the wrapped response. Used by the j2ee filter and the Spring interceptor* implementations.* @author Fabrizio Giustina* @version $Revision: 1081 $ ($Author: fgiust $)*/
public final class ExportDelegate
{/*** logger.*/private static Log log = LogFactory.getLog(ExportDelegate.class);/*** Don?t instantiate.*/private ExportDelegate(){// unused
    }/*** Actually writes exported data. Extracts content from the Map stored in request with the* <code>TableTag.FILTER_CONTENT_OVERRIDE_BODY</code> key.* @param wrapper BufferedResponseWrapper implementation* @param response HttpServletResponse* @param request ServletRequest* @throws IOException exception thrown by response writer/outputStream*/protected static void writeExport(HttpServletResponse response, ServletRequest request,BufferedResponseWrapper wrapper) throws IOException{if (wrapper.isOutRequested()){// data already writtenlog.debug("Filter operating in unbuffered mode. Everything done, exiting");return;}// if you reach this point the PARAMETER_EXPORTING has been found, but the special header has never been set in// response (this is the signal from table tag that it is going to write exported data)log.debug("Filter operating in buffered mode. ");Map bean = (Map) request.getAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY);if (log.isDebugEnabled()){log.debug(bean);}Object pageContent = bean.get(TableTagParameters.BEAN_BODY);if (pageContent == null){if (log.isDebugEnabled()){log.debug("Filter is enabled but exported content has not been found. Maybe an error occurred?");}response.setContentType(wrapper.getContentType());PrintWriter out = response.getWriter();out.write(wrapper.getContentAsString());out.flush();return;}// clear headersif (!response.isCommitted()){response.reset();}String filename = (String) bean.get(TableTagParameters.BEAN_FILENAME);String contentType = (String) bean.get(TableTagParameters.BEAN_CONTENTTYPE);if (StringUtils.isNotBlank(filename)){
//            response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");String filename1 = new String(filename.getBytes("GBK"),("ISO8859-1"));response.setHeader("Content-Disposition", "attachment; filename=\"" + filename1 + "\"");}String characterEncoding = wrapper.getCharacterEncoding();String wrappedContentType = wrapper.getContentType();if (wrappedContentType != null && wrappedContentType.indexOf("charset") > -1){// charset is already specified (see #921811)characterEncoding = StringUtils.substringAfter(wrappedContentType, "charset=");}if (characterEncoding != null && contentType.indexOf("charset") == -1) //$NON-NLS-1$
        {contentType += "; charset=" + characterEncoding; //$NON-NLS-1$
        }response.setContentType(contentType);if (pageContent instanceof String){// text contentif (characterEncoding != null){response.setContentLength(((String) pageContent).getBytes(characterEncoding).length);}else{response.setContentLength(((String) pageContent).getBytes().length);}PrintWriter out = response.getWriter();out.write((String) pageContent);out.flush();}else{// dealing with binary contentbyte[] content = (byte[]) pageContent;response.setContentLength(content.length);OutputStream out = response.getOutputStream();out.write(content);out.flush();}}
}

1.2 cn.ResponseOverrideFilter

  直接来自原文件org.displaytag.filter.ResponseOverrideFilter,原有ResponseOverrideFilter路径指向新建Filter的路径,必须。

package cn;//=============
/*** Licensed under the Artistic License; you may not use this file* except in compliance with the License.* You may obtain a copy of the License at**      http://displaytag.sourceforge.net/license.html** THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.*/import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.Messages;
import org.displaytag.filter.BufferedResponseWrapper;
import org.displaytag.filter.BufferedResponseWrapper13Impl;
import org.displaytag.tags.TableTag;
import org.displaytag.tags.TableTagParameters;/*** <p>* Allow the author of an included JSP page to reset the content type to something else (like a binary stream), and then* write the new info back as the exclusive response, clearing the buffers of all previously added content.* </p>* <p>* This filter allows TableTag users to perform exports from pages that are run as includes, such as from Struts or a* jsp:include. If that is your intention, just add this Filter to your web.xml and map it to the appropriate requests,* using something like:* </p>* * <pre>*  &lt;filter>*      &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>*      &lt;filter-class>org.displaytag.filter.ResponseOverrideFilter&lt;/filter-class>*  &lt;/filter>*  &lt;filter-mapping>*      &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>*      &lt;url-pattern>*.do&lt;/url-pattern>*  &lt;/filter-mapping>*  &lt;filter-mapping>*      &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>*      &lt;url-pattern>*.jsp&lt;/url-pattern>*  &lt;/filter-mapping>* </pre>* * <p>* By default the filter buffers all the export content before writing it out. You can set an optional parameter* <code>buffer</code> to <code>false</code> to make the filter write directly to the output stream. This could be* faster and uses less memory, but the content length will not be set.* </p>* * <pre>*  &lt;filter>*      &lt;filter-name>ResponseOverrideFilter&lt;/filter-name>*      &lt;filter-class>org.displaytag.filter.ResponseOverrideFilter&lt;/filter-class>*      &lt;init-param>*          &lt;param-name>buffer&lt;/param-name>*          &lt;param-value>false&lt;/param-value>*      &lt;/init-param>*  &lt;/filter>*  </pre>* * @author rapruitt* @author Fabrizio Giustina* @version $Revision: 1081 $ ($Author: fgiust $)*/
public class ResponseOverrideFilter implements Filter
{/*** Logger.*/private Log log;/*** Force response buffering. Enabled by default.*/private boolean buffer = true;/*** {@inheritDoc}*/public void init(FilterConfig filterConfig){log = LogFactory.getLog(ResponseOverrideFilter.class);String bufferParam = filterConfig.getInitParameter("buffer");if (log.isDebugEnabled()){log.debug("bufferParam=" + bufferParam);}buffer = bufferParam == null || StringUtils.equalsIgnoreCase("true", bufferParam);log.info("Filter initialized. Response buffering is " + (buffer ? "enabled" : "disabled"));}/*** {@inheritDoc}*/public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException{if (servletRequest.getParameter(TableTagParameters.PARAMETER_EXPORTING) == null){if (log.isDebugEnabled()){log.debug(Messages.getString("ResponseOverrideFilter.parameternotfound")); //$NON-NLS-1$
            }// don't filter!
            filterChain.doFilter(servletRequest, servletResponse);return;}HttpServletRequest request = (HttpServletRequest) servletRequest;BufferedResponseWrapper wrapper = new BufferedResponseWrapper13Impl((HttpServletResponse) servletResponse);Map contentBean = new HashMap(4);if (buffer){contentBean.put(TableTagParameters.BEAN_BUFFER, Boolean.TRUE);}request.setAttribute(TableTag.FILTER_CONTENT_OVERRIDE_BODY, contentBean);
//        request.setAttribute("cn.ResponseOverrideFilter", contentBean);
filterChain.doFilter(request, wrapper);ExportDelegate.writeExport((HttpServletResponse) servletResponse, servletRequest, wrapper);}/*** {@inheritDoc}*/public void destroy(){// nothing to destroy
    }
}

1.3 cn.SetCharacterEncodingFilter

  是一个标准的自定义字符集转换Filter,必须。

  

package cn;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class SetCharacterEncodingFilter implements Filter {/*** The default character encoding to set for requests that pass through* this filter.*/protected String encoding = null;/*** The filter configuration object we are associated with.  If this value* is null, this filter instance is not currently configured.*/protected FilterConfig filterConfig = null;/*** Should a character encoding specified by the client be ignored?*/protected boolean ignore = true;public void destroy() {this.encoding = null;this.filterConfig = null;}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// Conditionally select and set the character encoding to be usedif (ignore || (request.getCharacterEncoding() == null)) {String encoding = selectEncoding(request);if (encoding != null)request.setCharacterEncoding(encoding);}chain.doFilter(request, response);}/*** Place this filter into service.* @param filterConfig The filter configuration object*/public void init(FilterConfig filterConfig) throws ServletException {this.filterConfig = filterConfig;this.encoding = filterConfig.getInitParameter("encoding");String value = filterConfig.getInitParameter("ignore");if (value == null)this.ignore = true;else if (value.equalsIgnoreCase("true"))this.ignore = true;else if (value.equalsIgnoreCase("yes"))this.ignore = true;elsethis.ignore = false;}protected String selectEncoding(ServletRequest request) {return (this.encoding);}}

1.4 org.displaytag.export.PdfView

  

/*** Licensed under the Artistic License; you may not use this file* except in compliance with the License.* You may obtain a copy of the License at**      http://displaytag.sourceforge.net/license.html** THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.*/
package org.displaytag.export;import java.io.OutputStream;
import java.util.Iterator;import javax.servlet.jsp.JspException;import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.displaytag.Messages;
import org.displaytag.exception.BaseNestableJspTagException;
import org.displaytag.exception.SeverityEnum;
import org.displaytag.model.Column;
import org.displaytag.model.ColumnIterator;
import org.displaytag.model.HeaderCell;
import org.displaytag.model.Row;
import org.displaytag.model.RowIterator;
import org.displaytag.model.TableModel;
import org.displaytag.util.TagConstants;import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.PageSize;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfWriter;/*** PDF exporter using IText. This class is provided more as an example than as a "production ready" class: users* probably will need to write a custom export class with a specific layout.* @author Ivan Markov* @author Fabrizio Giustina* @version $Revision: 1081 $ ($Author: fgiust $)*/
public class PdfView implements BinaryExportView
{private TableModel model;private boolean exportFull;private boolean header;private boolean decorated;private Table tablePDF;private Font smallFont;public void setParameters(TableModel tableModel, boolean exportFullList, boolean includeHeader,boolean decorateValues){this.model = tableModel;this.exportFull = exportFullList;this.header = includeHeader;this.decorated = decorateValues;}protected void initTable() throws BadElementException{this.tablePDF = new Table(this.model.getNumberOfColumns());this.tablePDF.getDefaultCell().setVerticalAlignment(4);this.tablePDF.setCellsFitPage(true);this.tablePDF.setWidth(100.0F);this.tablePDF.setPadding(2.0F);this.tablePDF.setSpacing(0.0F);//        smallFont = FontFactory.getFont(FontFactory.HELVETICA, 7, Font.NORMAL, new Color(0, 0, 0));//Font name:宋体(中文字体) PDF Font name:STSong-Light PDF Encoding:UniGB-UCS2-H(简体中文)smallFont = FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", Font.DEFAULTSIZE);}public String getMimeType(){return "application/pdf"; }/*** The overall PDF table generator.* @throws JspException for errors during value retrieving from the table model* @throws BadElementException IText exception*/protected void generatePDFTable() throws JspException, BadElementException{if (this.header){generateHeaders();}tablePDF.endHeaders();generateRows();}/*** @see org.displaytag.export.BinaryExportView#doExport(OutputStream)*/public void doExport(OutputStream out) throws JspException{try{// Initialize the table with the appropriate number of columns
            initTable();// Initialize the Document and register it with PdfWriter listener and the OutputStreamDocument document = new Document(PageSize.A4.rotate(), 60, 60, 40, 40);document.addCreationDate();HeaderFooter footer = new HeaderFooter(new Phrase(TagConstants.EMPTY_STRING, smallFont), true);footer.setBorder(Rectangle.NO_BORDER);footer.setAlignment(Element.ALIGN_CENTER);PdfWriter.getInstance(document, out);// Fill the virtual PDF table with the necessary data
            generatePDFTable();document.open();document.setFooter(footer);document.add(this.tablePDF);document.close();}catch (Exception e){throw new PdfGenerationException(e);}}/*** Generates the header cells, which persist on every page of the PDF document.* @throws BadElementException IText exception*/protected void generateHeaders() throws BadElementException{Iterator iterator = this.model.getHeaderCellList().iterator();while (iterator.hasNext()){HeaderCell headerCell = (HeaderCell) iterator.next();String columnHeader = headerCell.getTitle();if (columnHeader == null){columnHeader = StringUtils.capitalize(headerCell.getBeanPropertyName());}Cell hdrCell = getCell(columnHeader);hdrCell.setGrayFill(0.9f);hdrCell.setHeader(true);tablePDF.addCell(hdrCell);}}/*** Generates all the row cells.* @throws JspException for errors during value retrieving from the table model* @throws BadElementException errors while generating content*/protected void generateRows() throws JspException, BadElementException{// get the correct iterator (full or partial list according to the exportFull field)RowIterator rowIterator = this.model.getRowIterator(this.exportFull);// iterator on rowswhile (rowIterator.hasNext()){Row row = rowIterator.next();// iterator on columnsColumnIterator columnIterator = row.getColumnIterator(this.model.getHeaderCellList());while (columnIterator.hasNext()){Column column = columnIterator.nextColumn();// Get the value to be displayed for the columnObject value = column.getValue(this.decorated);Cell cell = getCell(ObjectUtils.toString(value));tablePDF.addCell(cell);}}}/*** Returns a formatted cell for the given value.* @param value cell value* @return Cell* @throws BadElementException errors while generating content*/private Cell getCell(String value) throws BadElementException{Cell cell = new Cell(new Chunk(StringUtils.trimToEmpty(value), smallFont));cell.setVerticalAlignment(Element.ALIGN_TOP);cell.setLeading(8);return cell;}/*** Wraps IText-generated exceptions.* @author Fabrizio Giustina* @version $Revision: 1081 $ ($Author: fgiust $)*/static class PdfGenerationException extends BaseNestableJspTagException{/*** D1597A17A6.*/private static final long serialVersionUID = 899149338534L;/*** Instantiate a new PdfGenerationException with a fixed message and the given cause.* @param cause Previous exception*/public PdfGenerationException(Throwable cause){super(PdfView.class, Messages.getString("PdfView.errorexporting"), cause); //$NON-NLS-1$
        }/*** @see org.displaytag.exception.BaseNestableJspTagException#getSeverity()*/public SeverityEnum getSeverity(){return SeverityEnum.ERROR;}}
}

 

2 在web.xml中配置两个Filter,字符编码过滤器字符集设置为GBK

 直接来自原文件及包,只是将字体设置为支持中文的PDF字体。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app><display-name>OpenReports</display-name>    <context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext*.xml</param-value></context-param><context-param><param-name>contextFactory</param-name><param-value>com.tonbeller.wcf.controller.RequestContextFactoryImpl</param-value></context-param><filter><filter-name>struts</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><!-- support the chinese  add filter  start --><!-- <filter><filter-name>ResponseOverrideFilter</filter-name><filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class></filter>--><filter><filter-name>ResponseOverrideFilter</filter-name><filter-class>cn.ResponseOverrideFilter<!-- org.displaytag.filter --></filter-class></filter><filter><filter-name>encodingFilter</filter-name><filter-class>cn.SetCharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><!-- support the chinese  add filter end--><filter><filter-name>JPivotController</filter-name><filter-class>com.tonbeller.wcf.controller.RequestFilter</filter-class><!--<init-param><param-name>indexJSP</param-name><param-value>/index.html</param-value><description>forward to this page if session is new</description></init-param><init-param><param-name>errorJSP</param-name><param-value>/error.jsp</param-value><description>URI of error page</description></init-param><init-param><param-name>busyJSP</param-name><param-value>/busy.jsp</param-value><description>This page is displayed if a the user clicks on a querybefore the previous query has finished</description></init-param><init-param><param-name>forceExtension</param-name><param-value>.faces</param-value><description>replace .jsp with .faces</description></init-param>--></filter><!-- support the chinese   add mapping start --><filter-mapping><filter-name>ResponseOverrideFilter</filter-name><url-pattern>*.action</url-pattern></filter-mapping><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- support the chinese   add mapping start --><filter-mapping><filter-name>JPivotController</filter-name><url-pattern>/jpivot.action</url-pattern></filter-mapping><filter-mapping><filter-name>JPivotController</filter-name><url-pattern>/JPivot.jsp</url-pattern></filter-mapping><filter-mapping><filter-name>ResponseOverrideFilter</filter-name><url-pattern>*.action</url-pattern></filter-mapping><filter-mapping><filter-name>struts</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- resources initializer --><listener><listener-class>com.tonbeller.tbutils.res.ResourcesFactoryContextListener</listener-class></listener><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>JspSupportServlet</servlet-name><servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet><servlet-name>fileServlet</servlet-name><servlet-class>org.efs.openreports.dispatcher.FileDispatcher</servlet-class><load-on-startup>99</load-on-startup></servlet><servlet><servlet-name>MondrianXmlaServlet</servlet-name><servlet-class>org.efs.openreports.dispatcher.XMLADispatcher</servlet-class></servlet><servlet><servlet-name>XFireServlet</servlet-name><display-name>XFire Servlet</display-name><servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class></servlet>    <!-- jfreechart provided servlet --><servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class></servlet><!-- jfreechart provided servlet --><servlet><servlet-name>GetChart</servlet-name><display-name>GetChart</display-name><description>Default configuration created for servlet.</description><servlet-class>com.tonbeller.jpivot.chart.GetChart</servlet-class></servlet><servlet><servlet-name>Print</servlet-name><display-name>Print</display-name><description>Default configuration created for servlet.</description><servlet-class>com.tonbeller.jpivot.print.PrintServlet</servlet-class></servlet><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/DisplayChart</url-pattern></servlet-mapping><servlet-mapping><servlet-name>Print</servlet-name><url-pattern>/Print</url-pattern></servlet-mapping><servlet-mapping><servlet-name>GetChart</servlet-name><url-pattern>/GetChart</url-pattern></servlet-mapping><servlet-mapping><servlet-name>fileServlet</servlet-name><url-pattern>/report-images/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>fileServlet</servlet-name><url-pattern>/report-files/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>XFireServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>MondrianXmlaServlet</servlet-name><url-pattern>/xmla</url-pattern></servlet-mapping><welcome-file-list><welcome-file>/Login.jsp</welcome-file></welcome-file-list><taglib><taglib-uri>http://www.tonbeller.com/wcf</taglib-uri><taglib-location>/WEB-INF/wcf/wcf-tags.tld</taglib-location></taglib><taglib><taglib-uri>http://www.tonbeller.com/jpivot</taglib-uri><taglib-location>/WEB-INF/jpivot/jpivot-tags.tld</taglib-location></taglib></web-app>

3 增加PDF中文支持的JAR包

4 struts.properties配置文件字符编码改为GBK

## when set to true, Struts will act much more friendly for developers. This
### includes:
### - struts.i18n.reload = true
### - struts.configuration.xml.reload = true
### - raising various debug or ignorable problems to errors
###   For example: normally a request to foo.action?someUnknownField=true should
###                be ignored (given that any value can come from the web and it
###                should not be trusted). However, during development, it may be
###                useful to know when these errors are happening and be told of
###                them right away.
struts.devMode=false### Load custom default resource bundles
struts.custom.i18n.resources=LocalStrings### This can be used to set your default locale and encoding scheme
#support the chinese   start
#struts.locale=en_US
#struts.i18n.encoding=UTF-8
struts.locale=zh_CN
struts.i18n.encoding=GBK#support the chinese   start### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
struts.multipart.parser=org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest 

5 国际化配置文件

屏蔽原来的:LocalStrings.properties文件,新增:LocalStrings_zh_CN.properties文件

翻译如下:

 

 

 

 

error.report.empty=The report is empty. Please try different parameters.
error.validation.notsupported=Validation not supported on queries with parameters.
error.exporttype.required=You must select at least one Export Type.
error.invalid.password=Invalid Password: Both passwords must be equal.
error.login.incomplete=Please Enter Both User Name and Password.
error.login.invalid=Invalid User Name or Password!
error.report.invalid=Invalid report.
error.report.notauthorized=You are not authorized to view this Report.
error.reportgroup.notauthorized=You are not authorized to view this Report Group.
error.emailaddress.required=You must update your email address before scheduling reports!
error.dateandtime.required=Start Date and Time required to schedule report.
error.dateandtime.invalid=Start Time invalid.
error.notauthorized=You are not authorized to perform this action. 
error.notloggedin=You are not currently logged into the system. 
error.invalid.user=You are not a valid OpenReports User. Please contact Administrator.
error.chartquery.invalid=Invalid Chart Query
error.alertquery.invalid=Invalid Alert Query
error.testing.connection=Error testing connection, verify DataSource configuration and try again
error.parameter.required=Please Fill Required Parameter
error.chart.deletion=Report Chart must be removed from all reports before deletion.
error.datasource.deletion=This DataSource is being used by Reports or Parameters and cannot be deleted.
error.group.deletion=Report Group must be removed from all users before deletion.s
error.parameter.deletion=Report Parameter must be removed from all reports before deletion.
error.report.deletion=Report must be removed from all Report Groups before deletion.
error.parameter.notfound=Parameter not found
error.alert.deletion=This alert is associated with a user and can not be deleted.
error.unique.constraint=This name is already in use. Please use a unique name.
error.invalid.maxrows=QueryReport MaxRows must be set to a valid number. 500 is recommended.
error.chart.invalid=Name, description, and query are required.
error.xmla.properties.invalid=XMLA DataSource, URI, and Catalog properties must be set.
error.serverside=There has been an error on the server. Please check the logs.
error.settings.directories=Directories not configured correctly. Please recheck General Settings.alert.failed=Failed
alert.passed=Passedmessage.schedule.successful=Report scheduled successfully...service.request.complete=COMPLETEapplication.title=\u7F51\u7EDC\u81EA\u5B9A\u4E49\u62A5\u8868banner.logoff=\u6ce8\u9500
banner.reports=\u6211\u7684\u62a5\u8868
banner.scheduledReports=\u5b9a\u65f6\u4efb\u52a1\u62a5\u8868
banner.administration=\u7cfb\u7edf\u7ba1\u7406
banner.dashboard=Dashboard
banner.preferences=\u4fee\u6539\u7528\u6237\u4fe1\u606fbutton.save=\u4fdd\u5b58
button.cancel=\u5220\u9664
button.add=\u589e\u52a0
button.delete=\u5220\u9664
button.update=\u66f4\u65b0
button.refresh=\u5237\u65b0
button.submit=\u63d0\u4ea4
button.duplicate=\u590d\u5236
button.validate=\u6821\u9a8c
button.addGroup=\u589e\u52a0\u62a5\u8868\u5206\u7ec4
button.addDataSource=\u589e\u52a0\u6570\u636e\u6e90
button.autoCreate=\u81ea\u52a8\u751f\u6210
button.autoAdd=\u81ea\u52a8\u589e\u52a0
button.addNew=\u65b0\u589e
button.addChart=\u589e\u52a0\u56fe\u8868
button.addReportFile=\u589e\u52a0\u62a5\u8868\u6a21\u677f
button.addReports=\u589e\u52a0\u62a5\u8868
button.cleanup=\u6e05\u9664
button.export=\u5bfc\u51fa
button.import=\u5bfc\u5165label.username=\u7528\u6237\u540D\u79F0
label.password=\u7528\u6237\u5bc6\u7801
label.confirmPassword=\u786e\u8ba4\u5bc6\u7801
label.email=\u90ae\u7bb1\u5730\u5740
label.dashboardReport=Dashboard Report
label.name=\u540d\u79f0
label.externalId=External ID
label.description=\u63cf\u8ff0
label.report=Report
label.startDate=\u8d77\u59cb\u65e5\u671f
label.scheduleType=\u4efb\u52a1\u7c7b\u578b
label.scheduleState=State
label.nextRun=Next Run
label.runDate=Run Date
label.alert=Alert
label.operator=Operator
label.limit=Limit
label.status=Status
label.startTime=\u5f00\u59cb\u65f6\u95f4
label.elapsedTime=Duration (sec)
label.message=\u4fe1\u606f
label.cronExpression=Cron Expression
label.numberOfHours=# of Hours     
label.condition=Condition     
label.recipients=Recipients
label.options=Options
label.once=\u4e00\u6b21
label.daily=\u6bcf\u5929
label.weekdays=\u6bcf\u5468\u67d0\u65e5
label.weekly=\u6bcf\u5468
label.cron=Cron 
label.monthly=\u6bcf\u6708
label.hourly=\u6bcf\u5c0f\u65f6
label.action=Action
label.tags=Tags
label.groups=Groups
label.roles=Roles
label.filter=Filter
label.filterBy=Filter By
label.required=\u5fc5\u987b
label.class=\u53c2\u6570\u7c7b\u578b
label.type=\u7c7b\u578b
label.id=Id
label.data=\u6570\u636e
label.dataSource=\u6570\u636e\u6e90
label.multipleSelect=\u591a\u9009
label.useJNDI=\u4f7f\u7528\u6570\u636e\u6e90
label.url=URL
label.driver=\u6570\u636e\u5e93\u9a71\u52a8\u7a0b\u5e8f     
label.maxIdle=\u6700\u5927\u8fde\u63a5\u6570
label.maxActive=\u6700\u5927\u6d3b\u8dc3\u8fde\u63a5\u6570
label.maxWait=\u6700\u5927\u7b49\u5f85\u65f6\u95f4
label.validationQuery=\u68c0\u9a8c\u67e5\u8be2\u8bed\u53e5
label.query=\u67e5\u8be2\u8bed\u53e5
label.chart=\u56fe\u8868
label.hidden=\u9690\u85cf
label.reportFile=\u62a5\u8868\u6a21\u677f
label.exportTypes=\u62a5\u8868\u7c7b\u578b
label.virtualization=Use Virtualization
label.step=\u6b65\u9aa4
label.sortOrder=\u6392\u5e8f\u987a\u5e8f
label.reportParameter=\u62a5\u8868\u53c2\u6570
label.exportFormat=Export Format
label.exportOption=Export Option
label.chartType=\u56fe\u8868\u7c7b\u578b
label.width=\u5bbd
label.height=\u9ad8
label.xAxisLabel=X\u5750\u6807\u8f74\u540d\u79f0
label.yAxisLabel=Y\u5750\u6807\u8f74\u540d\u79f0
label.showTitle=\u663e\u793a\u6807\u9898
label.showLegend=\u663e\u793a\u56fe\u4f8b
label.showValues=\u663e\u793a\u503c
label.plotOrientation=\u56fe\u5f62\u65b9\u5411
label.drillDownReport=\u4e0b\u94bb\u62a5\u8868
label.horizontal=\u6c34\u5e73\u65b9\u5411
label.vertical=\u6c34\u5e73\u65b9\u5411
label.baseDirectory=Base Directory    
label.reportGenerationDirectory=Report Generation Directory
label.tempDirectory=Temp Directory
label.dateFormat=Date Format          
label.queryReportMaxRows=Query Report Max Rows
label.mailHost=Mail Host
label.useMailAuthenticator=Use Mail Authenticator
label.mailAuthenticatorUser=Mail Authenticator UserName          
label.mailAuthenticatorPassword=Mail Authenticator Password          
label.xmlaURI=XMLA URI           
label.xmlaDataSource=XMLA DataSource          
label.xmlaCatalog=XMLA Catalog
label.numberOfFiles=File Count
label.directorySize=Directory Size
label.reports=\u6211\u7684\u62a5\u8868
label.currentState=Current State
label.hits=Hits
label.user=User
label.value=Value
label.alerts=Alerts
label.defaultValue=\u9ed8\u8ba4\u503clink.back.groups=\u8fd4\u56de\u62a5\u8868\u7ec4
link.back.reports=\u8fd4\u56de\u62a5\u8868
link.back.parameters=Back to Parameters
link.back.charts=\u8fd4\u56de\u56fe\u8868
link.back.dataSources=\u8fd4\u56de\u6570\u636e\u6e90
link.back.users=Back to Users
link.back.admin=\u8fd4\u56de\u5230\u7cfb\u7edf\u7ba1\u7406
link.back.alerts=Back to Alerts
link.delete=\u5220\u9664
link.update=\u66f4\u65b0
link.groups=\u62a5\u8868\u7ec4
link.users=\u7528\u6237
link.admin.reports=\u62a5\u8868
link.admin.reportParameters=\u62a5\u8868\u53c2\u6570
link.admin.dataSources=\u6570\u636e\u6e90
link.admin.charts=\u56fe\u8868
link.admin.alerts=\u8b66\u62a5
link.admin.groups=\u62a5\u8868\u7ec4
link.admin.users=\u7528\u6237
link.admin.scheduler=Scheduler
link.admin.settings=\u8bbe\u7f6e
link.admin.statistics=Statistics
link.admin.logs=\u67e5\u770b\u65e5\u5fd7
link.admin.addUser=\u65b0\u589e\u7528\u6237
link.admin.addReport=\u65b0\u589e\u62a5\u8868
link.admin.addReportParameter=\u65b0\u589e\u62a5\u8868\u53c2\u6570
link.admin.addReportGroup=\u65b0\u589e\u62a5\u8868\u7ec4
link.admin.addDataSource=\u65b0\u589e\u6570\u636e\u6e90
link.admin.addChart=\u65b0\u589e\u56fe\u8868
link.admin.addAlert=\u65b0\u589e\u8b66\u62a5
link.admin.uploadReport=\u4e0a\u4f20\u62a5\u8868\u6587\u4ef6
link.admin.search=\u641c\u7d22
link.admin.import=\u5bfc\u5165\u62a5\u8868
link.admin.export=\u5bfc\u51fa\u62a5\u8868
link.scheduleChart=Schedule ChartReportrole.advancedScheduler=Advanced Scheduler                
role.chartAdmin=Chart Admin
role.dataSourceAdmin=DataSource Admin    
role.uploader=File Uploader
role.groupAdmin=Group Admin
role.logViewer=Log Viewer    
role.parameterAdmin=Parameter Admin
role.reportAdmin=Report Admin
role.rootAdmin=Root Admin
role.scheduler=Scheduler
role.dashboard=Dashboard User
role.schedulerAdmin=Scheduler Admin
role.alerts=Alerts User
role.alertAdmin=Alerts Adminlogin.title=\u8bf7\u767b\u5f55
login.submit=\u767b\u5f55
reportGroup.title=Groups
reportList.title=\u62a5\u8868
reportDetail.title=\u53c2\u6570:
reportDetail.requiredParameters=* Indicates required parameters
reportOptions.title=Export Options for:
reportOptions.exportType=Export Type
reportOptions.description=Email/File Description
reportOptions.run=Run
reportOptions.runNewWindow=\u5728\u65b0\u7a97\u53e3\u6253\u5f00
reportOptions.schedule=Schedule
reportOptions.sendToFile=Send to File
reportOptions.sendToEmail=Send to Email
reportOptions.note=Only applies when 'Send to Email' or 'Send to File' is clicked.
listScheduledReports.scheduledReports=\u5b9a\u65f6\u4efb\u52a1\u62a5\u8868
listScheduledReports.generatedReports=Generated Reports
userAdmin.preferences=\u4fee\u6539\u7528\u6237\u4fe1\u606f
userAdmin.alerts=Alerts
deleteReport.warning=This will remove the report from all groups and delete all entries for the report in the logs.
deleteReport.title=Delete Report Confirmation
deleteReportParameter.title=Delete Report Parameter Confirmation
deleteDataSource.title=Delete DataSource Confirmation
deleteAlert.title=Delete Alert Confirmation
deleteAlert.warning=This will remove the alert and delete all entries for the alert in the logs.
deleteChart.title=Delete Chart Confirmation
deleteGroup.title=Delete Group Confirmation
deleteUser.title=Delete User Confirmation
deleteUser.warning=This will delete all entries for this user in the logs.
deleteScheduledReport.title=Delete Scheduled Report Confirmation
deleteGeneratedReport.title=Delete Generated Report Confirmation
uploadReportFiles.uploadFile=\u4e0a\u4f20\u62a5\u8868\u6587\u4ef6
uploadReportFiles.currentFiles=\u5f53\u524d\u62a5\u8868\u6587\u4ef6
reportViewer.page=Page
reportViewer.zoom=Zoom
viewReportLogs.title=Log Filters
viewReportLogs.warning=Log query results limited to 500 rows 
reportSchedule.title=\u5b9a\u65f6\u4efb\u52a1\u62a5\u8868\u9009\u9879:
reportSchedule.sendToFile=Send to File
reportSchedule.message.hours=# of Hours only applies to Hourly scheduled Reports
reportSchedule.message.cron=Cron Expression only applies to Cron scheduled Reports
reportAdmin.tab.reportAdmin=\u62a5\u8868\u7ba1\u7406
reportAdmin.tab.userAdmin=\u7528\u6237\u7ba1\u7406
reportAdmin.tab.generalAdmin=\u65e5\u5e38\u7ba1\u7406
reportAdmin.message.reports=\u589e\u52a0\u6216\u4fee\u6539\u62a5\u8868\uff0c\u4e0a\u4f20\u62a5\u8868\u6a21\u677f\uff0c\u5206\u914d\u62a5\u8868\u5230\u62a5\u8868\u7ec4.
reportAdmin.message.search=\u901a\u8fc7\u5907\u6ce8\u6216\u8bf4\u660e\u67e5\u8be2\u62a5\u8868\uff0c\u62a5\u8868\u7ec4\uff0c\u7528\u6237.
reportAdmin.message.logs=\u67e5\u770b\u62a5\u8868\u64cd\u4f5c\u65e5\u5fd7\uff0c\u901a\u8fc7\u65e5\u671f\u3001\u62a5\u8868\u3001\u7528\u6237\u6216\u72b6\u6001.
reportAdmin.message.reportParameters=\u589e\u52a0\u6216\u4fee\u6539\u62a5\u8868\u53c2\u6570.
reportAdmin.message.dataSources=\u589e\u52a0\u6216\u4fee\u6539\u6570\u636e\u6e90.
reportAdmin.message.alerts=Add or Modify Alerts.
reportAdmin.message.charts=\u589e\u52a0\u6216\u4fee\u6539\u56fe\u6807.
reportAdmin.message.groups=\u589e\u52a0\u6216\u4fee\u6539\u62a5\u8868\u7ec4\uff0c\u5206\u914d\u7528\u6237\u5230\u62a5\u8868\u7ec4.
reportAdmin.message.users=\u589e\u52a0\u6216\u4fee\u6539\u7528\u6237.
reportAdmin.message.scheduler=Global Scheduler Administration
reportAdmin.message.settings=\u65e5\u5e38\u8bbe\u7f6e\u5305\u62ec\u90ae\u4ef6\u4e3b\u673a\u548c\u62a5\u8868\u76ee\u5f55.
reportAdmin.message.statistics=View Top Reports by user, date or status.
reportAdmin.message.import=Import Report definitions from XML.
reportAdmin.message.export=Export Report definitions to XML.
queryReport.scheduleReport=Schedule Report:
listSearchResults.title=Search by tag:
editUser.addUser=\u65b0\u589e\u7528\u6237:
editUser.selectedUser=\u6240\u9009\u7684\u7528\u6237:
editReportParameter.addReportParameter=Add Report Parameter:
editReportParameter.selectedReportParameter=\u9009\u62e9\u7684\u62a5\u8868\u53c2\u6570:
editUser.selectedUser=\u6240\u9009\u7684\u7528\u6237:
editReportParameter.parameterValues=Parameter Values
editReportGroups.title=Report Groups: 
editReport.tab.reportDefinition=\u62a5\u8868\u5b9a\u4e49
editReport.tab.reportParameters=\u62a5\u8868\u53c2\u6570
editReport.tab.jasperReportOptions=\u62a5\u8868\u5bfc\u51fa\u9009\u9879
editReport.parameters.autoAdd= <b>Auto Add</b> inspects the report design and adds all parameters that match the name of existing OpenReports parameters.
editReport.parameters.autoCreate=<b>Auto Create</b> is the same as <b>Auto Add</b> except that it also creates new Text Parameters for all parameters where a match is not found.
editReport.parameters.addNew=<b>\u65b0\u589e</b> \u5f39\u51fa\u65b0\u589e\u53c2\u6570\u7a97\u53e3\uff0c\u65b0\u5efa\u4e00\u4e2a\u62a5\u8868\u53c2\u6570\u3002.
editReport.jasperOption.removeEmptySpaceBetweenRows=Remove Empty Space Between Rows
editReport.jasperOption.whitePageBackground=White Page Background
editReport.jasperOption.onePagePerSheet=One Page Per Sheet
editReport.jasperOption.wrapBreakWord=Wrap Break Word
editReport.jasperOption.usingImagesToAlign=Using Images To Align
editReport.jasperOption.autoDetectCellType=Auto Detect Cell Type
editProperties.tab.generalSettings=General Settings
editProperties.tab.tempFileCleanup=Temp File Cleanup
editGroupUsers.title=Group User Assignment:
editGroup.addReportsToGroup.title=Add Reports To Group
editGroup.addGroup=Add Group:
editGroup.selectedGroup=\u9009\u62e9\u7684\u7528\u6237:
editDataSource.addDataSource=Add DataSource:
editDataSource.selectedDataSource=\u9009\u62e9\u7684\u6570\u636e\u6e90:
editChart.addChart=Add Chart:
editChart.selectedChart=\u9009\u62e9\u7684\u56fe\u8868:
editAlert.addAlert=\u65b0\u589e\u8b66\u62a5:
editAlert.selectedAlert=\u9009\u62e9\u7684\u8b66\u62a5:
addDataSourceDialog.title=\u65b0\u589e\u6570\u636e\u6e90
addChartDialog.title=\u65b0\u589e\u56fe\u8868
addReportFileDialog.title=\u4e0a\u4f20\u62a5\u8868\u6a21\u677f
addReportParameterDialog.title=\u65b0\u589e\u62a5\u8868\u53c2\u6570
changeScheduleState.title=Change Schedule State Confirmation
analyzeReportLogs.title=Report Statistics
analyzeReportLogs.query.topReports=Top Reports
analyzeReportLogs.query.topReportsByUser=Top Reports By User
analyzeReportLogs.query.topReports30Days=Top Reports - Last 30 Days
analyzeReportLogs.query.topReports60Days=Top Reports - Last 60 Days
analyzeReportLogs.query.topReports90Days=Top Reports - Last 90 Days
analyzeReportLogs.query.topFailures=Top Failed Reports
analyzeReportLogs.query.topEmpty=Top Empty Reports
analyzeReportLogs.query.topAlerts=Top Alerts
analyzeReportLogs.query.topAlertsByUser=Top Alerts - By User
analyzeReportLogs.query.topTriggeredAlerts=Top Alerts - Triggered
analyzeReportLogs.query.topNotTriggeredAlerts=Top Alerts - Not Triggered
dashboard.message=Use the <a href="userAdmin.action">Preferences</a> link to add Alerts and set your Dashboard report.
dataExport.title=Export Report Definitions
dataImport.title=Import Report Definitions    tooltip.parameter.class=The Java class of the parameter. Used for validation and passed to reports.
tooltip.parameter.data=Enter SQL for Query parameters or pipe '|' seperated list of values for List parameters.
tooltip.parameter.dataSource=Used only with Query parameters.
tooltip.parameter.multiSelect=Determines if the parameter allows multiple selections. Valid only for Query and List parameters.tooltip.datasource.driver=JDBC Driver class. The JDBC driver containing this class must be in the OpenReports classpath.
tooltip.datasource.jndi=Lookup JNDI DataSource. JNDI DataSources require only Name and URL.
tooltip.datasource.maxActive=The maximum number of active connections that can be allocated from this pool at the same time, or negative for no limit.
tooltip.datasource.maxIdle=The maximum number of active connections that can remain idle in the pool, without extra ones being released, or zero for no limit.
tooltip.datasource.maxWait=The maximum number of milliseconds that the pool will wait (when there are no available connections) for a connection to be returned before throwing an exception, or -1 to wait indefinitely.
tooltip.datasource.query=The SQL query that will be used to validate connections from this pool before returning them to the caller. If specified, this query MUST be an SQL SELECT statement that returns at least one row.
tooltip.datasource.url=JNDI DataSource name or JDBC Database URLtooltip.report.chart=Select chart for use in ChartReports.
tooltip.report.export=Export Types. Not all export types supported by all report engines.
tooltip.report.file=Select the report template file. Not required for QueryReports or ChartReports.
tooltip.report.hidden=If checked, this report will not be displayed to end users. Useful for DrillDown reports.
tooltip.report.query=Enter SQL query for use with QueryReports or JXLS template.
tooltip.report.virtualization=Enable Virtualization for JasperReports. tooltip.chart.plotOrientation=Plot Orientation. Only applicable for Bar and XY Charts
tooltip.chart.query=Chart SQL Query. See OpenReports Adminstration Guide for valid Chart query formats.
tooltip.chart.values=If this option is checked, the Chart Values will be displayed in a sortable table below the Chart.
tooltip.chart.xlabel=X-Axis label. Not applicable for Pie Charts
tooltip.chart.ylabel=Y-Axis label. Not applicable for Pie Chartstooltip.properties.baseDirectory=Full path to directory containing report files
tooltip.properties.reportGenerationDirectory=Full path to directory used to store reports generated to files
tooltip.properties.tempDirectory=Full path to directory for temp files
tooltip.properties.maxRows=Maximum number of rows returned per QueryReport
tooltip.properties.mailhost=Mail Host required for scheduled reports
tooltip.properties.mailAuthenticator=Check this box if your Mail Host requires a UserName and Password    tooltip.alert.query=Alert SQL Query. Must return an Integer. For example: SELECT count(*) FROM address

 

 

 

6修改displaytag.properties配置文件

 

翻译如下:

factory.decorator=org.efs.openreports.util.displaytag.SpringDecoratorFactory
locale.resolver = org.efs.openreports.util.displaytag.DisplayTagI18nStruts2Adapter
locale.provider = org.efs.openreports.util.displaytag.DisplayTagI18nStruts2Adapter
basic.empty.showtable=truepaging.banner.placement=bottom
paging.banner.item_name=\u8bb0\u5f55
paging.banner.items_name=\u8bb0\u5f55
paging.banner.no_items_found=<span class ="pagebanner">\u6ca1\u6709{0}\u627e\u5230.</span>
paging.banner.one_item_found=<span class ="pagebanner">\u4e00\u6761{0}\u627e\u5230.</span>
paging.banner.all_items_found=<span class ="pagebanner">{0}{1}\u627e\u5230,\u663e\u793a\u5168\u90e8{2}.</span>
paging.banner.some_items_found=<span class ="pagebanner">\u5171\u627e\u5230{0}{1},\u663e\u793a{2}\u5230{3}.</span>
paging.banner.full=<span class ="pagelinks">[<a href="{1}">\u7b2c\u4e00\u9875</a>/<a href="{2}">\u4e0a\u4e00\u9875</a>] {0} [<a href="{3}">\u4e0b\u4e00\u9875</a>/<a href="{4}">\u6700\u540e\u4e00\u9875</a>]</span>
paging.banner.first=<span class ="pagelinks">[\u7b2c\u4e00\u9875/\u4e0a\u4e00\u9875] {0} [<a href="{3}">\u4e0b\u4e00\u9875</a>/<a href="{4}">\u6700\u540e\u4e00\u9875</a>]</span>
paging.banner.last=<span class ="pagelinks">[<a href="{1}">\u7b2c\u4e00\u9875</a>/<a href="{2}">\u4e0a\u4e00\u9875</a>] {0} [\u4e0b\u4e00\u9875/\u6700\u540e\u4e00\u9875]</span>
paging.banner.onepage=<span class ="pagelinks">{0}</span>
paging.banner.page.selected=<strong>{0}</strong>
paging.banner.page.link=<a.href="{1}" title+"\u8f6c\u5230\u9875 {0}">{0}</a>
paging.banner=<div class="explortlinks">\u5bfc\u51fa\u7c7b\u578b:{0}</div>

7、JSP页面文件字符集全部改为GBK

 

转载于:https://www.cnblogs.com/shindo/p/4958767.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七、功能性组件与事件逻辑(IVX 快速开发教程)

七、功能性组件与事件逻辑 由于 iVX 极度易用的特性&#xff0c;在 iVX 中开发微信小程序、WebApp、小游戏应用的开发流程大致相同。介绍完基础可视化组件后通过后台的服务、数据库与事件结合即可完成一个应用的开发&#xff1b;此篇将会介绍 iVX 功能性组件与事件&#xff0c…

WPF 基础控件之 ToggleButton 样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButtonToggleButton 实现下面的效果1&#xff09;ToggleButton来实现动画&#xff1b;Border嵌套 Ellipse并设置T…

反射调用 java bean的set和get方法

v一、使用java.beans.PropertyDescriptor import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method;public class PropertyUtil {private static final String SET_PREFIX "…

八、后台与数据库(IVX 快速开发教程)

八、后台与数据库 在 iVX 中 数据库 作为数据存储仓库&#xff0c;通过 数据库 可以永久性存储存储数据&#xff0c;而 后台服务 起到数据传输作用&#xff0c;将 数据库 的数据传输到前台页面之中&#xff0c;页面再使用这些数据。 文章目录八、后台与数据库8.1.1 数据库添加…

Android Studio开发环境搭建准备

Android Studio 是一个Android开发环境&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 Android Studio开发环境搭建前&#xff0c;我们需要进行安装前的准备工作&#xff0c;本篇以在Windows 7平台…

九、二手信息站点后台完成 (IVX 快速开发教程)

九、二手信息站点后台完成 了解完后台实现后&#xff0c;我们开始为该二手商品站点完成完成后台制作。 文章目录九、二手信息站点后台完成9.1.1 完成二手信息站点注册功能9.1.2 完成二手信息站点登录功能9.1.3 完成商品发布功能9.1.4 首页信息获取9.1.5 详情页内容9.1.1 完成二…

爬虫是什么?起什么作用?

【爬虫】 如果把互联网比作一张大的蜘蛛网&#xff0c;数据便是放于蜘蛛网的各个节点&#xff0c;而爬虫就是一只小蜘蛛&#xff0c;沿着网络抓取自己得猎物&#xff08;数据&#xff09;。这种解释可能更容易理解&#xff0c;官网的&#xff0c;就是下面这个。 爬虫是一种自动…

oneproxy检测主从复制同步延迟

Q:为什么要实现读写分离延迟检测&#xff1f; A:就好比你在ATM机存钱&#xff0c;你老婆收到短信后乐呵呵的拿网银APP查看&#xff0c;结果钱没过来。其实钱已经到账了&#xff0c;只是查询的ATM机节点钱还没过来。所以我们dba要监控数据&#xff0c;一旦发现钱没有复制到另一A…

.NET 分表分库动态化处理

介绍本期主角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案&#xff0c;具有零依赖、零学习成本、零业务代码入侵我不是efcore怎么办这边肯定有小伙伴要问有没有不是efcore的,我这边很确信的和你讲有并且适应所有的ADO.NET包括sqlhelperShardingCo…

addEventListener 的事件函数的传递【转载】

addEventListener 参数如下&#xff1a; addEventListener(type, listener[, useCapture]); type&#xff0c;事件名称listener&#xff0c;事件处理器useCapture&#xff0c;是否捕获一直把 listener 记成是响应函数&#xff0c;function 类型。相信很多人也是这么理解的。多数…

Android之elevation实现阴影效果

1 需求 需要控件实现阴影效果 2 实现 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"andr…

十、小程序实战 (IVX 快速开发教程)

十、小程序实战 使用小程序完成一个二手信息站点与 WebApp 实现流程类型&#xff0c;只是部分内容使用了微信小程序特有的组件&#xff0c;例如微信登录与 WebApp 略有差别&#xff0c;其它逻辑实现较为类似。我们先制作页面&#xff0c;之后再实现功能。 由于之前已经完成了…

源代码下载 第六章 注解式控制器详解

2019独角兽企业重金招聘Python工程师标准>>> 源代码请到附件中下载。 其他下载&#xff1a; 跟着开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下载 Controller接口控制器详解 源代码下载 源码下载——第四章 Controller接口控制器详解——跟着开…

WPF|快速添加新手引导功能(支持MVVM)

阅读导航前言案例一案例二案例三&#xff08;本文介绍的方式&#xff09;如何使用&#xff1f;控件如何开发的&#xff1f;总结1. 前言案例一站长分享过 眾尋 大佬的一篇 WPF 简易新手引导 一文&#xff0c;新手引导的效果挺不错的&#xff0c;如下图&#xff1a;该文给出的代码…

三、界面介绍(IVX快速手册)

三、集成开发环境界面介绍 通过本节你将了解 iVX 在线集成开发环境 界面&#xff0c;快速建立对 在线集成开发环境 的认识。 文章目录三、集成开发环境界面介绍3.1 界面区域3.2 舞台3.3 组件工具栏3.4 对象树/素材面板3.5 属性面板3.6 菜单面板3.7 逻辑工具面板3.8 辅助工具3.…

Android studio之提示Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46

1、错误提示如下 Failed to resolve: com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46 Show in Project Structure dialog Affected Modules: app2、解决办法 在project的build.gradle里面加入 maven { url https://jitpack.io }

【VB测绘程序设计】第二章 VB测绘程序基础

第一节 数据类型 VB中提供了以下11中基本的数据类型: 一、数值型 二、字符串 三、日期型 1.界面设计 2. 代码 <

React-引领未来的用户界面开发框架-读书笔记(六)

第12章 服务端渲染 想让搜索引擎抓取到你的站点&#xff0c;服务端渲染这一步不可或缺&#xff0c;服务端渲染还可以提升站点的性能&#xff0c;因为在加载JavaScript脚本的同时&#xff0c;浏览器就可以进行页面渲染。 React的虚拟DOM是其可被用于服务端渲染的关键。首先每个R…