前言: 朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
也许男人会犯错 有时也会很冷漠 但是他有多落魄 也能看透你柔弱
也许有人比他好 没有那么多烦恼 可是谁能陪你到老 为你这一生祈祷
Tomcat配置
下载地址: http://tomcat.apache.org/
Mac配置教程:
- http://jingyan.baidu.com/article/ca00d56c549184e99eebcf1e.html
- http://blog.csdn.net/jimjarry/article/details/45076129
sudo chmod 755 /usr/local/apache-tomcat-9.0.0.M13/bin/*.sh
启动Tomcat:
1.$ cd /usr/local/apache-tomcat-9.0.0.M13/bin
2.$ sudo sh startup.sh
关闭Tomcat:
$ sudo sh shutdown.sh
IEDA之环境配置
配置教程
1.http://www.cnblogs.com/nora-xie/p/5835739.html
2.http://www.cnblogs.com/nora-xie/p/5835739.html
匿名内部类实现方法
//匿名内部类实现方法
interface Dao {
public void add();
}
class Outer {
public void print() {
new Dao() {
@Override
public void add() {
// TODO Auto-generated method stub
System.out.println("添加学生");
}
}.add();
}
}
public class Demo4 {
public static void main(String[] args) {
Outer outer = new Outer();
outer.print();
}
}
多线程的两种创建方式
方式一: 继承Thread
- 1.定义一个类继承Thread
- 2.重写Thread的run方法, 把自定义线程任务的代码放在run方法上
- 3.创建Thread类的子类对象, 并且调用start方法开启线程
方式二: 实现Runable接口
- 1.定义一个类实现Runnable接口
- 2.实现Runable的run方法
- 3.创建Runalbe实现类的对象
- 4.创建Thread的对象, 然后把Runable的实现类的对象作为参数传递
- 5.调用Thread对象的start方法开启线程
//1. 创建线程方式一: 继承Thread
class MyThread1 extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
匿名内部类继承Thread创建多线程
public class Demo4 {
public static int count = 100;
public static void main(String[] args) {
new Thread(){
public void run() {
synchronized ("锁") {
while(count > 0){
System.out.println("还剩下" + count + "张票");
count--;
}
}
};
}.start();
}
}
匿名内部类实现Runable接口
public class Demo5 {
public static int count = 100;
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
synchronized ("锁") {
while(count > 0){
System.out.println("还剩下" + count + "张票");
count--;
}
}
}
}).start();
}
}
//2. 创建线程方式二: 实现Runnable接口
class MyThread2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 0; i < 100; i++){
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
public class Demo5 {
public static void main(String[] args) {
//创建多线程方式一: 继承Thread
MyThread1 myThread1 = new MyThread1();
myThread1.start();
//创建多线程方式二: 实现Runnable方法
MyThread2 myThread2 = new MyThread2();
Thread thread = new Thread(myThread2);
thread.start();
}
}
Java中的同步机制
出现线程安全问题的根本原因
1.存在两个或连个以上的线程共享着资源
2.操作资源的代码块必须有语句
1.同步代码块
同步代码块的格式:
synchronized(锁对象){
需要被同步的代码块....
}
同步代码块需要注意的细节
- 1.锁对象可以是任意的对象
- 2.锁对象必须是多线程共享的资源, 否则锁不住
- 3.没有线程安全问题时候不要使用锁, 否则锁不住
- 4.调用sleep方法并不会释放锁对象, 但是调用wait方法的线程就会释放锁对象
2.同步函数
同步函数的格式:
修饰符 synchroized 返回值类型 函数名(形参列表...){
}
注意:
1.同步函数的锁对象不能是任意的, 非静态同步函数的锁对象是this对象, 静态函数的多对象是当前字节码对象
2.同步函数的锁对象不能由你指定,是固定的
单例设计模式
懒汉单例设计模式( 线程安全问题的解决方案 ):
步骤:
1.私有化构造函数
2.声明本类引用类型变量, 但是不要创建对象
3.声明一个公共静态的方法获取本类的对象, 获取之前判断是否创建了本类对象了, 如果已经创建了就不要在创建直接返回即可, 若果还没有创建, 那么就先创建本类的引用类型变量, 然后返回.
public class Single1 {
//创建私有对象, 但不引用
private static Single1 single1;
//创建私有构造函数
private Single1(){
}
public static Single1 getInstance(){
if (single1 == null) {
synchronized ("锁") {
if (single1 == null) {
single1 = new Single1();
}
return single1;
}
}
return single1;
}
}
request的主要API
this.doPost(request,response);
this.doGet(request,response);
//请求行
request.getMethod(); //获取请求方式
request.getRequestURI();//获取请求URI
request.getRequestURL();//获取请求URL
request.getProtocol(); //获取请求http版本
//请求头
request.getHeader("名称"); //根据请求头获取请求值
Enumeration<String> enumeration = request.getHeaderNames(); //获取全部请求头名称
while (enumeration.hasMoreElements()){
String name = enumeration.nextElement();
response.getWriter().write(request.getHeader(name));
}
//实体内容
request.getQueryString(); //通过get方法获取实体数据
request.getInputStream(); //通过post方法获取实体数据
//通过参数名得到参数值
request.getParameter("参数名");
request.getParameterValues("参数名"); //返回一个数组
Enumeration<String> enumeration1 = request.getParameterNames();
while (enumeration1.hasMoreElements()){
String name = enumeration1.nextElement();
response.getWriter().write(request.getParameter(name));
//编码与解码
// name = new String(name.getBytes(iso-8859-1),utf-8);
}
response下载图片
File file = new File("E//:a.jpg");
response.setHeader("Content-Disposition","attachment; filename" + file.getName());
//下载图片\
//发送图片
FileInputStream in = new FileInputStream(file);
byte[] byt = new byte[1024];
int len = 0;
//把图片写到浏览器
while((len = in.read(byt))!= -1){
response.getOutputStream().write(byt,0,len);
}
表单提交:
<form action="提交地址" method="GET/POST">
<form>
GET vs POST 区别
1)GET方式提交
a)地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。
b)GET提交参数数据有限制,不超过1KB。
c)GET方式不适合提交敏感密码。
d)注意: 浏览器直接访问的请求,默认提交方式是GET方式
2)POST方式提交
a)参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分割。
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 28.0px 'PingFang SC'; color: #000000}span.s1 {font: 28.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures}
b)POST提交的参数数据没有限制。
c)POST方式提交敏感数据。
JSP的9大内置对象
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
JSP标签动态设置对象属性
<!-- 创建对象 -->
<jsp:useBean id="stu" class="sz.itcast.entity.Student"></jsp:useBean>
<!-- 赋值 -->
<jsp:setProperty property="name" name="stu" value="jacky"/>
<!-- 获取 -->
<jsp:getProperty property="name" name="stu"/>