首页
友链
关于
免责声明
Search
1
王者营地战绩数据王者荣耀查询网页源码
6,255 阅读
2
群晖Active Backup for Business套件备份Linux服务器教程
4,387 阅读
3
影视分享
4,317 阅读
4
(亲测)Jrebel激活破解方式2019-08-21
4,293 阅读
5
centos7 安装及卸载 jekenis
3,576 阅读
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
登录
Search
标签搜索
docker
springboot
Spring Boot
java
linux
Shiro
Graphics2D
图片
游戏账号交易
Mybatis
Spring Cloud
centos
脚本
Web Station
群辉
王者营地
战绩查询
平台对接
Spring Cloud Alibaba
nacos
绿林寻猫
累计撰写
249
篇文章
累计收到
26
条评论
首页
栏目
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
页面
友链
关于
免责声明
搜索到
237
篇与
文章
的结果
2021-12-08
Hibernate(三):多对多(many-to-many)
以下是多对多的基础配置 -- 多对多-- 用户CREATE TABLE users(uid int PRIMARY KEY auto_increment, -- 用户iduname VARCHAR(50) not null -- 用户名);-- 角色CREATE TABLE roles(rid int PRIMARY KEY auto_increment, -- 角色idrname VARCHAR(50) not null -- 角色名);-- 用户角色关系表CREATE TABLE relation(uid int not null, -- 用户idrid int not null -- 角色id); Roles.hbm.xml<hibernate-mapping> <class name="club.lygangdai.pojo.Roles" table="roles"> <id name="rid" type="int"> <column name="rid" /> <generator class="native" /> </id> <property name="rname" type="java.lang.String"> <column name="rname" /> </property> <set name="users" table="relation" > <key column="rid"></key> <many-to-many class="club.lygangdai.pojo.Users" column="uid" /> </set> </class> </hibernate-mapping> Roles.javapackage club.lygangdai.pojo; import java.util.HashSet; import java.util.Set; /** * @ClassName: Roles * @Description: TODO(角色表) * @author Uncle * @date 2018年8月9日 下午7:11:39 * */ public class Roles { private int rid; private String rname; private Set<Users> users = new HashSet<Users>(); /** * @Description: TODO(这里用一句话描述这个类的作用) * @param rid * @param rname */ public Roles(int rid, String rname) { super(); this.rid = rid; this.rname = rname; } /** * @Description: TODO(这里用一句话描述这个类的作用) */ public Roles() { super(); } /** * @return rid */ public int getRid() { return rid; } /** * @param rid 要设置的 rid */ public void setRid(int rid) { this.rid = rid; } /** * @return rname */ public String getRname() { return rname; } /** * @param rname 要设置的 rname */ public void setRname(String rname) { this.rname = rname; } /** * @return users */ public Set<Users> getUsers() { return users; } /** * @param users 要设置的 users */ public void setUsers(Set<Users> users) { this.users = users; } /* (非 Javadoc) * @Title: toString * @Description: TODO(这里用一句话描述这个方法的作用) * @return * @see java.lang.Object#toString() */ @Override public String toString() { return "Roles [rid=" + rid + ", rname=" + rname + "]"; } } Users.hbm.xml<hibernate-mapping> <class name="club.lygangdai.pojo.Users" table="users"> <id name="uid" type="int"> <column name="uid" /> <generator class="native" /> </id> <property name="uname" type="java.lang.String"> <column name="uname" /> </property> <set name="roles" table="relation" cascade="all-delete-orphan" inverse="true" > <key> <column name="uid" /> </key> <many-to-many class="club.lygangdai.pojo.Roles" column="rid"/> </set> </class> </hibernate-mapping> Users.javapackage club.lygangdai.pojo; import java.util.HashSet; import java.util.Set; /** * @ClassName: Users * @Description: TODO(用户表) * @author Uncle * @date 2018年8月9日 下午7:10:23 * */ public class Users { private int uid; private String uname; private Set<Roles> roles = new HashSet<Roles>(); /** * @Description: TODO(这里用一句话描述这个类的作用) * @param uid * @param uname */ public Users(int uid, String uname) { super(); this.uid = uid; this.uname = uname; } /** * @Description: TODO(这里用一句话描述这个类的作用) */ public Users() { super(); } /** * @return uid */ public int getUid() { return uid; } /** * @param uid 要设置的 uid */ public void setUid(int uid) { this.uid = uid; } /** * @return uname */ public String getUname() { return uname; } /** * @param uname 要设置的 uname */ public void setUname(String uname) { this.uname = uname; } /** * @return roles */ public Set<Roles> getRoles() { return roles; } /** * @param roles 要设置的 roles */ public void setRoles(Set<Roles> roles) { this.roles = roles; } /* (非 Javadoc) * @Title: toString * @Description: TODO(这里用一句话描述这个方法的作用) * @return * @see java.lang.Object#toString() */ @Override public String toString() { return "Users [uid=" + uid + ", uname=" + uname + "]"; } } hibernate.cfg.xml<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <property name="hibernate.connection.username">root</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping resource="club/lygangdai/pojo/Roles.hbm.xml"/> <mapping resource="club/lygangdai/pojo/Users.hbm.xml"/> </session-factory> </hibernate-configuration>
2021年12月08日
144 阅读
0 评论
0 点赞
2021-12-08
面向对象的特征有哪些方面?
面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征。封装封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义成私有的,只有这个类自己的方法才可以访问到这些成员变量,这就基本上实现对象的封装,就很容易找出要分配到这个类上的方法了,就基本上算是会面向对象的编程了。例如,人要在黑板上画圆,这一共涉及三个对象:人、黑板、圆,画圆的方法要分配给哪个对象呢?由于画圆需要使用到圆心和半径,圆心和半径显然是圆的属性,如果将它们在类中定义成了私有的成员变量,那么,画圆的方法必须分配给圆,它才能访问到圆心和半径这两个属性,人以后只是调用圆的画圆方法、表示给圆发给消息而已,画圆这个方法不应该分配在人这个对象上,这就是面向对象的封装性,即将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由这个对象自己的行为(方法)来读取和改变。一个更便于理解的例子就是,司机将火车刹住了,刹车的动作是分配给司机,还是分配给火车,显然,应该分配给火车,因为司机自身是不可能有那么大的力气将一个火车给停下来的,只有火车自己才能完成这一动作,火车需要调用内部的离合器和刹车片等多个器件协作才能完成刹车这个动作,司机刹车的过程只是给火车发了一个消息,通知火车要执行刹车动作而已。抽象抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前目标有关的方面。抽象包括行为抽象和状态抽象两个方面。例如,定义一个Person类,如下: class Person{ String name; int age;} 人本来是很复杂的事物,有很多方面,但因为当前系统只需要了解人的姓名和年龄,所以上面定义的类中只包含姓名和年龄这两个属性,这就是一种抽像,使用抽象可以避免考虑一些与目标无关的细节。我对抽象的理解就是不要用显微镜去看一个事物的所有方面,这样涉及的内容就太多了,而是要善于划分问题的边界,当前系统需要什么,就只考虑什么。继承在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。多态多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态性增强了软件的灵活性和扩展性。例如,下面代码中的UserDao是一个接口,它定义引用变量userDao指向的实例对象由daofactory.getDao()在执行的时候返回,有时候指向的是UserJdbcDao这个实现,有时候指向的是UserHibernateDao这个实现,这样,不用修改源代码,就可以改变userDao指向的具体类实现,从而导致userDao.insertUser()方法调用的具体代码也随之改变,即有时候调用的是UserJdbcDao的insertUser方法,有时候调用的是UserHibernateDao的insertUser方法: UserDao userDao = daofactory.getDao(); userDao.insertUser(user); 比喻:人吃饭,你看到的是左手,还是右手?
2021年12月08日
48 阅读
0 评论
0 点赞
2021-12-08
获得页面地址栏传参的值 中文不乱码
//获得页面地址栏传参的值 ( index.jsp?id=123)function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = encodeURI(window.location.search).substr(1).match(reg); if(r!=null)return decodeURI(unescape(r[2])); return null;}//id为页面传值的名称var id = GetQueryString("id");console.log(id); //输出的值为123
2021年12月08日
164 阅读
0 评论
0 点赞
2021-12-08
论web开发中一些标签属性命名规则的重要性
在平时做项目时给页面标签赋值或者拿值等操作时,都会根据对应的id或者name、class或者通过jquery 的其他方式来操作。不过在一些很平常的一些操作来说,命名可能只是给标签赋予一个身份,指定一个名称,并没有考虑太多。 不过在一些特殊的情况下时,一个适应当下操作的命名规则很重要。 例如曾经我碰到一个进度报表: 这个报表需要统计每个不同类型(新户、分户.....)的工单对应流程(用户申请....)的数量,可能有些会调用很多的查询去统计每个的数量。其实在一些业务需求下,根据一些已存在的特殊性可以很方便的进行操作。就比如这个工单的类型最开始的时候已经定义了用什么指代它,假设1~7对应每一个工单,而流程步骤也是对应-1~8。当我想到这一步的时候,我只需要从数据库拿出三个列的数据:统计数、工单类型、流程,一个统计加分组的视图完全可以做到。 既然能拿到所有的对应数据了,那么在标签命名这一块其实根据这三个列就很好来命名了 如:id='s1o1',id='s1o2' 这两个分别对应的是新户工单的新户申请和分户申请的工单申请, <thead> <tr> <th>进度</th> <th width="100">新户</th> <th width="100">分户</th> <th width="100">过户</th> <th width="100">代扣</th> <th width="100">换表</th> <th width="100">重签</th> <th width="100">销户</th> <th width="100">总数</th> </tr> </thead> <tbody> <tr> <td class="center item">01 用户申请</td> <td class="center num" id="s1o1">0</td> <td class="center num" id="s1o2">0</td> <td class="center num" id="s1o3">0</td> <td class="center num" id="s1o4">0</td> <td class="center num" id="s1o5">0</td> <td class="center num" id="s1o6">0</td> <td class="center num" id="s1o7">0</td> <td class="center cnt num" id="s1oo">0</td> </tr> <tr> <td class="center item">02 初步审核</td> <td class="center num" id="s2o1">0</td> <td class="center num" id="s2o2">0</td> <td class="center num" id="s2o3">0</td> <td class="center num" id="s2o4">0</td> <td class="center num" id="s2o5">0</td> <td class="center num" id="s2o6">0</td> <td class="center num" id="s2o7">0</td> <td class="center cnt num" id="s2oo">0</td> </tr> <tr> <td class="center item">03 交施工费</td> <td class="center num" id="s3o1">0</td> <td class="center num" id="s3o2">0</td> <td class="center num" id="s3o3"></td> <td class="center num" id="s3o4"></td> <td class="center num" id="s3o5">0</td> <td class="center num" id="s3o6"></td> <td class="center num" id="s3o7"></td> <td class="center cnt num" id="s3oo">0</td> </tr> <tr> <td class="center item">04 水费清算</td> <td class="center num" id="s4o1"></td> <td class="center num" id="s4o2">0</td> <td class="center num" id="s4o3"></td> <td class="center num" id="s4o4"></td> <td class="center num" id="s4o5"></td> <td class="center num" id="s4o6"></td> <td class="center num" id="s4o7">0</td> <td class="center cnt num" id="s4oo">0</td> </tr> <tr> <td class="center item">05 供水协议</td> <td class="center num" id="s5o1">0</td> <td class="center num" id="s5o2">0</td> <td class="center num" id="s5o3"></td> <td class="center num" id="s5o4"></td> <td class="center num" id="s5o5"></td> <td class="center num" id="s5o6">0</td> <td class="center num" id="s5o7"></td> <td class="center cnt num" id="s5oo">0</td> </tr> <tr> <td class="center item">06 施工竣工</td> <td class="center num" id="s6o1">0</td> <td class="center num" id="s6o2">0</td> <td class="center num" id="s6o3"></td> <td class="center num" id="s6o4"></td> <td class="center num" id="s6o5">0</td> <td class="center num" id="s6o6"></td> <td class="center num" id="s6o7"></td> <td class="center cnt num" id="s6oo">0</td> </tr> <tr> <td class="center item">07 通水停水</td> <td class="center num" id="s7o1">0</td> <td class="center num" id="s7o2">0</td> <td class="center num" id="s7o3"></td> <td class="center num" id="s7o4"></td> <td class="center num" id="s7o5">0</td> <td class="center num" id="s7o6"></td> <td class="center num" id="s7o7">0</td> <td class="center cnt num" id="s7oo">0</td> </tr> <tr> <td class="center item">08 档案存档</td> <td class="center num" id="s8o1">0</td> <td class="center num" id="s8o2">0</td> <td class="center num" id="s8o3">0</td> <td class="center num" id="s8o4">0</td> <td class="center num" id="s8o5">0</td> <td class="center num" id="s8o6">0</td> <td class="center num" id="s8o7">0</td> <td class="center cnt num" id="s8oo">0</td> </tr> <tr class="todo"> <td class="center item"> 待办总数</td> <td class="center num" id="o1">0</td> <td class="center num" id="o2">0</td> <td class="center num" id="o3">0</td> <td class="center num" id="o4">0</td> <td class="center num" id="o5">0</td> <td class="center num" id="o6">0</td> <td class="center num" id="o7">0</td> <td class="center cnt num" id="oo">0</td> </tr> <tr> <td class="center item"> 工单完成</td> <td class="center num" id="s0o1">0</td> <td class="center num" id="s0o2">0</td> <td class="center num" id="s0o3">0</td> <td class="center num" id="s0o4">0</td> <td class="center num" id="s0o5">0</td> <td class="center num" id="s0o6">0</td> <td class="center num" id="s0o7">0</td> <td class="center cnt num" id="s0oo">0</td> </tr> <tr> <td class="center item"> 工单终止</td> <td class="center num" id="s-1o1">0</td> <td class="center num" id="s-1o2">0</td> <td class="center num" id="s-1o3">0</td> <td class="center num" id="s-1o4">0</td> <td class="center num" id="s-1o5">0</td> <td class="center num" id="s-1o6">0</td> <td class="center num" id="s-1o7">0</td> <td class="center cnt num" id="s-1oo">0</td> </tr> </tbody> 那么利用Ajax拿取返回值,使用jquery的each 用 $("#s"+this.stepId+"o"+this.orderType).text(this.count);绑值,完全一句代码可以完成。在Ajax的success里执行$.each(data,function(){ //给对应工单的对应流程绑值 $("#s"+this.stepId+"o"+this.orderType).text(this.count); }); //流程统计 for (var i = -1; i < 9; i++) { //流程 var counts = 0; for (var j = 1; j < 8; j++) {//工单类型 var z= $("#s"+i+"o"+j).text(); if(z!=''){ counts=counts+parseInt(z); } } //设置流程统计 $("#s"+i+"oo").text(counts); } //待完成总和 var cou = 0; //统计待完成 for (var j = 1; j < 8; j++) {//工单类型 var counts = 0; for (var i = 1; i < 9; i++) { //流程 var z= $("#s"+i+"o"+j).text(); if(z!=''){ counts=counts+parseInt(z); } } cou=cou+counts; //设置统计待完成 $("#o"+j).text(counts); } //设置待完成总和 $("#oo").text(cou); }至此完全可以给所有标签赋值。其实每一个统计数来的 td都能点击去详细页面。而我们只需要把id传过去,进行处理就可以得到对应的统计数信息。 当然可能这种比不是适用于所有的报表什么的,只能说在某种情况下面,看清此时的需求及数据与页面的关系,定义一个正确的命名规则可以省去很多事情。如果我还有不足的地方请大佬提示
2021年12月08日
157 阅读
0 评论
0 点赞
2021-12-08
SSH框架的架设
Maven 创建项目POM.XML<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>club.lygangdai</groupId> <artifactId>WaterWorks_1</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>WaterWorks_1 Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency> <!--自定义标签 jsp-api --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.3.3.Final</version> </dependency> <!-- spring依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.8.RELEASE</version> </dependency> <!-- c3p0依赖 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <!-- 引入spring-orm依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.0.8.RELEASE</version> </dependency> <!-- struts2 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.13</version> </dependency> <!-- 日志 --> <!-- log配置:Log4j2 + Slf4j start --> <!-- 引入slf4j核心接口包 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <!--把jcl实现的日志输出重定向到 SLF4J --> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.7</version> <scope>runtime</scope> </dependency> <!--用于与slf4j保持桥接 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.9.1</version> </dependency> <!--引入log4j2jar核心包:日志接入接口 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <!--引入log4j2jar核心包 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.9.1</version> <scope>runtime</scope> </dependency> <!--需要使用log4j2的AsyncLogger需要包含disruptor --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.2.0</version> </dependency> <!-- log配置:Log4j2 + Slf4j end --> <!-- 引入logging依赖:日志框架,与log4j时使用,struts使用Time拦截器时 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- 引入struts2对Spring的支持插件 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.5.13</version> </dependency> <!-- spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.8.RELEASE</version> </dependency> <!-- 引入Spring 的AspectJ依赖,解析事务切点 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.8.RELEASE</version> </dependency> </dependencies> <build> <finalName>WaterWorks_1</finalName> </build> </project> db.propertiesdriver_Class=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/db_tap_water?useUnicode=true&characterEncoding=UTF-8 uname=root upass=root initPoolSize=10 maxPoolSizea=50 applicationContext-core.xml(可创建其他的applicationContext-*.xml配置其他bean)<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 载入db.properties --> <context:property-placeholder location="classpath:db.properties" /> <!-- 2. 配置数据源(需引入C3P0,同时删除hibernate.hbm.xml中的数据源配置) --> <!-- 要引用C3PO中的ComboPooledDataSource类 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 读取db.properties中参数值 --> <property name="user" value="${uname}"></property> <property name="password" value="${upass}"></property> <property name="jdbcUrl" value="${url}"></property> <property name="driverClass" value="${driver_Class}"></property> <property name="initialPoolSize" value="${initPoolSize}"></property> <property name="maxPoolSize" value="${maxPoolSizea}"></property> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="300" /> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="5" /> <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> <property name="maxStatements" value="0" /> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="300" /> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts" value="30" /> <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false --> <property name="breakAfterAcquireFailure" value="true" /> <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false --> <property name="testConnectionOnCheckout" value="false" /> <!-- 提示:db.properties中的key尽量不要与这里name的值一致,会引起冲突 --> </bean> <!-- 3. 配置SessionFactory --> <!-- 实例化LocalSessionFactoryBean类,需要在pom.xml中引入spring-orm依赖 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 3.1 引入数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 3.2 加载hibernate核心配置文件 (hibernate核心文件交给spring来加载) --> <!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> --> <property name="hibernateProperties"> <props> <prop key="hibernate.connection.release_mode">after_statement</prop> <!-- <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> --> </props> </property> <!-- 3.3 加载hibernate映射文件 --> <property name="mappingLocations" value="classpath:com/waterworks/pojo/*.hbm.xml"></property> <!-- *.hbm.xml代表加载entity下面所有的.hbm.xml文件 删除掉hibernate.cfg.xml中<mapping>对应的映射文件 提示:hibernate.cfg.xml中的show_sql和format_sql其实也可以写到db.properties中,那么hibernate.cfg.xml文件就可以删除掉了。 --> </bean> <!-- 4. 配置事务 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 5. 配置事务的属性 --> <!-- 在<beans>标签中复制xmlns:aop="http://www.springframework.org/schema/aop" 修改成:xmlns:tx="http://www.springframework.org/schema/tx" 复制最后一行:http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd 改成:http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 这样<tx:>就可以使用。 <tx:advice>表示通知/增强,AOP在项目中是通过事务来体现,而事务的底层是通知。 --> <tx:advice id="myAdvice" transaction-manager="transactionManager"> <!-- 事务的属性 --> <tx:attributes> <!--当方法以add开头,如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中 --> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*" /> </tx:attributes> </tx:advice> <!-- 6. 配置事务的切点 --> <!-- 指明哪些包里的哪些类,哪些类中的哪些方法要事务 --> <aop:config> <!-- * com.spring.dao.*.*(..)表示com.spring.dao包下所有的类,所有的方法 --> <aop:pointcut expression="execution(* com.waterworks.dao.*.*())" id="myCut" /> <!--注意:需要再次引入一个依赖:spring-aspects,用于解析上面这个表达式 --> <!-- 关联事务的属性 --> <aop:advisor advice-ref="myAdvice" pointcut-ref="myCut" /> </aop:config> </beans> struts.xml(当中class="{2}" 通配符指定的是action Bean的id)<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="default" extends="struts-default"> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="*_*" class="{2}" method="{1}"> <result name="success">success.jsp</result> </action> </package> </struts> log4j2-test.xml<?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <!-- 先定义所有的appender --> <appenders> <!-- 这个输出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 这个都知道是输出日志的格式 --> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!-- 文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 --> <!-- append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true --> <File name="log" fileName="log/test.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 添加过滤器ThresholdFilter,可以有选择的输出某个级别以上的类别 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否则直接拒绝 --> <File name="ERROR" fileName="logs/error.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 --> <RollingFile name="RollingFile" fileName="logs/web.log" filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="2MB"/> </RollingFile> </appenders> <!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 --> <loggers> <!-- 建立一个默认的root的logger --> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <appender-ref ref="ERROR" /> <appender-ref ref="log"/> </root> </loggers> </configuration>web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>Archetype Created Web Application</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-*.xml</param-value> </context-param> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
2021年12月08日
189 阅读
0 评论
0 点赞
2021-12-08
初识Spring(一)
Spring概述Spring是一款开源的轻量级框架Spring是一个设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此他将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的Java SE/EE full-stack(一站式)轻量级开源框架。Spring在Java EE三层结构中,每一层都提供不同的解决技术,形成一种Spring生态,如: WEB层 SpringMVC SERVICE层 Spring的IOC DAO层 jdbcTemplate 特点 使层与层之间依赖于接口 Spring的bean工厂为我们创建对象,不需要程序自己new对象了(IOC:Inverse of control控制反转;DI:depandency injection依赖注入) 可以管理事务 可以对其他框架进行管理(Struts2, Hibernate, mybatis等) 可以使用 spring自带的springMVC框架 可以使用spring的JDBC模板jdbcTemplate Spring核心部分Spring是一个轻量级的IOC和AOP的容器。其两大核心部分是:IOC(DI) 控制反转(依赖注入)控制反转(依赖注入),不是一种技术,而是一种设计思想,即通过XML配置或注解的方式实例化对象(Bean),然后交给Spring容器控制,如项目中想使用对象,从容器中取用(依赖注入)。而非通过Java硬代码中的new来实例化对象。AOP:面向切面(方面)编程即应用程序在扩展功能时不修改源代码实现功能的扩展。Spring 框架的一个关键组件是面向方面的程序设计(AOP)框架。一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样常见的很好的关于方面的例子,比如日志记录、声明性事务、安全性,和缓存等等。
2021年12月08日
134 阅读
0 评论
0 点赞
2021-12-08
初识Python(一)
Python也是一个类似于Java面向对象的编程语言优点 简单、易学免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。可移植性、解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。运行程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。可扩展性:如果需要一段关键代码运行得更快或者希望某些算法不公开,可以部分程序用C或C++编写,然后在Python程序中使用它们。可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。缺点单行语句和命令行输出问题:很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。独特的语法这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。运行速度慢:这里是指与C和C++相比。#默认情况下 Python3的源码文件以UTF-8编码,所有字符串都是unicode字符串 #以下是定义源文件使用UTF-8编码 # -*- coding: UTF-8 -*- #标识符 #1.第一个字符必须是字母或者下划线 #2.标识符的其他部分由字母、数字和下划线组成 #3.标识符区分大小写 #python的注释分为 #号、'''和""" ''' 多行注释 ''' """ 多行注释 """ #行与缩进 #Python使用缩进来表示代码块,不需要{} if True: print("True") else: print("False") # 结果为 True # if True: # print("True") # else: # print("False") # print(9) #此行代码缩进不一致,运行会报错 #单独一句代码必须顶格书写 不然会报错 #多行语句 total="123"+\ "456" print(total) # 输出:123456 #多行语句用\实现连接 #数字类型(Number) #Python中数字有四种类型:整数、布尔型、浮点型和复数 #int 整数 没有长度限制 #bool 布尔型 True or False #float 浮点型 如1.23、3E-2 #complex 复数 如1+2j、1.1+2.2j #字符串(Stirng) #Python中单引号和双引号使用一样 #可用三引号"""或'''可指定一个多行字符串,其输出格式和输入格式一样 #转义符\,在字符串前面加r可以使\不发生转义 如r"\"999" 输出为 \"999 #按字面意义的级联字符串 如"123""999" 会自动转成123999,也可用+连接在一起 #字符串的两种索引方式,从左往右以0开始,从右往左以-1开始 #截取语法:变量[起始下标:尾下标] #声明变量 #格式 变量名=变量值 a="湖南" print(a) #结果 湖南 print(type(a)) # type()查看类型 <class 'str'> b='长沙' print(b) #结果 长沙 print(type(b)) # type()查看类型 <class 'str'> # \转义 c="\"999" print(c) #结果 "999 # \n 换行 d="000\n123" print(d) # \t 制表 e="abcd\tefg" print(e) #结果 abcd efg # r 不需要转义 f=r"\"你好" print(f) #结果 \"你好 #整数 num=1123123123123333333333131212113 print(num) #结果1123123123123333333333131212113 print(type(num)) # type()查看类型 <class 'int'> n=1_2_3 print(n) #结果123 print(type(n)) # type()查看类型 <class 'int'> #进制 #十进制不能以0开头 #二进制以0b开头 #八进制以0o开头 #十六进制以0x开头 #以其他进制定义的整数输出结果均为十进制 j=0o1331 print(j) #结果为729 #类型转换 aa="123" print(type(aa)) # type()查看类型 <class 'str'> print("aa ="+aa) # 结果 aa =123 aa=123 print(type(aa)) # type()查看类型 <class 'int'> print("aa ="+str(aa)) # 结果 aa =123 如果不转字符串则会报错 #aa最开始是字符串类型 后面赋值是int类型 aa可以赋任何类型的值 print("aa =",aa) # 结果 aa = 123 不需要转类型
2021年12月08日
104 阅读
0 评论
0 点赞
2021-12-08
Python(二)运算符与条件控制及while循环打印菱形
#运算符 #算数运算符 # + 加 1+1结果为2 # - 减 1-1结果为0 # * 乘 2*2结果为4 # / 除 2/2结果为1 # % 取模 2%2结果为0 # ** 幂 2**2结果为4 # // 整除 2//2结果为1 #赋值运算符 a=2 a+=1 #a=a+1 a-=1 #a=a-1 a*=1 #a=a*1 a**=3 #a=a*a*a a/=2 #a=a/2 a//=3 #a=a//3 除不尽时 取整 a%=2 #取模 a=a%2 print(True-1) #结果为0,1-1=0 (True==1,False==0) print(25**0.5) #开平方 #比较运算符 print(True==1) # 等于号 结果为True (True==1,False==0) print("1">"0") # 大于号 结果为True 可比较字符串 根据哈希值比较 print(1!=2) # 不等于 结果为True 1不等于2 print(1<2) # 小于号 结果为True 1小于2 print(2>=2) # 大于等于 结果为True 2大于或等于2 print(2<=2) # 小于等于 结果为True 2小于或等于2 #位运算符 #位运算符是把数字转为二进制来进行计算 # 运算符 描述 实例 #a 为 60,b 为 13 #二进制格式为 # a = 0011 1100 # b = 0000 1101 # & 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100 # a&b = 0000 1100 # | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101 # a|b = 0011 1101 # ^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 # a^b = 0011 0001 # ~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 # ~a = 1100 0011 # << 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000 # >> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111 #逻辑运算符 and、 or、 not # 以下假设变量 a 为 10, b为 20 # and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。 # or x or y 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10。 # not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False a = 10 b = 20 print(a and b) #结果为20 print(a<b and a==10) #结果为True,两边同时为True则为True print(1==1 or 1>2) #结果为True 一边为True在,则为True print(not(1==1)) #1==1为True ,加上not则取非 True则变False,False变True #三元运算 # 结果1 if 条件 else 结果2 print("1大于0") if 1>0 else print("1小于0") #成员运算符 # Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。 # in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 # not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 a = 1 b = 20 arr = [1, 2, 3, 4, 5 ]; if a in arr: print("arr中存在a变量") #在arr中找到变量a的值则输出 else: print("arr中不存在a变量") #在arr没有中找到变量a的值则输出 if b not in arr: print("arr中不存在b变量") #在arr中没有找到变量b的值则输出 else: print("arr中存在b变量")#在arr中找到变量b的值则输出 #身份运算符 身份运算符用于比较两个对象的存储单元 # is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False # is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 n = 20 m = 10 if ( n is m ): # 也可 if ( 20 is 20 ): print ("n 和 m 有相同的标识") #如果n和m里的值相同 else: print ("n 和 m 没有相同的标识") #如果n和m里的值不相同 if ( id(n) == id(m) ): print ("n 和 m 有相同的标识") #如果n和m里的值相同 else: print ("n 和 m 没有相同的标识") #如果n和m里的值不相同 m=20 if ( n is not m ): print ("n 和 m 没有相同的标识") #如果n和m里的值不相同 else: print ("n 和 m 有相同的标识") #如果n和m里的值相同 #条件控制 #行与缩进 #Python使用缩进来表示代码块,不需要{} if True: print("True") else: print("False") # 结果为 True # if True: # print("True") # else: # print("False") # print(9) #此行代码缩进不一致,运行会报错 #单独一句代码必须顶格编写 不然会报错 #也可编写为: # if 条件: # 结果 # elif 条件: # 结果 # else: # 结果 #控制台输入 #name= input("请输入你的姓名:")#控制台输入回车,会将输入的值赋给name #注意:因为控制台输入的值都是string类型,如果要做int类型使用要转类型 #print(name) #循环之while循环 i=1 while i<=9: j=1 while j<=i: print(j,"*",i,"=",(j*i)," ",end="") # j,"*",i,"=",(j*i)," " 为j*i=(j*i)【," "为在最后添加空格】 end=""为print不换行 j+=1 print() i+=1 #菱形 #-----------------上半部分 y=1 while y<10: #打印9行 k=1 p=1 while k<10-y: #第一次八个空格 print(" ",end="") k+=1 while p<y*2: #第一次一个* print("*",end="") p+=1 print("") #换行 y+=1 #-----------------下半部分 y = 9 while y<10 and y>0: k=1 p=1 while k<=10-y: #第一次一个空格 print(" ",end="") k+=1 y-=1 while p<=y*2-1:#1=8*2-1 第一次十五个* print("*",end="") p+=1 print("")
2021年12月08日
165 阅读
0 评论
0 点赞
2021-12-08
XML中声明DTD、XML解析、什么是反射?
什么是格式良好XML 1 有且只有一个根元素 2 XML标签大小写正确区分 3 正确使用结束标签 4 正确嵌套标签 5 使用了合法的标签名 6 定义有效的属性 XML中声明DTD<!Doctype root[]> 定义元素的语法<!ELEMENT element-name (type)>元素的分类element-name:元素名称<!ELEMENT element-name EMPTY> //空元素<!ELEMENT element-name (#PCDATA)> //文本元素<!ELEMENT element-name (e1,e2)> //混合元素,标签里包含了其他的元素 元素的限制, :顺序| :或次数: +(1~n) *(0~n) ?(0或1) 没有(1) 属性定义的语法att_name:属性名<!ATTLIST element-nameatt_name type> 类型:ID :唯一(男|女) :列表“值” :默认值CDATA :文本IDREF :外键#REQUIRED :不为空#IMPLIED :允许为空 XML中的特殊符号& (逻辑与) &> (大于) << (小于) >“ (双引号) "‘ (单引号) ' DTD列子:config.xml文件 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE config[<!ELEMENT config (action*)><!ELEMENT action (forward*)><!ELEMENT forward EMPTY><!ATTLIST action path CDATA #REQUIRED type CDATA #REQUIRED><!ATTLIST forward name CDATA #REQUIRED path CDATA #REQUIRED redirect (true|false) "false">]><!--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> XML的作用:配置:*.properties*.XML 数据交换XMLWebserviceJson JAVA配置文件的三种配置位置及读取方式 XML和*.properties(属性文件) 存储位置src根目录下 Xxx.class.getResourceAsStream("/config.properties");与读取配置文件的类在同一包 Xxx.class.getResourceAsStream("config2.properties");WEB-INF(或其子目录下) ServletContext application = this.getServletContext(); InputStream is = application.getResourceAsStream("/WEB-INF/config3.properties"); XML解析1.properties//输入流 类名.class.getResourceAsStream 填写配置文件的地址// /db.properties为src目录下InputStream is = Test.class.getResourceAsStream("/db.properties");//解析Properties properties = new Properties();properties.load(is); //键值对的存储方式,根据键的名称获得值 Stringuname = properties.getProperty("uname");String user = properties.getProperty("user");String password = properties.getProperty("password");System.out.println(uname+" "+user+" "+password); 2.xmlInputStream is = Test.class.getResourceAsStream("/students.xml"); SAXReader saxReader = new SAXReader();Document read = saxReader.read(is); Stringxpath="/students/student"; //得到xml文件里students下所有student元素节点List<Node>li = read.selectNodes(xpath);for (Node node :li) { //student元素节点Element studentElement = (Element) node; // 1.得到student中的sid属性节点Attribute sidAttribute = studentElement.attribute("sid");//得到sid中的文本节点Stringsid = sidAttribute.getText(); // 2.得到student中sid属性节点里的文本节点Stringsid = studentElement.attributeValue("sid"); //student下的name元素节点Element nameElement = (Element)studentElement.selectSingleNode("name");//得到name元素节点中的文本节点String name = nameElement.getText();System.out.println(sid+","+name);} //得到某个元素节点InputStream is =Test.class.getResourceAsStream("/students.xml"); SAXReader saxReader =new SAXReader();Documentread = saxReader.read(is);//得到student元素节点下一个sid为s003的name元素节点String xpath="/students/student[@sid='s003']/name";ElementnameElement = (Element)read.selectSingleNode(xpath);System.out.println(nameElement.getText());
2021年12月08日
112 阅读
0 评论
0 点赞
2021-12-08
通过域名访问web项目
1.首先把项目导出成*.war文件 2.把项目放到Linux系统tomcat中的webapps下(到此步骤重启tomcat可以通过ip地址加端口号加项目名访问项目如: 192.168.44.199:8080/项目名/index.jsp) 3.配置域名解析(注意:不管是在腾讯云或阿里云购买的域名,记得配置解析,不然不能通过域名访问项目记录值里填的是对应的) 4.打开tomcat中conf文件中的server.xml进行修改(此步骤为更改端口配置域名访问)在把此文件中的defaultHost的值改为自己的域名 ------------------------------------------------------在把name改为域名如果没有context则添加一行docBase 填的是对应项目名记得在安全组里添加80端口最后重启tomcat就可以通过域名访问项目
2021年12月08日
182 阅读
0 评论
0 点赞
1
...
6
7
8
...
24