J2EE基础:xml的解析

目录

一.Java中配置文件的三种配置及读取方式

1.配置文件有啥好处?

2.各个地方的位置有啥讲究?

3.WIN-INF安全路径

 二.dome4j的使用

​编辑

 三.xpath的使用

1.语法

2.案例

四.案例

1.获取所有action中的type的值

2.获取第二个action中的type的值

3.获取第二个action的所有forward的path

4.获取第二个action的第二个forward的path


一.Java中配置文件的三种配置及读取方式

1.配置文件有啥好处?

只有关于点后面的都是配置文件

这些是最常见的:.properties/.xml/.yml

文件配置数据库连接属性

 

①.使代码更加灵活,②.维护性更高

2.各个地方的位置有啥讲究?

①.同一层级:方便同步编码,或者同步编辑    Mybatis,就是大部分需要统一编辑的放在同一目录下

这里你不管你要连接哪个数据库,只要把它解开就行了,我们现在就是有mysql

#oracle9i
#driver=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#pwd=123


#sql2005
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://localhost:1433;DatabaseName=test1
#user=sa
#pwd=123


#sql2000
#driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
#url=jdbc:microsoft:sqlserver://localhost:1433;databaseName=unit6DB
#user=sa
#pwd=888888


#mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8&useSSL=false
user=root
pwd=123456




②.根目录: 一般不错频繁更改      /     就是根目录 把db.properties放到刚刚创建里面去

③.web-inf:安全目录

3.WIN-INF安全路径

案例1:输入网址是否能访问到a.jsp界面   

答:里面的文件不能访问,你想访问你只能通过内部的程序间接的去访问,所以它的安全性要比我们不放目录里面的安全性高。如果我们配置文件放在WIN-INF的目录之外,那么别人就会直接访问到。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

aaa 
http://locathost:8080/T280_xml/WEB-INF/a.jsp

</body>
</html>

现在就想去访问这个界面怎么去访问呢?

package parse;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/a")
public class WebInfServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getRequestDispatcher("/WEB-INF/a.jsp").forward(req, resp);
	}

}

案例2:db.properties里的最初数据

uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
driver_Class=com.mysql.jdbc.Driver

initPoolSize=5
maxPoolSize=20

怎么样去拿取里面的数据呢?

package parse;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 	读取各个位置文件
 * @author JWJ
 *
 * @date 2022年6月13日 下午7:55:43
 */
public class Demo1 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo1.class.getResourceAsStream("db.properties");
//		.properties文件有一个专门类解析
		Properties p = new Properties();
//		此时,p 就加载了  db.properties中的所以信息	
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
		
		
		
	}

}

结果就为: 

同包: 

就会出错:出现空指针异常 

 

 根目录:

WEB-INF:

代码块: 

package parse;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/a")
public class WebInfServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		req.getRequestDispatcher("/WEB-INF/a.jsp").forward(req, resp);
//		拿到serlvet上下文
		InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
		Properties p = new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}

}

 二.dom4j的使用

attributeValue:拿到属性值

getText:拿到标签里的内容

selectSingleNode:拿到单个

selectNodes :根据标签名,返回单个标签,通常用于已经知晓该标签只会出现一次

package parse;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Demo2 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo2.class.getResourceAsStream("students.xml");
		SAXReader sr = new SAXReader();
//		将配置文件中的所有内容获取到了
		Document doc = sr.read(in);
		
//		selectNodes  根据标签名,返回标签集合
//		System.out.println(doc.asXML());
//		List<Element> studentsEles = doc.selectNodes("students");
//		System.out.println(studentsEles.size());    //    1  所以不需要集合
//		List<Element> studentEles = studentsEles.get(0).selectNodes("studnet");
//		System.out.println(studentEles.size());       //    0
		
//		selectNodes 根据标签名,返回单个标签,通常用于已经知晓该标签只会出现一次
		Element studentsEle = (Element) doc.selectSingleNode("students");
		List<Element> studntsEls = studentsEle.selectNodes("student");
		for (Element stuEle : studntsEls) {
			System.out.println(stuEle.attributeValue("sid"));// attributeValue是拿到属性值
			System.out.println(stuEle.selectSingleNode("name").getText());// getText拿到标签里的内容
		}
		
	}

}

结果为: 

 三.xpath的使用

1.语法

①./   定位路径,代表层级,代表查找

②.@    属性,精准定位

2.案例

①.浏览器Xpath使用

*[@id="__layout"]/div/div[2]/section/div[5]/div[2]/div[2]/ul/li[1]/div[2]/p[1]

②.查找s002学生姓名

代码块: 

package parse;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Demo2 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo2.class.getResourceAsStream("students.xml");
		SAXReader sr = new SAXReader();
//		将配置文件中的所有内容获取到了
		Document doc = sr.read(in);
		
//		selectNodes  根据标签名,返回标签集合
//		System.out.println(doc.asXML());
//		List<Element> studentsEles = doc.selectNodes("students");
//		System.out.println(studentsEles.size());
//		List<Element> studentEles = studentsEles.get(0).selectNodes("studnet");
//		System.out.println(studentEles.size());
		
//		selectNodes 根据标签名,返回单个标签,通常用于已经知晓该标签只会出现一次
		Element studentsEle = (Element) doc.selectSingleNode("students");
		List<Element> studntsEls = studentsEle.selectNodes("student");
		for (Element stuEle : studntsEls) {
			System.out.println(stuEle.attributeValue("sid"));// attributeValue是拿到属性值
			System.out.println(stuEle.selectSingleNode("name").getText());// getText拿到标签里的内容
		}
		
	}

}

四.案例

这个就是根据这个表来完成下面的案例

代码块:

<?xml version="1.0" encoding="UTF-8"?>
	<!--
		config标签:可以包含0~N个action标签
	-->
<config>
	<!--
		action标签:可以饱含0~N个forward标签
		path:以/开头的字符串,并且值必须唯一 非空
		type:字符串,非空
	-->
	<action path="/regAction" type="test.RegAction">
		<!--
			forward标签:没有子标签; 
			name:字符串,同一action标签下的forward标签name值不能相同 ;
			path:以/开头的字符串
			redirect:只能是false|true,允许空,默认值为false
		-->
		<forward name="failed" path="/reg.jsp" redirect="false" />
		<forward name="success" path="/login.jsp" redirect="true" />
	</action>

	<action path="/loginAction" type="test.LoginAction">
		<forward name="failed" path="/login.jsp" redirect="false" />
		<forward name="success" path="/main.jsp" redirect="true" />
	</action>
</config>

1.获取所有action中的type的值

代码块:

package parse;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * 	案例1:获取所有action中的type的值
 * @author JWJ
 *
 * @date 2022年6月14日 上午10:35:03
 */
public class Demo4 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo4.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		Element configEle = (Element) doc.selectSingleNode("config");
		List<Element> configEles = configEle.selectNodes("action");
		for (Element conEle : configEles) {
			System.out.println(conEle.attributeValue("type"));//attributeValue拿到的是属性值
		}
		
	}

}

结果:  

2.获取第二个action中的type的值

package parse;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * 2.获取第二个action中的type的值
 * @author JWJ
 *
 * @date 2022年6月14日 上午10:35:50
 */
public class Demo5 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo5.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
//		第一种方式
		Element configEle = (Element)doc.selectSingleNode("config/action[2]");
		System.out.println(configEle.attributeValue("type"));
//		第二种方式
//		List<Element> configEles = configEle.selectNodes("action[2]");
//		for (Element conEle : configEles) {
//			System.out.println(conEle.attributeValue("type"));
//		}
		
		
	}

}

3.获取第二个action的所有forward的path

package parse;

import java.io.InputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * 3.获取第二个action的所有forward的path
 * @author JWJ
 *
 * @date 2022年6月14日 上午10:36:32
 */
public class Demo6 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo6.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		Element configEle = (Element) doc.selectSingleNode("config/action[2]");
		List<Element> configEles = configEle.selectNodes("forward");
		for (Element conEle : configEles) {
			System.out.println(conEle.attributeValue("path"));
		}
	}

}

  

4.获取第二个action的第二个forward的path

package parse;

import java.io.InputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

/**
 * 4.获取第二个action的第二个forward的path
 * @author JWJ
 *
 * @date 2022年6月14日 上午10:59:55
 */
public class Demo7 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo7.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		Element configEle = (Element)doc.selectSingleNode("config/action[2]/forward[2]");
		System.out.println(configEle.attributeValue("path"));
		
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值