1. java加载XML配置文件时报错 org.springframework.beans.factory.CannotLoadBeanClassException
xml的名字写错了,applicationContext.xml
2. java读取配置文件的方法(xml)
#include <XMLDoc.hpp>
——相关说明
_di_IXMLDocument 为模板类
typedef System::DelphiInterface< IXMLDocument > _di_IXMLDocument;
_di_IXMLNode
typedef System::DelphiInterface< IXMLNode > _di_IXMLNode;
_di_IXMLNodeList 同
——类方法
//设置参数
void TXXX::setOptions(String name,String value){
//创建文档对象
_di_IXMLDocument XMLDoc = LoadXMLDocument(L"文件路径");
XMLDoc->Active=true;
//文档根节点
_di_IXMLNode root = XMLDoc->DocumentElement;
//想要查找节点
_di_IXMLNode tempNode;
//调用搜索方法
searchXml(name,root,tempNode);
// 处理
if(tempNode!=NULL)
tempNode->SetText(value);
XMLDoc->SaveToFile(L"文件路径");
}
//递归搜索参数节点树
void TXXX::searchXml(String name,_di_IXMLNode &Parent_Node,_di_IXMLNode& tempNode){
_di_IXMLNode Child_Node; //子结点
//子节点列表
_di_IXMLNodeList list = Parent_Node->ChildNodes;
for(int i=0;i<list->Count;i++)
{
Child_Node = list->Get(i);
//递归结束条件
if(Child_Node->GetNodeName()==name)
{
tempNode = Child_Node;
break;
}
else
{
//递归函数
searchXml(name,Child_Node,tempNode);
}
}
}
3. JAVA 读取XML文件
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlTester {
public static void main(String[] args) throws DocumentException {
// 使用了dom4j解析xml
// 读取目录下用来测试的test.xml文件,取得xml主内容
Document document = new SAXReader().read("src/abc/test.xml").getDocument();
int i = 1;
// 遍历文档根节点(wuxialist)下的子节点列表,即txtbook节点的集合
for(Element txtbook : (List<Element>)document.getRootElement().elements()){
//取得txtbook节点下的name节点的内容
System.out.println(i+"."+txtbook.element("name").getText());
i++; //原来这里少些了这一行,先补上
}
}
}
4. spring中读取xml配置文件、获取bean
读取xml文件
/**
* 利用XmlBeanFactory(Resource resource)
* 这里Resource必须是xml格式
* Resource包括 AbstractResource ClassPathResource FileSystemResource
* InputStreamResource ServletContextResource UrlResource
没滚*/
/*
* 利用 InputStreamResource(InputStream inputStream)
* 要将applicationContext xml放在项目根目录下
*/
InputStream is = null;
try {
is = new FileInputStream( applicationContext xml );
} catch (FileNotFoundException e) {
e printStackTrace();
}
Resource resource = new InputStreamResource(is);
BeanFactory factory = new XmlBeanFactory(resource);
UserDao userDao = (UserDao)factory getBean( userDao );
/*
* 利用 Properties
* 要将bean properties放在类路径--源文件夹(src)目录下
*/
具体见
利用
可以从classpath中读取XML文件
( ) ApplicationContext context = new ( applicationContext xml );
UserDao userDao = (UserDao)context getBean( userDao );
( ) resource = new (new String[]{ applicationContext ibatis oracle xml applicationContext xml applicationContext data oracle xml });
BeanFactory factory = resource;
UserDao userDao = (UserDao) factory getBean( userDao );
利用ClassPathResource
可以从枯铅余classpath中读取XML文件激搜
Resource cr = new ClassPathResource( applicationContext xml );
BeanFactory bf=new XmlBeanFactory(cr);
UserDao userDao = (UserDao)bf getBean( userDao );
加载一个xml文件 springframewonfig PropertyPlaceholderConfigurer不起作用
.利用XmlWebApplicationContext读取
从Web应用程序的文件架构中 指定相对位置来读取定义文件
XmlWebApplicationContext 的建构子无法带参数 参考API文件会发现 预设的location会指向/WEB INF/applicationContext xml档案 使用其 public static属性DEFAULT_CONFIG_LOCATION可取得此预设档名 由于我使用MyEclipse 预设会多一个 /WebRoot 的 目录在WEB INF之前 因此若在web project里有一些与web无关的程式要使用context时(例如处理一些MVC架构中的 M 的部份) 就无法使用 XmlWebApplicationContext来读取bean定义档 因为default location会差一个 WebRoot 的目录
即 使在web xml里面 在DispatcherServlet定义中重新定义contextConfigLocation也一样(此定义可以 override掉XmlWebApplicationContext中的DEFAULT_CONFIG_LOCATION值) 因为与web无关的程式 并不会经过web xml的定义档设定 目前我还没试成功过XmlWebApplicationContext取得bean定义档 使用 反而会快一些
XmlWebApplicationContext ctx = new XmlWebApplicationContext();
ctx setConfigLocations(new String[] { /WEB INF/ applicationContext xml );
ctx setServletContext(pageContext getServletContext());
ctx refresh();
UserDao userDao = (UserDao ) ctx getBean( userDao );
利用FileSystemResource读取
Resource rs = new FileSystemResource( D:/tomcat/webapps/test/WEB INF/classes/ applicationContext xml );
BeanFactory factory = new XmlBeanFactory(rs);
UserDao userDao = (UserDao )factory getBean( userDao );
值得注意的是 利用FileSystemResource 则配置文件必须放在project直接目录下 或者写明绝对路径 否则就会抛出找不到文件的异常
.利用读取
可以指定XML定义文件的相对路径或者绝对路径来读取定义文件
方法一
String[] path={ WebRoot/WEB INF/applicationContext xml WebRoot/WEB INF/applicationContext_task xml };
ApplicationContext context = new (path);
方法二
String path= WebRoot/WEB INF/applicationContext* xml ;
ApplicationContext context = new (path);
方法三
ApplicationContext ctx =
new ( classpath:地址 );
没有classpath的话就是从当前的工作目录
*******************************************************************************
** 分割一下 **
*******************************************************************************
获取Spring框架管理的类实例的方法有多种 如下
方法一 在初始化时保存ApplicationContext对象
ApplicationContext ac = new ( applicationContext xml );
ac getBean( beanId );
说明
这种方式适用于采用Spring框架的独立应用程序 需要程序通过配置文件手工初始化Spring的情况
方法二 通过Spring提供的工具类获取ApplicationContext对象
代码
import sprntext support WebApplicationContextUtils;
ApplicationContext ac =
WebApplicationContextUtils (ServletContext sc)
ApplicationContext ac = WebApplicationContextUtils getWebApplicationContext(ServletContext
sc)
ac getBean( beanId );
ac getBean( beanId );
说明
这种方式适合于采用Spring框架的B/S系统 通过ServletContext对象获取ApplicationContext对象 然后
在通过它获取需要的类实例
上面两个工具方式的区别是 前者在获取失败时抛出异常 后者返回null
方法三 继承自抽象类ApplicationObjectSupport
说明
抽象类ApplicationObjectSupport提供getApplicationContext()方法 可以方便的获取到 ApplicationCont
ext Spring初始化时 会通过该抽象类的setApplicationContext(ApplicationContext
context)方法将ApplicationContext 对象注入
方法四 继承自抽象类WebApplicationObjectSupport
说明
类似上面方法 调用getWebApplicationContext()获取WebApplicationContext
方法五 实现接口ApplicationContextAware
说明
实现该接口的setApplicationContext(ApplicationContext context)方法 并保存ApplicationContext 对
象 Spring初始化时 会通过该方法将ApplicationContext 对象注入
以上方法适合不同的情况 请根据具体情况选用相应的方法
这里值得提一点的是 系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了 因为这些类是知
道它们是运行在Spring框架上的 因此 系统中 应该尽量的减少这类应用 使系统尽可能的独立于当前运
行环境 尽量通过DI的方式获取需要的服务提供者
lishixin/Article/program/Java/ky/201311/28302
5. java加载spring的XML配置文件,报org.springframework.beans.factory.BeanDefinitionStoreException
file://config/ws/applicationContexte.xml
路径没有找到
6. java使用SSM框架做的案例,启动Tomcat后始终报错,提示无法加载applicationContext.xml配置文件!
你现在applicationContext.xml的所在路径是:src/main/resources/applicationContext.xml,你的配置文件classpath:applicationContext.xml代表的路径是src/applicationContext,所以找不到。
7. java 读取和修改本地xml配置文件
你看一下这个吧.不需要导入特别的包,直接用API中的DOM方式解析,
并保存的.
-------------------------------------------------------------------------------------------------------
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class XmlApp extends JFrame implements ActionListener, ItemListener {
private JTextField textField;
private JComboBox comboBox;
private Map<String, String> content = null;
private Document doc;
private String file = "H:\\content.xml";
public XmlApp() {
getContentPane().setLayout(null);
comboBox = new JComboBox();
comboBox.setBounds(110, 10, 112, 21);
comboBox.addItemListener(this);
getContentPane().add(comboBox);
textField = new JTextField();
textField.setBounds(110, 41, 112, 21);
getContentPane().add(textField);
textField.setColumns(10);
JButton btnSave = new JButton("Save");
btnSave.setBounds(252, 40, 93, 23);
btnSave.addActionListener(this);
getContentPane().add(btnSave);
JLabel lblNode = new JLabel("Node");
lblNode.setBounds(10, 13, 90, 15);
getContentPane().add(lblNode);
JLabel lblValue = new JLabel("value");
lblValue.setBounds(10, 44, 90, 15);
getContentPane().add(lblValue);
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setSize(400, 120);
setLocationRelativeTo(null);
setVisible(true);
}
public void init() {
content = new HashMap<String, String>();
DocumentBuilderFactory factory;
try {
factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(file);
loopNodes(doc.getFirstChild(), "", false);
textField.setText(content.get(comboBox.getSelectedItem()));
} catch (Exception e) {
System.out.println("e = " + e.getMessage());
}
}
public void loopNodes(Node node, String name, boolean isSave) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node tmp = list.item(i);
if (tmp instanceof Element) {
if (tmp.hasChildNodes()) {
loopNodes(tmp, tmp.getNodeName(), isSave);
}
}
if (tmp instanceof Text) {
String value = tmp.getNodeValue();
if (value != null && !"".equals(value.trim())) {
if (isSave) {
tmp.setNodeValue(content.get(name));
} else {
comboBox.addItem(name);
content.put(name, value.trim());
}
}
}
}
}
public static void main(String[] args) {
new XmlApp();
}
public void actionPerformed(ActionEvent e) {
String value = textField.getText();
content.put((String) comboBox.getSelectedItem(), value);
loopNodes(doc, "", true);
try {
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(file));
transformer.transform(source, result);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
textField.setText(content.get(e.getItem()));
}
}
}
8. JAVA技术:XML配置文件的读取处理
Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?
当然不是,现在已经有一个新趋势,java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式。(Java中也有Propertiesy这样的类专门处理这样的属性配置文件)。使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋旦饥势用XML武装起来。
现在关键是如何读取XML配置模余返文件?有好几种XML解析器:主要有DOM和SAX ,这些区别网上文章介绍很多。
在apache的XML项目组中,目前有Xerces Xalan Cocoon几个开毁让发XML相关技术的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器。
好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧。
在我们的程序中,通常要有一些根据主机环境确定的变量。比如数据库访问用户名和密码,不同的主机可能设置不一样。只要更改XML配置文件,就可以正常运行。
localhost
sqlname
username
password
上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下。
我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用。
目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件。这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的。如果你使用JDK1.4 ,可以参考 使用SAX处理XML文档 一文。这里的程序是根据其改进并且经过实践调试得来的。
对上面myenv.xml读取的Java程序:
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;
//使用DefaultHandler的好处 是 不必陈列出所有方法,
public class ConfigParser extends DefaultHandler {
////定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;
private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
//构建器初始化props
public ConfigParser() {
this.props = new Properties();
}
public Properties getProps() {
return this.props;
}
//定义开始解析元素的方法. 这里是将中的名称xxx提取出来.
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName =qName;
}
//这里是将之间的值加入到currentValue
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue.append(ch, start, length);
}
//在遇到结束后,将之前的名称和值一一对应保存在props中
public void endElement(String uri, String localName, String qName) throws SAXException {
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
}
上面的这个解析程序比较简单吧? 其实解析XML就是这么简单。
现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来。但是这只是在在解析器内部,我们的程序还不能访问。需要再编制一个程序。
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import .URL;
public class ParseXML{
//定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;
//这里的props
public Properties getProps() {
return this.props;
}
public void parse(String filename) throws Exception {
//将我们的解析器对象化
ConfigParser handler = new ConfigParser();
//获取SAX工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
//获取SAX解析
SAXParser parser = factory.newSAXParser();
//得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes
//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);
try
{
//将解析器和解析对象myenv.xml联系起来,开始解析
parser.parse(confURL.toString(), handler);
//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了
props = handler.getProps();
}finally{
factory=null;
parser=null;
handler=null;
}
}
}
由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了。
9. 关于java中xml文件配置的路径问题
嗯,是过滤,在这个里面实现了些什么?
这个问题太大
了,而且这是struts2,更加复杂。在里面做了很多事情,最起码的
至少有加载你的struts.xml配置文件,解析你的配置文件,然后通过你的请求路径,找到相应的action,封装你的表单数据等等,还有很多过滤器。。。struts2不是一两句能说完的,看看源代码吧,如果看得懂,就知道做了什么了
10. Java读取配置文件的几种方法
在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小总结一下,主要叙述的是spring读取配置文件的方法。
一、读取xml配置文件
(一)新建一个java bean
package chb.demo.vo;
public class HelloBean {
private String helloWorld;
public String getHelloWorld() {
return helloWorld;
}
public void setHelloWorld(String helloWorld) {
this.helloWorld = helloWorld;
}
}
(二)构造一个配置文件
?xml version="1.0" encoding="UTF-8"?
!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ""
beans
bean id="helloBean" class="chb.demo.vo.HelloBean"
property name="helloWorld"
valueHello!chb!/value
/property
/bean
/beans
(三)读取xml文件
1.利用
ApplicationContext context = new ("beanConfig.xml");
HelloBean helloBean = (HelloBean)context.getBean("helloBean");
System.out.println(helloBean.getHelloWorld());
2.利用FileSystemResource读取
Resource rs = new FileSystemResource("D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/beanConfig.xml");
BeanFactory factory = new XmlBeanFactory(rs);
HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
System.out.println(helloBean.getHelloWorld());
值得注意的是:利用FileSystemResource,则配置文件必须放在project直接目录下,或者写明绝对路径,否则就会抛出找不到文件的异常。
二、读取properties配置文拿镇件
这里介绍两种启敬技术:利用spring读取properties 文件和利用java.util.Properties读取
(一)利用spring读取properties 文件
我们还利用上面的HelloBean.java文件,构造如下beanConfig.properties文件:
helloBean.class=chb.demo.vo.HelloBean
helloBean.helloWorld=Hello!chb!
属性文件中的"helloBean"名称即是Bean的别名设定,.class用于指定类来消旁粗源。
然后利用org.springframework.beans.factory.support.来读取属性文件
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
reader = new (reg);
reader.loadBeanDefinitions(new ClassPathResource("beanConfig.properties"));
BeanFactory factory = (BeanFactory)reg;
HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
System.out.println(helloBean.getHelloWorld());
(二)利用java.util.Properties读取属性文件
比如,我们构造一个ipConfig.properties来保存服务器ip地址和端口,如:
ip=192.168.0.1
port=8080
则,我们可以用如下程序来获得服务器配置信息:
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("ipConfig.properties");
Properties p = new Properties();
try {
p.load(inputStream);
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("ip:"+p.getProperty("ip")+",port:"+p.getProperty("port"));