前言
写在前面:首先是不一次性放出来的原因:资料来之不易,希望大家好好珍惜,每天花一段时间细细的消化这些题目,其次希望大家在阅读题目的时候最好跟着书或者代码一起阅读、一起敲,做到熟稔于心,信手拈来,这样面试的时候才能展现你最自信的一面。
141、NativeScript:增强tns平台声明
答案:
最终,我根本不赞成tns-platform-declarations
,因为性能非常糟糕(特别是如果您的开发机中的RAM小于等于8GB)。
我的解决方案是定义一个自己的my-typings.d.ts
文件(例如,在项目根目录中),在其中定义扩展类型RecyclerView
。随着tsconfig.json违约应该自动被追上了tsc。否则可以添加exclude/include
或files表达式。
然后,您可以放置一个/// <reference path="path/to/RecyclerView/file.d.ts" />内部,以便ambient global namespaceTypescript
编译器可以找到以下内容。
declare namespace android {
namespace view {
namespace ViewGroup {
namespace LayoutParams {
const MATCH_PARENT;
const WRAP_CONTENT;
}
}
class ViewGroup {
}
}
namespace support.v7.widget {
namespace RecyclerView {
type AdapterImpl = {
onCreateViewHolder(parent: android.view.ViewGroup, viewType: number): ViewHolder;
onBindViewHolder(holder: android.support.v7.widget.RecyclerView.ViewHolder, position: number): void;
getItemCount(): number
};
class Adapter {
static extend(AdapterImpl): { new () }
}
class LayoutParams {
constructor(width: any, height: any);
}
class ViewHolder {
static extend: any;
}
}
class RecyclerView {
constructor(context: any);
setAdapter(Adapter): void;
setLayoutManager(LinearLayoutManager): void;
}
class LinearLayoutManager {
constructor(context: any);
}
}
}
基本上,名称空间可用于模拟嵌套的对象属性(例如android.view.xxx)。如果内部类是用Java定义的(Typescript似乎禁止嵌套class语句),这也是这种方式。
在实际使用类型的情况下,我还必须定义一个与名称空间同名的类android.view.ViewGroup。否则你会得到错误
没有出口会员xxx
,即使使用显式声明了类类型export(也没有必要,因为已经全局声明了名称空间)。
对于使用扩展本机Java类型的特殊情况extend,我为相关类定义了一个静态方法,例如static extend(AdapterImpl): { new () }
,其返回类型可以使用实例化new。
希望对其他类似问题有所帮助。
142、重写旧代码
答案:
诚然,问题涉及到cobol,它会根据您的需求做出任何特定的回答,如果您说“我们有一个旧的VB应用程序”或旧的C应用程序,则选择#3始终是正确的方法。
我曾在3家决定选择方案2的公司工作。第2位破产者试图为新系统付费,而仅从旧版本中获得收益,第3位确实非常接近。
行动3的另一个因素是,您必须保留多年来使用的所有旧错误修正程序。每次重写总是会引入越来越多的错误,部分是因为您希望快速完成重写,部分是因为您将用一种陌生的新语言编写它,部分是因为所有新代码都包含错误。
重构并替换旧应用程序的逻辑块,最终您将拥有一个漂亮的闪亮新应用程序。从GUI开始,以获得最安全的新方法。此外,当您用新内容重新编写应用程序时,更新的内容将是最酷的,新应用程序将过时,您将再次发布相同的问题!
143、如何在Android中以编程方式解压缩文件?
答案:
peno的版本进行了优化。性能的提高是可以察觉的。
private boolean unpackZip(String path, String zipname)
{
InputStream is;
ZipInputStream zis;
try
{
String filename;
is = new FileInputStream(path + zipname);
zis = new ZipInputStream(new BufferedInputStream(is));
ZipEntry ze;
byte[] buffer = new byte[1024];
int count;
while ((ze = zis.getNextEntry()) != null)
{
filename = ze.getName();
// Need to create directories if not exists, or
// it will generate an Exception...
if (ze.isDirectory()) {
File fmd = new File(path + filename);
fmd.mkdirs();
continue;
}
FileOutputStream fout = new FileOutputStream(path + filename);
while ((count = zis.read(buffer)) != -1)
{
fout.write(buffer, 0, count);
}
fout.close();
zis.closeEntry();
}
zis.close();
}
catch(IOException e)
{
e.printStackTrace();
return false;
}
return true;
}
144、NoClassDefFoundError-Eclipse和Android
答案:
更新ADT后出现此问题。
我将所有JAR文件存储在一个名为“ lib”的文件夹中,然后以普通的Eclipse方式将jars添加到构建路径中。直到我更新为止,这个工作正常。
更新之后,我得到了一个我可以清楚地看到它包含在jar中的类的NoClassDefFoundError(签出ReferencedLibraries类)。
解决方案是从构建路径中删除我的jar,然后将“ lib”文件夹重命名为“ libs”。这是一个蚂蚁惯例,似乎是新ADT在.apk文件中查找并包括库的方式。一旦执行此操作,一切正常。
145、如何在Android中将TextView添加到LinearLayout
答案:
尝试使用
LinearLayout linearLayout = (LinearLayout)findViewById(R.id.info);
...
linearLayout.addView(valueTV);
还请确保你正在创建的布局参数是LinearLayout.LayoutParams …
146、JSF 2.0文件上传
答案:
首先,这个(旧的)问答假设为JSF 2.0 / 2.1。从JSF 2.2开始,有了一个本机<h:inputFile>
组件,而无需第三方组件库。另请参阅如何使用JSF 2.2 <h:inputFile>
上传文件?保存的文件在哪里?
最简单的方法是将Tomahawk用于JSF 2.0。它提供了一个<t:inputFileUpload>
组件。
这是一个分步教程:
为Servlet 3.0和JSF 2.0创建一个空白的动态Web项目。在web.xml
必须遵守的Servlet 3.0规范,已经包含了JSF的servlet:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="YourProjectName" version="3.0">
<display-name>Your Project Name</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
在faces-config.xml
必须符合JSF 2.0规范:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
</faces-config>
下载适用于JSF 2.0的Tomahawk 1.1.10
。解压缩zip文件,转到/lib文件夹,然后将所有*.jar
文件复制到中/WEB-INF/lib
。
它是18页的文件,其中batik*.jar和xml*.jar
是不必要的单独使用t:inputFileUpload的组件。您可以将它们丢掉。
在中配置Tomahawk扩展过滤器web.xml
。它是负责处理multipart/form-data
请求的人员,该请求是能够通过HTTP发送文件所必需的。
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
请注意,<servlet-name>
必须完全匹配<servlet-name>
的FacesServlet
与您在definied web.xml
。
创建一个简单的Facelet upload.xhtml
:
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Tomahawk file upload demo</title>
</h:head>
<h:body>
<h:form enctype="multipart/form-data">
<t:inputFileUpload value="#{bean.uploadedFile}" />
<h:commandButton value="submit" action="#{bean.submit}" />
<h:messages />
</h:form>
</h:body>
</html>
注意上的enctype="multipart/form-data"
属性<h:form>
,这对于能够使用HTTP发送文件非常重要。
创建一个简单的托管bean com.example.Bean
:
package com.example;
import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FilenameUtils;
import org.apache.myfaces.custom.fileupload.UploadedFile;
@ManagedBean
@RequestScoped
public class Bean {
private UploadedFile uploadedFile;
public void submit() throws IOException {
String fileName = FilenameUtils.getName(uploadedFile.getName());
String contentType = uploadedFile.getContentType();
byte[] bytes = uploadedFile.getBytes();
// Now you can save bytes in DB (and also content type?)
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(String.format("File '%s' of type '%s' successfully uploaded!", fileName, contentType)));
}
public UploadedFile getUploadedFile() {
return uploadedFile;
}
public void setUploadedFile(UploadedFile uploadedFile) {
this.uploadedFile = uploadedFile;
}
}
应该的。通过http:// localhost:8080 / projectname / upload.xhtml
打开它。
关于您的具体问题:
我应该怎么做才能将文件从JSF传递到托管bean,然后将其转换为byte [](以便能够将其处理到EJB)?
上面已经回答了。
servlet如何帮助我?
它能够处理和控制HTTP请求/响应。在JSF环境中,FacesServlet已经完成了所有工作。
我需要一个servlet来做到这一点吗?
在JSF环境中,FacesServlet必选。但是API已经提供了它,您不需要自己编写。但是,为了能够从数据库下载文件,另一个servlet绝对有用。您可以在此处找到一个基本示例:用于提供静态内容的Servlet。
我也发现在某个博客中提到了servlets 3.0,但是我不知道我的工作环境是否正在使用它,如果我正在使用servlets 3.0(我正在使用JEE6)怎么办?
如果您使用的是Servlet 3.0容器,例如Glassfish 3,JBoss AS 6,Tomcat 7等,并且web.xml声明为Servlet 3.0,那么您肯定是在使用Servlet 3.0。Servlet 3.0是Java EE 6的一部分。
147、Eclipse控制台:检测警告和错误模式并使它们可单击
答案:
编辑: 我发现了一个插件,可以使外观更加美观:Sunshade Errorlink(向下滚动一点)。我不确定这到底有多灵活,但它提到了蚂蚁的支持。
我知道您可能想要一个实际的实现,但这是您想要的插件设计的一个粗略起点。如果有人想实现它,请在此处添加指向它的链接。如果我有空闲时间,我可能会自己做(哈!)😃
该规范假设控制台基于TextConsole,这似乎是合理的,它说:
支持正则表达式匹配和超链接的抽象文本控制台。
模式匹配侦听器可以通过控制台或通过org.eclipse.ui.console.consolePatternMatchListeners 扩展点进行注册。
我做了一些查找,该扩展点的规范具有以下示例:
<extension point="org.eclipse.ui.console.consolePatternMatchListener">
<consolePatternMatchListener
class="com.example.ExampleConsolePatternMatcher"
id="com.example.ExampleConsolePatternMatcher"
regex=".*foo.*">
<enablement>
<test
property="org.eclipse.ui.console.consoleTypeTest"
value="exampleConsole"/>
</enablement>
</consolePatternMatchListener>
</extension>
您将需要IPatternMatchListenerDelegate的API,然后应该能够使用TextConsole.addHyperlink创建所需的链接。
148、Android的换行小部件布局
答案:
你可以通过在build.gradle文件中添加依赖项来在项目中使用它:
dependencies {
compile 'com.google.android:flexbox:0.3.2'
}
我做了自己想要的布局,但是目前还很有限。欢迎提出意见和改进建议。
活动:
package se.fnord.xmms2.predicate;
impor