前端后台常见问题总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Bug_money/article/details/53119558

1.字符乱码的问题(前后台):
在浏览器中查看格式是否是unicode编码
在jsp文件中查看头是否是utf-8
看Eclipse的开发环境是不是utf-8 右键–>properties–>utf-8
看tomcat服务器Server文件中server.xml添加URIEncoding=”utf-8”

设置request和response的字符编码
在过滤器中
request.setCharacterEncoding(“utf-8”);
response.setContentType(“text/html;charset=UTF-8”);
chain.doFilter(request, response); //下一条链
字符乱码的问题(纯前台):
如果在Editplus中编写的代码,用浏览器打开时乱码的时候:
修改浏览器显示页面的字符编码:火狐在浏览器选项卡的位置右击显示菜单栏–>查看–>文字编码–>选择Unicode编码;360在页面上右击–>编码–>Unicode(utf-8)
修改Editplus的编码格式:
修改Editplus的默认编码格式:工具–>配置自定义工具–>文件–>默认文本编码–>UTF-8
修改现在在Editplus中打开的文件的字符编码:文档–>文字编码–>转换文本编码–>选择UTF-8
2.内存溢出的问题:
如果tomcat通过eclipse启动,可以添加tomcat虚拟机参数
-Xms64m -Xmx512m -XX:PermSize=512M -XX:MaxNewSize=256m -XX:MaxPermSize=512m
如果tomcat通过bin/start.bat启动,修改catalina.bat,插入
set JAVA_OPTS=-Xms64m -Xmx512m -XX:PermSize=512M -XX:MaxNewSize=256m -XX:MaxPermSize=512m
3.Maven环境变量的设置:
M2_HOME: Maven的安装目录,如:C:\maven\apache-maven-3.0.4
M2: %M2_HOME%\bin
将M2添加到环境变量path中: path:%M2%
测试maven的成功:mvn -v
4.jdk 配置环境变量
JAVA_HOME D:\JAVA\jdk1.7.0_21
CLASSPATH .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar
Path .;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;
测试jdk的成功:java -version

5.如何修改jsp页面的默认编码:
windows–>inference–>web–>jsp file–>修改为utf-8

6.CSS中的隐藏元素
//用jQuery隐藏之后显示
().hide();().show();
//用这些恢复不到原来的样式
display:none 我不占地,你看不见我
:block 块级元素
:inline 行级元素
:run-in 此元素会根据上下文作为块级元素或内联元素显示
:inherit 从父元素继承display属性的值
visible:hidden 我占地,你看不见我,我是透明的
:collapse 用在表格元素中时,此值课删除表格中的一行或一列时,但不影响表格的布局。被行或列占据的空间会留给其他内容使用。如果此值用在其他元素上,会是hidden
:inherit 规定从父元素上继承visibility属性的值
overflow:hidden 内容会被修改,并且其余内容是不可见的
:visible 默认值,内容不会被修剪,会呈现在元素框之外
:scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容
:auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容
:inherit 规定从父元素继承overflow属性的值

7.查看本机的ip地址
在命令行输入ipconfig运行
8.基本涵盖了http网页中出现的所有问题
HTTP 400 – 请求无效
HTTP 401.1 – 未授权:登录失败
HTTP 401.2 – 未授权:服务器配置问题导致登录失败
HTTP 401.3 – ACL 禁止访问资源
HTTP 401.4 – 未授权:授权被筛选器拒绝
HTTP 401.5 – 未授权:ISAPI 或 CGI 授权失败

HTTP 403 – 禁止访问
HTTP 403 – 对 Internet 服务管理器 的访问仅限于 Localhost
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 – 禁止访问:禁止读访问
HTTP 403.3 – 禁止访问:禁止写访问
HTTP 403.4 – 禁止访问:要求 SSL
HTTP 403.5 – 禁止访问:要求 SSL 128
HTTP 403.6 – 禁止访问:IP 地址被拒绝
HTTP 403.7 – 禁止访问:要求客户证书
HTTP 403.8 – 禁止访问:禁止站点访问
HTTP 403.9 – 禁止访问:连接的用户过多
HTTP 403.10 – 禁止访问:配置无效
HTTP 403.11 – 禁止访问:密码更改
HTTP 403.12 – 禁止访问:映射器拒绝访问
HTTP 403.13 – 禁止访问:客户证书已被吊销
HTTP 403.15 – 禁止访问:客户访问许可过多
HTTP 403.16 – 禁止访问:客户证书不可信或者无效
HTTP 403.17 – 禁止访问:客户证书已经到期或者尚未生效 HTTP 404.1 -

无法找到 Web 站点
HTTP 404- 无法找到文件
HTTP 405 – 资源被禁止
HTTP 406 – 无法接受
HTTP 407 – 要求代理身份验证
HTTP 410 – 永远不可用
HTTP 412 – 先决条件失败
HTTP 414 – 请求 – URI 太长

HTTP 500 – 内部服务器错误
HTTP 500.100 – 内部服务器错误 – ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 – 服务器太忙
HTTP 500-14 – 应用程序无效
HTTP 500-15 – 不允许请求 global.asa
Error 501 – 未实现
HTTP 502 – 网关错误

9.css中的伪元素
标签
未访问时默认是蓝色 link可以修改它
已访问时默认是紫色 visited可以修改它
默认鼠标放上没有效果 hover可以修改它
默认鼠标按下是红色 active可以修改它

link 未访问过的超链接的样式
visited 已访问过的超链接样式
hover 鼠标放上的超链接样式
active 鼠标按下的超链接样式

    hover一定要写在link和visited之后,active一定要写到hover之后
    但是各自单独写可以实现。所以一定要link--visited--hover--active顺序
<p>标签
    first-letter  修改首个字符   p:first-letter{...}
    first-line   修改首行       p:first-line{...}

10.URIs, URLs, and URNs
URI 统一资源标识符,用来唯一的标识一个资源,(抽象的、高层次概念定义的统一资源标识)
URL 统一资源定位符,是一种具体的URI,可以用来标识一个资源而且还指明了如何定位(locator)这个资源。(具体的资源标识的方式,是URI的一种,用于绝对路径)
URN 统一资源命名,通过名字来标识资源(具体的资源标识的方式,是URI的一种)

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema必须被指定。
ok,现在回答文章开头提出的问题,到底是imgUrl好呢,还是imgUri好?显然,如果说imgUri是肯定没问题的,因为即使它实际上是url,那它也是uri的一种。那么用imgUrl有没有问题呢?此时则要看它的可能取值,如果是绝对路径,能够定位的,那么用imgUrl是没问题的,而如果是相对路径,那还是不要用ImgUrl的好。总之,用imgUri是肯定没问题的,而用imgUrl则要视实际情况而定。
第二个,从HttpServletRequest的javadoc中可以看出,getRequestURI返回一个String,“the part of this request’s URL from the protocol name up to the query string in the first line of the HTTP request”,比如“POST /some/path.html?a=b HTTP/1.1”,则返回的值为”/some/path.html”。现在可以明白为什么是getRequestURI而不是getRequestURL了,因为此处返回的是相对的路径。而getRequestURL返回一个StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的请求资源路径,不包括querystring。
总结一下:URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

注:这里的绝对(absolute)是指包含scheme,而相对(relative)则不包含scheme。

URI抽象结构     [scheme:]scheme-specific-part[#fragment]

[scheme:][//authority][path][?query][#fragment]

authority为[user-info@]host[:port]

参考资料:

http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html

http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

ps:

java.net.URL类不提供对标准RFC2396规定的特殊字符的转义,因此需要调用者自己对URL各组成部分进行encode。而java.net.URI则会提供转义功能。因此The recommended way  to manage the encoding and decoding of URLs is to use  java.net.URI. 可以使用URI.toURL()和URL.toURI()方法来对两个类型的对象互相转换。对于HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder来完成,但是对URL对象不适用。

11.js中的数据类型转换(5种基本数据类型Null,Undefined,Number,Boolean,String,1种引用数据类型)
其他数据类型转换为Boolean类型(使用Boolean())
Boolean true false

    Undefined           undefined
    Null                null
    Number      任何非0        0和NaN
    String      任何非空字符串 ""
    Object      任何对象    null
其他数据类型转换为Number类型(使用Number())
    Number      0   1   数值      NaN

    Undefined                   undefined
    Null        null
    Boolean     false   true
    String      ""、"0"  "1" 纯数值组合   非纯数值组合

    Object  对象中既没有重写toString()方法,也没有重写valueOf()方法,返回NaN
        如果对象中只重写了toString()方法,则调用toString()方法,获得返回值用Number()转换
        如果对象中既重写的toString()方法,又重写了valueOf()方法,或者只重写了valueOf()方法则调用valueOf()方法,获得返回值用Number()转换
其他数据类型转换为String类型(使用String())
    String          字符串         [object Object]

    Undefined       "undefined"
    Null            "null"
    Boolean         "true"  "false"
    Number          "数字"
    Object  对象中如果没有重写toString()方法,返回[object Object],如果重写了toString()方法则返回该方法返回的内容。

12.json文件的格式
[{
“属性名”:”属性值”,
“属性名”:”属性值”,
“属性名”:”属性值”
},{
“属性名”:”属性值”,
“属性名”:”属性值”,
“属性名”:”属性值”
},{
“属性名”:”属性值”,
“属性名”:”属性值”,
“属性名”:”属性值”
}]
13.jQuery中如何把一个外部json文件中的数据读入到js代码中?
.getJSON(url,function(data)datajson);.each(data,function(index,info){
//data为从json中获取的数据,index表示下标,info表示每一项
});

14.css中的定位的参照物:
position:relative/absolute/fixed/static
absolute:需要找到最近的祖先定位元素,若没有就是浏览器的左上角,若有就是相对于父元素的定位
relative:是相对于其正常位置的定位
或者用margin进行定位 100%表示相对于父元素的宽度 相对于父元素或者相邻的兄弟元素

15.热点测试
Planets

<map name="planetmap" id="planetmap">
  <area shape="circle" coords="180,139,14" href ="a.html" style="cursor: pointer" alt="Venus" />
  <area shape="circle" coords="129,161,10" href ="b.html" alt="Mercury" /> 
  <area shape="rect" coords="0,0,110,260" href ="c.html" alt="Sun" /> 
    <!--    属性值             值描述
        x1,y1,x2,y2     如果 shape 属性设置为 "rect",则该值规定矩形左上角和右下角的坐标。
        x,y,radius      如果 shape 属性设置为 "circ",则该值规定圆心的坐标和半径。
        x1,y1,x2,y2,..,xn,yn        如果 shape 属性设置为 "poly",则该值规定多边形各边的坐标。如果第一个坐标和最后一个坐标不一致,那么为了关闭多边形,浏览器必须添加最后一对坐标。-->

</map>

16.执行环境和作用域
*精髓***
当ECMAScript开始执行时,创建一个全局执行环境和全局变量对象;后面每次进入一个函数时(这个函数被调用),则创建一个当前函数的执行环境并压入栈,同时创建此执行环境的变量对象和作用域链,作用域链的创建规则是复制上一层环境的作用域链,并将指向本环境变量对象的指针放到链首;离开函数时,从栈中弹出此执行环境并销毁,同时销毁环境的变量对象和作用域链。
“当ECMAScript开始执行时,创建一个全局执行环境;每次进入一个函数时(这个函数被调用),则创建一个当前函数的执行环境并压入栈,离开此函数时从栈中弹出此执行环境并销毁。” —-ECMAScript
“每一个执行环境有一个与其相关的变量对象,变量对象记录了此执行环境中定义的变量及函数。” —-ECMAScript
**详解**
一、执行环境(exection context,也有称之为执行上下文)
所有 JavaScript 代码都是在一个执行环境中被执行的。执行环境是一个概念,一种机制,用来完成JavaScript运行时在作用域、生存期等方面的处理,它定义了变量或函数是否有权访问其他数据,决定各自行为。
在javascript中,可执行的JavaScript代码分三种类型:
1. Global Code(全局代码),即全局的、不在任何函数里面的代码,例如:一个js文件、嵌入在HTML页面中的js代码等。
2. Eval Code(Eval代码),即使用eval()函数动态执行的JS代码。
3. Function Code(函数代码),即用户自定义函数中的函数体JS代码。
不同类型的JavaScript代码具有不同的执行环境,这里我们不考虑evel code,对应于global code和function code存在2种执行环境:全局执行环境和函数执行环境。
“当ECMAScript开始执行时,创建一个全局执行环境;每次进入一个函数时(这个函数被调用),则创建一个当前函数的执行环境并压入栈,离开此函数时从栈中弹出此执行环境并销毁。” —-ECMAScript
在一个页面中,第一次载入JS代码时创建一个全局执行环境,全局执行环境是最外围的执行环境,在Web浏览器中,全局执行环境被认为是window对象。因此,所有的全局变量和函数都是作为window对象的属性和方法创建的。

    当调用一个 JavaScript 函数时,该函数就会进入与该函数相对应的执行环境。如果又调用了另外一个函数(或者递归地调用同一个函数),则又会创建一个新的执行环境,并且在函数调用期间执行过程都处于该环境中。当调用的函数返回后,执行过程会返回原始执行环境。因而,运行中的 JavaScript 代码就构成了一个执行环境栈。
    “每一个执行环境有一个与其相关的变量对象,变量对象记录了此执行环境中定义的变量及函数。”    ----ECMAScript
    程序在进入每个执行环境的时候,JavaScript引擎在内部创建一个对象,叫做变量对象(Variable Object)。对应函数的每一个参数,在Variable Object上添加一个属性,属性的名字、值与参数的名字、值相同。函数中每声明一个变量,也会在Variable Object上添加一个属性,名字就是变量名,因此为变量赋值就是给Variable Object对应的属性赋值。在函数中访问参数或者局部变量时,就是在variable Object上搜索相应的属性,返回其值。(另外注意:一般情况下Variable Object是一个内部对象,JS代码中无法直接访问。规范中对其实现方式也不做要求,因此它可能只是引擎内部的一种数据结构。)

二、Scope/Scope Chain(作用域/作用域链)

    function Fn1(){
        function Fn2(){
            alert(document.body.tagName);//BODY
            //other code...
        }
        Fn2();
    }
    Fn1();
    //code here
    当代码在一个环境中执行时,都会创建基于Variable Object的一个作用域链。 作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。整个作用域链是由不同执行位置上的Variable Object按照规则所构建一个链表。作用域链的最前端,始终是当前正在执行的代码所在环境的Variable Object。如果这个环境是函数(比如Fn2),则将其活动对象(activation object)作为变量对象。活动对象在最开始时只包含一个变量,就是函数内部的arguments对象。作用域链中的下一个Variable Object来自该函数(Fn2)的包含环境(也就是Fn1),而再下一个Variable object来自再下一个包含环境。这样,一直延续到全局执行环境,全局执行环境的Variable Object始终是作用域链中的最后一个对象。

    如上所述,作用域链感觉就是一个Variable Object链表,当访问一个变量时,先在链表的第一个Variable Object(最前端)上查找,如果没有找到则继续在第二个Variable Object上查找,直到搜索结束,也就是搜索到全局执行环境的Variable Object中。这也就形成了Scope Chain的概念。

17.js中没有块级作用域
for(var i=0;i<10;i++){
doSomething(i);
}
alert(i); // output :10,why?
上述代码运行后会返回10,为什么呢?如果是同样的java或是c#代码,则不会是10,可能会提示运行错误,因为i只存在于for循环体重,在运行完for循环后,for中的所有变量就被销毁了。而在javascript中则不是这样的,在for中的变量声明将会添加到当前的执行环境中(这里是全局执行环境),因此在for循环完后,变量i依旧存在于循环外部的执行环境。因此,会输出10。

18.js中变量的声明和函数的声明会先被解析
var x = 1;
function rain(){
alert( x ); //弹出 ‘undefined’,而不是1,也不是10,why?
var x = ‘10’;
alert( x ); //弹出 ‘10’,why?
}
rain();
如果该作用域中有,就不会去上级作用域中拿

19.js中闭包
var name = “Microsoft”;
function funcA(){
var name = “Google”;
alert(name);
return function(){
name = “Facebook”;
alert(name);
};
}
var o = funcA(); //Google
alert(name); //Microsoft
o(); //Facebook
********
执行完后,执行流就会离开funcA, 那么funcA的变量对象就应该被销毁了。
作用域链的创建规则是复制上一层环境的作用域链,并将指向本环境变量对象的指针放到链首;
********

匿名函数的作用域链应该有三个元素,第一个是匿名函数的变量对象指针,第二个是funcA的变量对象指针,第三个是全局变量对象指针。根据搜索算法,首先搜索匿名函数的变量对象,显然这个对象中不存在name,然后搜索funcA的变量对象,这里面有个“name”,因此将其作为name变量返回,搜索终止,所以,匿名函数引用的是funcA内定义的“name”变量而非全局变量。
var o = funcA();
执行完后,执行流就会离开funcA, 那么funcA的变量对象就应该被销毁了,funcA内定义的变量name就应该不存在了,为什么在后面还可以访问到呢?要解释这个问题,请回想上文一句话:作用域链的创建规则是复制上一层环境的作用域链,并将指向本环境变量对象的指针放到链首;根据这句话我们知道匿名函数的作用域链有三个元素,引用了三个变量对象(上文有说),这里要注意,返回的匿名函数赋值给了变量o,而变量o是一个全局变量,在funcA执行完成后不会被销毁。当赋值的时候,匿名函数的作用域链已然建立,并且此作用域链引用了funcA的变量环境,因此,当funcA执行完毕后,其执行变量和作用域链确实被销毁了,但是其变量对象没有被销毁,因为匿名函数的作用域链对其有引用,其无法被垃圾回收机制销毁。当funcA执行完成后funcA的Scope chain早就销毁了,但是其变量对象(红色表示),因为被匿名函数的Scope chain引用了,所以没有销毁。因此,匿名函数可以访问其成员,当匿名函数执行完成后,它会连同匿名函数的Scope chain一起被销毁。


闭包就是能访问另一个函数作用域中变量的函数。
因为闭包通常通过匿名函数实现,所以经常有人将闭包和匿名函数两个名词混用。闭包的优点很明显,就是可以访问另一个函数域中的变量,缺点也明显,比较耗内存(因为同时保持了N个变量对象)。

20.this指向对象
this跟作用域其实没有关系
var name = “Global name”;
function funcA(){
var name = “FuncA name”;
return function(){
alert(this.name);
};
}
funcA()(); //Global name
不要想象this会指向上层作用域的对象,其实this就是简单指向调用这个函数的对象。
因为所有在全局定义域中定义的变量或函数其实会成为window的成员,所以上面就显示“Global name”了。

21.Eclipse引入一个项目
file–import—从SVN中检出—-作为已知工作空间的项目—–SVN地址—–.sg-service—–右键—–import—已存在的maven项目….
过滤js的错误:
项目—右键—properties—javascript—include path—exclude path—-*/.js

22.easyUI的使用
首先引入:

其次引入:

然后是国际化文件,中文的

最后css样式

23.JSP中的el表达式
{username},取出某一范围中名名称为username的变量
因为没有指定哪一范围的username,所以它会依序从Page、Request、Session、Application范围查找,加入途中找到username就直接回传,不再继续找下去,但是加入全部范围都没有找到时,就回传null

 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
 <%=request.getParameter("username")%>  等价于${param.username}

24.img标签中的绝对定位
file:///F:/1picture/221036hdk3saw03ds3mhvv.jpg

25.获取css样式中的属性值
var div = document.getElementById(“a”);
var test;
if(div.currentStyle){
test = div.currentStyle;
}else{
test = window.getComputedStyle(div, null);
}
console.log(test[“width”]);

26.预模型传值
struts2中的传参数:
1) 可以通过属性来传参数,直接在action里定义相应的参数并加上get,set方法,此参数必须与页面相应的参数同名。
2) 可以通过预模型来传值,定义一个类,比如说User类,它里面有User所需的各种属性,在action中使用User类定义一个对象user。在页面上使用user属性来给user赋值,在action内通过user就可以拿到。

struts2框架验证:
    为不同的action建立验证。
    在和action类同目录下见一个XML文件,文件名为action类名-对应struts2配置文件对应的映射名称(nam="")
    action类需要继承ActionSupport。

27.命令行进入mysql数据库
mysql -hlocalhost -uroot -p123456 //当时安装mysql的时候的超级用户的账户名和密码
show databases; 显示左右的mysql数据库中的所有数据库
\u person 切换数据库
28.netstat -ano 查看本机的程序的端口号

29.Unknown MySQL server host ‘localhost’(0)
1.可以连上网就解决的
2.可以把数据库的连接属性的连接地址改为127.0.0.1或localhost

30.如果时间日期出错的话,试试
new java.util.Date(rs.getDate(“time”).getTime())
获取当前时间的毫秒数:System.currentTimeMillis()
获取当前时间:new Date()
存放日期类型的数据到数据库:

    1.将固定字符串转换为日期类型,需要借助 new SimpleDateFormat("yyyy-MM-dd").parse("2012-12-21")方法将指定日期转换为java.util.Date类型,如果要存放到数据库,将new java.sql.Date(new java.util.Date().getTime()),需使用字符串拼接或ps的setXXX方法
    2.直接在sql语句中使用to_date('2012-12-21','yyyy-mm-dd')

31.连接Oracle数据库的步骤
0.导入ojdbc的jar包
1.注册驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”);
2.建立连接
Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:xe”,”briup”,”briup”)
3.创建搬运工
String sqls = “insert into student(id,name,age) values(1,’zhangsan’,22)”;
Statement stmt = conn.createStatement();
String sql = “insert into student(id,name,age) values(?,?,?)”;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1);
ps.setString(2,”zhangsan”);
ps.setInt(3,22);
4.执行sql语句
stmt.execute(sql);
ps.execute();
5.如果有结果集的话处理结果集
String sql2 = “select * from student”;
RusultSet rs = stmt.executeQuery(sql);
Student s = null;
List list = new ArrayList();
while(rs.next()){
int id = rs.getInt(1); //代表查出来的视图的第一列,或者使用select查出来的视图的列名
String name = rs.getName(“name”);
int age = rs.getInt(3);
s = new Student(id,name,age); //将查出来的数据封装成java中的对象
list.add(s);
}
6.关闭资源(先开的后关)
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(conn!=null)conn.close();

32.PreparedStatement和Statement
ps继承自Statement。
参考31。在创建和执行的时候的区别。
ps是预编译,可以防止注入,执行同构的sql语句有优势,批处理的时候效率高,但在单条sql语句的执行方面,stmt有优势,因为不需要预编译。
stmt.addBatch(sql);
stmt.executeBatch();
ps.addBatch(); //因为在创建的时候实行了预编译,所以在添加背包的时候不用添加sql语句。只需要setXXX之后,写入此条语句
ps.executeBatch();
注意,最后一次背包里的数据的执行

33.myBatis实现一对一和一对多和多对多
数据库建表
一对一 外键声明在任何一方都行 丈夫和妻子 外键在丈夫表里
一对多 外键声明在对多的一方 组和用户 外键在用户表里
多对多 创建桥表,也就是关系表。引入两个表的主键作为外键 学生和老师
建立pojo类
一对一 妻子的对象作为丈夫类的成员变量
一对多 在一的pojo类里创建多的集合 在group类的创建Collection users 作为成员变量
多对多 参考一对多。在两个pojo类里分别创建集合
修改mybatis-config.xml配置文件
重命名类。
引入映射文件
映射文件
//对应接口类
将从数据库里查询出来的数据封装成对象有两种方法,嵌套结果和嵌套查询(如果是嵌套结果记得给从数据库查出来的列起别名,如果select语句查出来的视图中有两列的列名一样的话,mybatis在封装对象的时候,不知道具体调用哪一个列的数据,会导致数据封装出错)
一对一使用association标签,一对多或多对多使用collection标签
嵌套结果(一条sql语句查询多张表,一个对象的封装的时候调用另一个对象的封装。给列起别名)




//如果是一对多的时候使用collection标签







select h.id hid,h.name hname,h.age hage,w.id wid,w.name wname,w.age wage
from husband h,wife w
where h.id=#{id} and h.wife_id=w.id

嵌套查询(一条sql语句查询一张表,一张表查出来的某一列作为查询另一张表的条件。不用起别名,因为一张表对应一个结果集)






select id,name,age
from wife
where id=#{id}








select id,name,age,wife_id
from husband
where id=#{id}

插入数据到数据库中:

isnert
into wife(id,name,age)
values(#{id},#{name},#{age})

映射接口
public interface HusbandMapper{
public List findHusbandWithWifeById(Integer id);
public void insertWife(Wife wife);
}
测试类
InputStream is = Resources.getResourceAsStream(“mybatis-config.xml”);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
Mapper mapper = session.getMapper(HusbandMapper.class);//接口类
mapper.insertWife(wife);
List list = mapper.findHusbandWithWifeById(1);
session.close();
34.网络编程
服务器端
ServerSocket ss = new ServerSocket(10000);
Socket socket = ss.accept(); //等待客户端发送请求
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(“hello”);
System.out.println(“数据传输完成….”);
bw.flush();
bw.close();
os.close();
socket.close();
ss.close();
客户端
Socket socket = new Socket(“127.0.0.1”, 10000);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String string = br.readLine();
System.out.println(string);
br.close();
is.close();
socket.close();

35.css中设置border-collapse: collapse;使表格的单元格的外边距

展开阅读全文

没有更多推荐了,返回首页