基本数据类型 |
包装类 |
大小 |
范围 |
默认值 |
byte |
Byte |
8 |
-128 ~ 127 |
0 |
boolean |
Boolean |
1 |
True/false |
False |
short |
Short |
16 |
-32768 ~ 32基础768 |
0 |
char |
Character |
16 |
‘\u0000 - u\ffff ‘ |
‘\u0000 ’ |
int |
Integer |
32 |
|
0 |
long |
Long |
64 |
|
0 |
float |
Float |
32 |
|
0.0f |
double |
Double |
64 |
|
0.0d |
包装类均位于java.lang包, 对于包装类说,这些类的用途主要包含两种:
a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
1.string和int之间的转换
string转换成int
Integer.valueOf(str)返回的是Integer对象,
Integer.paseInt(str)返回的是int
int转换成string: String.valueOf(12)
2.char转换成string: String str=String.valueOf('2')
String类表示内容不可改变的字符串。而StringBuffer和StringBuilder类表示内容可以被修改的字符串。
StringBuilder是线程不安全的,运行效率高,如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer;
1. 获取长度*.length();
2. 比较字符串
(1) equals() //判断内容是否相同
(2)compareTo() //判断字符串的大小关系
(3)compareToIgnoreCase(String int) //在比较时忽略字母大小写
(4)== //判断内容与地址是否相同
(5)equalsIgnoreCase() //忽略大小写的情况下判断内容是否相同
3. 查找字符串中某个位置的字符
public char charAt(int index); //返回指定位置上的字符,索引index范围从0开始
4. 查找指定字符串在字符串中第一次或最后一词出现的位置
查找指定位置的字符串第一次出现的位置的方法:
(1)indexOf(String str);//从字符串开始检索str,并返回第一次出现的位置,未出现返回-1
(2indexOf(String str,int fromIndex);//从字符串的fromIndex个字符开始检索str
查找最后一次出现的位置有两种方法
(1)public int lastIndexOf(String str);
(2)public int lastIndexOf(String str,int fromIndex);
如果不关心字符串的确切位置则可使用: public boolean contains(CharSequence s);
5. 检查字符串的起始字符和结束字符
开始的字符串两种方法
(1)public boolean starWith(String prefix,int toffset);//如果参数prefix表示的字符串序列是该对象从索引toffset处开始的子字符串,则返回true
(2)public boolean starWith(String prefix);
结束的字符串方法
(3)public boolean endsWith(String suffix);
6. 截取子串
(1)public String subString(int beginIndex);
(2)public String subString(int beginIndex,int endIndex);//返回的字符串是从beginIndex开始到endIndex-1的串
例:要返回后4位可以这样写
Syetem.out.println(*.subString()(*.length()-4));
7. 字符串的替换两种方法
(1)public String replace(char oldChar,char newChar);
(2)public String replace(CharSequence target,CharSequence replacement);//把原来的etarget子序列替换为replacement序列,返回新串
(3)public String replaceAll(String regex,String replacement);//用正则表达式实现对字符串的匹配
8. 字符串的大小写替转换
(1)public String toLowerCase(Locale locale); //大转小
(2)public String toLowerCase();
(3)public String toupperCase(Locale locale); //小转大
(4)public String toUpperCase()
9. 去除字符串中空格
首尾空格 *.trim();
去掉所有空格,包括首尾、中间 str.replace("", "");
例:Stringstr = " hell o ";
String str2 =str.replaceAll(" ", "");
10. 字符串转换
将字符串转换成字符数组 public char[] toCharArray();
将字符串转换成字符串数组public String[] split(String regex);//regex 是给定的匹配
将其它数据类型转化为字符串
(1)public static String valueOf(boolean b);
(2)public static String valueOf(char c);
(3)public static String valueOf(int i);
(4)public static String valueOf(long i);
(5)public static String valueOf(float f);
(6)public static String valueOf(double d);
(7)public static String valueOf(char[] data);
(8)public static String valueOf(Object obj);
n个数字来比较,两层循环来嵌套, 外层循环N-1,内层循环N-1-i,两两相比小靠前
List:
(1)可以允许重复的对象
(2)可以插入null元素
(3)是一个有序的容器,保持了每个元素的插入顺序,输出顺序就是插入的顺序
(4)常用的实现类有,ArrayList,LinkedList和Vector。
ArrayList随机访问速度快
LinkedList插入和删除的速度比较快
Set:
(1)不允许重复的对象
(2)无序的容器,你无法保证每个元素的存储顺序,TreeSet通过Comparator或Comparable维护了一个排序的顺序。
(3)只允许一个null元素
(4)set接口最流行的几个实现类是:HashSet,LinkedHashSet以及TreeSet。最流行的是基于HashMap的实现HashSet;还实现了SortedSet接口
因此TreeSet是一个根据其compare()和compareTo()的定义进行排序的有序容器。
Map:
(1)Map的每条数据都持有两个对象,也就是一个键一个值,Map可能会持有相同的值对象但键对象必须为唯一的。
(2)Map不是collection的子接口或者实现类,Map是一个接口。
(3)TreeMap也是通过Comparator或者Comparable维护了一个排序顺序。
(4)Map里可以拥有随意个null值,但是最多只能有一个null键。
(5)Map接口最流行的几个实现类HashMap,LinkedHashMap,HashTable
C/S是Client/Server(客户端/服务器)的缩写。客户端需要安装专用的客户端软件。
优点: C/S架构的界面和操作可以很丰富。
安全性能可以很容易保证,实现多层认证也不难。
由于只有一层交互,因此响应速度较快。
缺点: 适用面窄,通常用于局域网中。
用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
维护成本高,发生一次升级,则所有客户端的程序都需要改变。
B/S是Brower/Server(浏览器/服务器)的缩写,客户机上只要安装一个浏览器(Browser)
优点: 客户端无需安装,有Web浏览器即可。
BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
BS架构无需升级多个客户端,升级服务器即可。
缺点: 在跨浏览器上,BS架构不尽如人意。
表现要达到CS程序的程度需要花费不少精力。
在速度和安全性上需要花费巨大的设计成本,这是BS架构的最大问题。
反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。)开放性和原因连接是反射系统的两大基本要素。
优点:
1、反射提高了程序的灵活性和扩展性。
2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
get是从服务器上获取数据,安全性非常低,get传输数据小;
post是向服务器传送数据,post安全性较高。,post可以传输数据量大.
(1)重地址栏来说
forward是服务器请求资源,服务器直接访问目标地址的URL,吧那个url的响应内容读取出来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容从哪里来,所以他的地址栏还是原来的地址。
redirect是服务端根据逻辑,发送的一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是最新的URL.
(2)从数据共享来说
forwad:转发页面和转发到页面可以共享request里面的数据
redirect:不能共享数据
(3)重运用的地方来说
forward:一般用于用户登录的时候,根据角色转发到响应的模块
redirect:一般用于用户注销登录,返回主页面和跳转到其他的网站等。
(4)从效率来说
forward:高
redirect:低
1:Request对象: 客户端的请求被分装在request对象中,通过他才了解用户的需求,然后做出响应。
2:response对象:包含了响应客户请求的有关信息,但是在JSP中很少用到它。
3:session对象:指的是客户端和服务端的一次回话,从客户连到服务器的一个文本Application开始,直到客户端与服务器断开连接为止。
4:out对象:out对象是JSPWriter类的实例,是向客户端输出内容常用的对象。
5:page对象:就是指当前jsp页面本身,有点象类中的this指针。
6:application对象:实现了用户间数据共享,可存放全局变量,它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在。
7:exception对象:是一个例外对象,当一个页面在运行时过程中发生了例外,就产生这个对象。
8:pageContext对象:提供了对jsp页面内所在的对象及名字空间的访问,也就是说他可以访问到本页所在的session,
也可以取本页所在的application的某一属性的值,他相当于页面中所有功能的集大成者。
9:config对象:是在一个Servlet初始化,JSp引擎向他传递信息用的,
此信息包括Servlet初始化所要用到了参数以及服务器的有关信息(通过传递一个ServletContext对象)。
$("document").ready(function(){
$("#btn1").click(function(){
$("[name='checkbox']").attr("checked",'true');//全选
$("[name='checkbox']").removeAttr("checked");//取消全选
$("[name='checkbox']:even").attr("checked",'true');//选中所有奇数
$("[name='checkbox']").each(function(){//反选
var str=""; //输出选中的值
$("[name='checkbox'][checked]").each(function(){
str+=$(this).val()+"/r/n";
alert(str);
});
});
});
})
一:javascript原生的方法
1:拿到select对象:var myselect=document.getElementById("test");
2:拿到选中项的索引:varindex=myselect.selectedIndex ;
3:拿到选中项options的value: myselect.options[index].value;
4:拿到选中项options的text: myselect.options[index].text;
二:jquery方法(前提是已经加载了jquery库)
1:var options=$("#testoption:selected"); //获取选中的项
2:alert(options.val()); //拿到选中项的值
3:alert(options.text()); //拿到选中项的文本
一、基本选择器
1. id选择器(指定id元素)
将id="one"的元素背景色设置为黑色。(id选择器返单个元素)
$(document).ready(function () {
$('#one').css('background', '#000');
});
2. class选择器(遍历css类元素)
将class="cube"的元素背景色设为黑色
$(document).ready(function () {
$('.cube').css('background', '#000');
});
3. element选择器(遍历html元素)
将p元素的文字大小设置为12px
$(document).ready(function () {
$('p').css('font-size', '12px');
});
4. * 选择器(遍历所有元素)
$(document).ready(function () {
// 遍历form下的所有元素,将字体颜色设置为红色
$('form *').css('color', '#FF0000');
});
5. 并列选择器
$(document).ready(function () {
// 将p元素和div元素的margin设为0
$('p, div').css('margin', '0');
});
二、 层次选择器
1. parent > child(直系子元素)
$(document).ready(function () {
// 选取div下的第一代span元素,将字体颜色设为红色
$('div > span').css('color', '#FF0000');
});
2. prev + next(下一个兄弟元素,等同于next()方法)
$(document).ready(function () {
// 选取class为item的下一个div兄弟元素
$('.item + div').css('color', '#FF0000');
// 等价代码
//$('.item').next('div').css('color', '#FF0000');
});
3. prev ~ siblings(prev元素的所有兄弟元素,等同于nextAll()方法)
$(document).ready(function () {
// 选取class为inside之后的所有div兄弟元素
$('.inside ~ div').css('color', '#FF0000');
// 等价代码
//$('.inside').nextAll('div').css('color', '#FF0000');
});
三、 过滤选择器
1. 基本过滤选择器
——1.1 :first和:last(取第一个元素或最后一个元素)
$(document).ready(function () {
$('span:first').css('color', '#FF0000');
$('span:last').css('color', '#FF0000');
});
——1.2 :not(取非元素)
$(document).ready(function () {
$('div:not(.wrap)').css('color', '#FF0000');
});
——1.3 :even和:odd(取偶数索引或奇数索引元素,索引从0开始,even表示偶数,odd表示奇数)
$(document).ready(function () {
$('tr:even').css('background', '#EEE'); // 偶数行颜色
$('tr:odd').css('background', '#DADADA'); // 奇数行颜色
});
——1.4 :eq(x) (取指定索引的元素)
$(document).ready(function () {
$('tr:eq(2)').css('background', '#FF0000');
});
——1.5 :gt(x)和:lt(x)(取大于x索引或小于x索引的元素)
$(document).ready(function () {
$('ul li:gt(2)').css('color', '#FF0000');
$('ul li:lt(2)').css('color', '#0000FF');
});
——1.6 :header(取H1~H6标题元素)
$(document).ready(function () {
$(':header').css('background', '#EFEFEF');
});
2. 内容过滤选择器
——2.1 :contains(text)(取包含text文本的元素)
$(document).ready(function () {
// dd元素中包含"jQuery"文本的会变色
$('dd:contains("jQuery")').css('color', '#FF0000');
});
——2.2 :empty(取不包含子元素或文本为空的元素)
$(document).ready(function () {
$('dd:empty').html('没有内容');
});
——2.3 :has(selector)(取选择器匹配的元素)
$(document).ready(function () {
// 为包含span元素的div添加边框
$('div:has(span)').css('border', '1px solid #000');
});
——2.4 :parent(取包含子元素或文本的元素)
$(document).ready(function () {
$('ol li:parent').css('border', '1px solid #000');
});
3. 可见性过滤选择器
——3.1 :hidden(取不可见的元素)
——3.2 :visible(取可见的元素)
4. 属性过滤选择器
——4.1 [attribute](取拥有attribute属性的元素)
下面的代码,最后一个a标签没有title属性,所以它仍然会带下划线
——4.2 [attribute = value]和[attribute != value](取attribute属性值等于value或不等于value的元素)分别为class="item"和class!=item的a标签指定文字颜色
Jquery中的ajax在默认不写async情况下,请求为异步请求,如果项目中在做一项操作之前要进行ajax的验证,无论同步或者异步,都必须在验证通过后,方才进行其他操作,项目前端做验证,后端也做相应的验证;前端做验证是为了减少服务器压力和增加用户体验,后端做验证才是为了安全.
在全局设置Ajax属性 $.ajaxSetup({ async: false }); 再用post,get就是同步的了
必要参数: url: url,
success:function(data) { //对data值进行判断 }
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址。
2.type: 要求为String类型的参数,请求方式(post或get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。
3.timeout: 要求为Number类型的参数,设置请求超时时间(毫秒)。此设置将覆盖$.ajaxSetup()方法的全局设置。
4.async: 要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为false。注意,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行。
5.dataType: 要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下:
xml:返回XML文档,可用JQuery处理。
html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。
script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。
json:返回JSON数据。
jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。
text:返回纯文本字符串。
6.success:要求为Function类型的参数,请求成功后调用的回调函数,有两个参数。
(1)由服务器返回,并根据dataType参数进行处理后的数据。
(2)描述状态的字符串。
function(data,textStatus){
//data可能是xmlDoc、jsonObj、html、text等等
this; //调用本次ajax请求时传递的options参数
}
7.error: 要求为Function类型的参数,请求失败时被调用的函数。该函数有3个参数,即XMLHttpRequest对象、错误信息、捕获的错误对象(可选)。ajax事件函数如下:
function(XMLHttpRequest, textStatus,errorThrown){
//通常情况下textStatus和errorThrown只有其中一个包含信息
this; //调用本次ajax请求时传递的options参数
}
current当前这次迭代的(集合中的)项
index当前这次迭代从 0 开始的迭代索引
count当前这次迭代从 1 开始的迭代计数
first用来表明当前这轮迭代是否为第一次迭代的标志
last用来表明当前这轮迭代是否为最后一次迭代的标志
begin属性值
end属性值
step属性值
c:forEach如何判断是最后一次循环
适用于 SQLServer
SELECT TOP 页大小 * FROM table1 WHERE id NOT IN(
SELECT TOP 页大小*(页数-1)id FROM table1 ORDER BY id )
ORDER BY id
适用于MySql
select * from table limit (页码-1)*页面大小, 页面大小
适用于oracle(根据ROWID来分)
select * from t_xiaoxiwhere rowid in(
select rid from (
select rownum rn,rid from(
select rowid rid,cid from t_xiaoxi order by cid desc)
where rownum<10000)
where rn>9980)
order by cid desc
Where之后条件有多个值时使用
左外连接:
select a.a, a.b, b.c, b.d, b.f from a LEFT(OUT )JOIN b ON a.a = b.c
left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录.
右外连接:
SELECT * FROM A RIGHT JOIN B ONA.aID = B.bID
Right join是以右表(B)为基础的,A表不足的地方用NULL填充.
1. 分散数据文件,可以提高读写效率:建立多个数据文件,把索引放到独立的文件中等。
2. 及时转储历史数据,提高写性能。
3. 优化程序的SQL语句
事务是指访问并可能更新数据库中各种数据项的一个程序执行单元。
事务的注解:@Transactional;当标于类前时, 标示类中所有方法都进行事物处理,当类中某些方法不需要事物时在方法上添加@Transactional(propagation=Propagation.NOT_SUPPORTED)容器不为这个方法开启事务.
当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL语句是在同一时间共同执行的时,我们就应该为这多条语句定义一个事务。
1. 通过继承Thread类创建线程:
(1) 首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2) 直接创建一个ThreadTest类的对象,也可以利用多态性,变量声明为父类的类型。调用start方法,线程启动,隐含的调用run()方法。
2. 通过实现Runnable接口
(1) 创建线程定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2) 创建Runnable接口实现类的对象。创建一个ThreadTest类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)调用Thread对象的start()方法,启动线程
答:Wait(等待执行)、sleep(延时效果)、interrupt(终止线程)、唤醒wait用notify定时器待做;
JVM:Java虚拟机,jvm是一种用于计算设备的规范,它是一个虚构出来的计算机,是
通过在实际的计算机上仿真模拟各种计算机功能来实现的。
虚拟机可以单独的运行,可以一台电脑都是开多个程序。
Java平台的无关性,就是使用Java虚拟机是实现这一特点的关键。
JVM的工作原理:
(1)java源代码
(2)Java编译器
(3)Java字节码(.clas文件)
(4)字节码本地或网络
(5)类装载器字节码的验证(Java的类库)
(6)(Java虚拟机)Java解释器,即编译器,运行期系统。
(7)操作系统。
(8)硬件
JDK开发工具包
JRE运行时的类库
JVM(Java虚拟机)
JDK包含JRE包含JVM
1:配置数据源 (driverClassName, url , username , password)
2:配置bean(sessionFactoryBean)
3:配置事务(transactionManager)
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架;
Spring mvc是一个MVC开源框架,属于spring,spring需要有spring的架包作为支撑才能跑起来.
aop是面向切面编程,语言、框架的发展都是一步步的分离、解耦的过程,来降低程序之间的依赖性和耦合性,使其达到标准、易维护、易理解、易复用等目的。java中一般会说这样的一句话:“一个方法只做一件事情”。这样易复用、易理解、易维护。但是现在很多方法无法做到只做一件事情,我们的方法除了包含业务逻辑代码外还需要加例如日志、事务等相关操作的代码或代码引用。这样我们一个方法就不是做一件事情,而是做了业务逻辑、日志、事务三件事情。于是我们想办法把日志、事务定义成一个切面,这样可以在代码需要日志和事务的时候切入程序。来达到一个方法只做一件事情的目的。
MVC(模型Model-视图View-控制器Controller)是一种设计模式,当用户发出请求的时候,控制器根据请求来选择要处理的业务逻辑和要选择的数据,再返回去把结果输出到视图层,这里可能是进行重定向或转发等.
模型:模型是应用程序的主题部分,模型表示业务数据或者业务逻辑
视图:视图是应用程序中用户界面相关部分,是用户看到并交互的界面
控制器:控制器工作就是根据用户输入,控制器用户界面数据显示和更新model对象状态。
1).@Controller 负责注册一个bean 到spring 上下文中,bean 的ID 默认为类名,名称开头字母小写,你也可以自己指定
2). @RequestMapping用来定义访问的URL,你可以为整个类定义一个@RequestMapping,或者为每个方法指定一个。 把@RequestMapping放在类级别上,这可令它与方法级别上的@RequestMapping注解协同工作,取得缩小选择范围的效果。@RequestMapping用于整个类不是必须的,如果没有配置,所有的方法的访问路径配置将是完全独立的,没有任何关联。
3).@PathVariable用于方法中的参数,表示方法参数绑定到地址URL的模板
4).@ModelAttribute 应用于方法参数,参数可以在页面直接获取,相当于request.setAttribute(,) ,应用于方法,将任何一个拥有返回值的方法标注上 @ModelAttribute,使其返回值将会进入到模型对象的属性列表中. 应用于方法参数时@ModelAttribute("xx"),须关联到Object的数据类型,基本数据类型 如:int,String不起作用
5).@ResponseBody 直接放在方法上,表示返回类型将会直接作为HTTP响应字节
流输出(不被放置在Model,也不被拦截为视图页面名称)。可以用于ajax。
6).@RequestParam是一个可选参数,例如:@RequestParam("id") 注解,所以它将和URL所带参数 id进行绑定 ;
SpringMVC的拦截器提供了HandlerInterceptorAdapter抽象类,对应提供了三个preHandle,postHandle,afterCompletion方法。
1.用户的发出请求,(比如http:localhost:8080/Struts2/helloworld/helloworldAction.action)请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求。
2.Web容器会去读取helloworld这个工程的web.xml,在web.xml中进行匹配,由struts2这个过滤器来进行处理(也就是StrutsPrepareAndExecuteFilter),根据Filter的配置,找到FilterDispatcher(Struts2的调度中心)
3.然后会获取FilterDispatcher实例,然后回调doFilter方法,进行真正的处理( FilterDispatcher是任何一个Struts2应用都需要配置的,通常情况下,web.xml文件中还有其他过滤器时,FilterDispatcher是放在滤器链的最后;如果在FilterDispatcher前出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前引用Struts2的ActionContextCleanUp过滤器)这时FilterDispatcher会将请求转发给ActionMapper.
4.如果需要Struts2处理,ActionMapper会通知FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,(这也就是为什么,FilterDispatcher应该出现在过滤器链的最后的原因)。然后建立一个ActionProxy实例,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。
5.ActionProxy对象在被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。而真正知道要运行哪个Action的是ConfigurationManager。因为只有它才能读取我们的strtus.xml
6.ActionProxy知道自己该干什么事之后(运行哪个Action、相关的拦截器以及所有可能使用的result信息),然后马上建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。
7.在execute方法之前,好像URL请求中的参数已经赋值到了Action的属性上,然后执行Action的execute方法,然后根据execute方法返回的结果(Result),去struts.xml中匹配选择下一个页面,根据结果(Result)找到页面后,在页面上(有很多Struts2提供的模板),可以通过Struts2自带的标签库来访问需要的数据,并生成最终页面.
使用#{}意味着使用的预编译的语句,可以防止sql注入,在组成sql语句的时候把参数默认为字符串;
使用${}时的sql不会当做字符串处理,是什么就是什么;
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数;如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能
答:是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将Pojo与数据库表建立映射关系,是一个全自动的ORM框架,
hibernate可以自动生成sql语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
根据用户角色取出该角色所有权限,并对用户进行权限分配;
1. 新增用户时,是要根据用户角色进行分配权限的 一定记得批量添加;
2. 修改用户角色也要记得重新分配用户权限;
3. 最后要优化的就是根据用户查询权限,查询角色权限,用户权限,返回到前端,前端进行处理;首先根据 角色ID查询出权限,然后子查询用户是否有该权限,有返回1 没有返回 0;
finereport报表软件的导入报表过程:
读取某一路径下的模板cpt文件,并将其转为WorkBook对象,有两种读取报表的方法:
1.1 绝对路径读取模板
// 读取模板
File cptfile = newFile("C:\\FineReport6.5\\WebReport\WEB-INF\\reportlets\\gettingstarted.cpt");
TemplateImporter tplimp = newTemplateImporter();
WorkBook workbook =tplimp.generateTemplate(cptfile);
1.2 读取报表运行环境下的模板
//定义报表运行环境,读取环境下的报表
String envPath = "C:\\FineReport6.5\\WebReport \\WEB-INF";
FRContext.setCurrentEnv(newLocalEnv(envPath));
TemplateWorkBook workbook =FRContext.getCurrentEnv().readTemplate("gettingstarted.cpt");