目录
一.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"));
}
}