JSP学习笔记(一)

11 篇文章 0 订阅
10 篇文章 0 订阅
1.新建的servlet一般要继承javax.servlet.http.HttpServlet,并且要重写父类方法doGet()和doPost(),在doGet()方法里边,应写上this.doPost(req, resp);使其就算把数据写入doGet()方法,也会被转入到doPost()方法。

2.web.xml里的<servlet-mapping>里的<url-pattern>的内容是什么,并且<url-pattern>里边的内容必须以“/”开头。在浏览器里的地址栏里就写什么,这样才能才能访问到。如:

<servlet-mapping>
  	<servlet-name>FirstServlet</servlet-name>
  	<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>

则地址栏里填写http://localhost:8080/项目名称/FirstServlet,若改为

<url-pattern>/aa</url-pattern>
则地址栏改为http://localhost:8080/项目名称/aa


3.在Myeclipse里面修改项目名称没有那么简单,既使用F2在myeclipse修改了项目名,但由于实际上运行的是tomcat里边的项目,所以虽然我们看到改名成功了,但按新项目名运行时会报404错误。因为tomcat里边的项目名称没改。正确的做法是:右键单击项目名,选择properities--->myeclipse-->web,在web context-root里边修改想要的名字,这样才能成功。最后再重新部署项目即可。

4.servlet的生命周期
实例化:用init方法,只会在第一次请求的时候初始化,并且只被实例化一次。
执行:每个请求new一个新的线程,调用一遍。(PS:不要在servlet中设计成员变量。因为多个请求会共享线程,可能发生资源冲突问题。)
销毁:卸载前调用destory方法。

5.单例模式:只能被实例化一次。单例的目的是希望对象只创建一个实例,并且提供一个全局的访问点。

两种重要的单例模式(饿汉式、懒汉式)

class Singleton{//饿汉式
	private static Singleton instance = new Singleton();
	//不管怎样,先创建一个实例。使用private是防止外部对象new出新的单例,因为单例只能有一个。

	private Singleton(){}
	public static Singleton getInstance(){return instance;}
	//提供一个公共的静态方法来访问该实例,只有使用静态方法,外部才能调用

}


class Singleton{//懒汉式
	private static Singleton instance = null;
	private Singleton(){}
	public Sigleton getInstance(){
		if(instance==null){
			instance = new Singleton();
		}	
		return instance;
	}
}

比较:
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,饿汉式无需关注多线程问题.
懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的


6.<init-param>是写在web.xml用来初始默认值的。需要注意的是<init-param>标签内容必须写到<servlet>中,这样才能被找到。如web.xml有

<servlet>
  <init-param>
  	<param-name>k1</param-name>
  	<param-value>10</param-value>
  </init-param>
  <init-param>
  	<param-name>k2</param-name>
  	<param-value>20</param-value>
  </init-param>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.bjsxt.test.servlet.FirstServlet</servlet-class>
</servlet>
而在相应的servlet中,有
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("第一个Servlet程序");
	}

	
	//servlet的生命周期,使用init加载	
	public void init(ServletConfig config) throws ServletException {
		String k1 = config.getInitParameter("k1");//这是直接获取<init-param>里的值
		String k2 = config.getInitParameter("k2");
		System.out.println(k1 + "-----" + k2);
		
		//这里使用枚举获取并列出元素
		Enumeration<String> en = config.getInitParameterNames();		
		while(en.hasMoreElements()){
			String name = en.nextElement();
			String val = config.getInitParameter(name);
			System.out.println("你好"+val);
		}
	}

则输出结果为:

10-----20
你好10
你好20
第一个Servlet程序
从这里可以看出:servlet执行时,先加载init里边的内容,然后再执行doPost()方法。

7.request封装了客户端所有信息的一个对象,response封装了服务器发送到客户端所有信息的一个对象。

获取单个内容,用

String name = getParameter("name");
获取多个同名不同值的内容,如获取checkbox里的,则用

String[] favs = getParameterValues("favourites");//注意为数组形式

8.如果出现乱码,则有两种方式解决:

①统一转码:在servlet中写

request.setCharacterEncoding("utf-8");
②硬转码:将获取的每个字段分别转码,比较麻烦。如:
String str = new String(username.getBytes("iso8859-1"),"utf-8");
9.web编程一般分成多层,例如可写成以下几层,但不仅限于此:
①com.bjsxt.entity
主要封装一些实体类,就是对象。如user
②com.bjsxt.servlet
封装一些方法,包括对实体类的操作
③com.bjsxt.util
封装一些常用到的公用方法,也可以有操作数据库的。如这里可写testReflect
④com.bjsxt.dao

封装连接数据库的方法,一些sql语句

10.事实证明,在mysql中sql语句进行操作时字符串既可以用双引号"",也可以用单引号''

11.在jdbc中,sql语句中可出现“?”,是占位符,代表数据参数。如:

String sql = "insert into dept values(null,?,?)";
在后边
ps.setInt(1,deptNo);
ps.setString(2,depName);
的代码中,“?”的值就赋给了deptNo和deptName,而null表示为自增列赋值,不用管。id自增,插入的时候就不需要插入ID这个字段了。
插入数据的的时候必须为主键赋值,而主键id为自增列,所以赋值为null就行。即如果id是自动增长型的,不能设置id的值,要为null

12.substring(1);表示截取字符串,从第一个开始一直截到最后一个
13.补充反射机制
getName()获取类的完整名称。//如得到com.bjsxt.entity.User

getDeclaredFields()获取类的所有属性。//如获取user类的name,id,sex等
getFields()获取类中修饰符为public的属性,若修饰符为private,则不打印。//如user类中private属性有name,sex,public的为QQ,则只会获取QQ

getDeclaredMethods():获得类中所有方法,不管输public还是private修饰
getMethods()获取类中所有修饰符为public的方法。//如获取getAge(),setName()等

getConstructors():获得类中修饰符为public类型的构造方法。
补充一句:若想使用Class实例化其他类的对象,则在写构造函数时,必须自己定义无参构造函数,否则会报错

newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

14.这里再写一遍,executeQuery执行select语句(query有“疑问、查询”的意思),executeUpdate执行update,insert,delete的更新操作。

15.prepareStatement和Statement区别

①创建时的区别,PreparedStatement对象创建时必须加入sql语句

Statement stmt = conn.createStatement();
PreparedStatement ps = conn.prepareStatement(sql);
②执行时的区别
ResultSet rs = stmt.executeQuery(sql);
ResultSet rs = ps.executeQuery();
注意sql语句放置位置不同,开发中尽量使用PrepareStatement
在PrepareStatement中,sql字符串中可包含问号“?”,这些问号标明变量的位置,然后提供变量的值,最后执行语句。如:
String sql = "select * from user where id = ? and name = ?";
preparedstatement ps = conn.preparestatement(sql);
ps.setInt(1,id);
ps.setString(2,name);
resultset rs = ps.executequery();//执行sql语句 
16.执行JDBC操作的写法很固定:
①加载驱动程序

Class.forName(com.mysql.jdbc.Driver);
②连接数据库
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root")
//其中,test为数据库名称,第一个root为超级用户账号,第二个root为密码
③利用Connection来创建一个PreparedStatement对象
String sql = "insert into user values(null,?,?,?,?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
④执行查询语句
ResuktSet rs = ps.executeQuery();

当执行修改、删除等动作时,也可以写相应的sql语句,最后用ps.executeUpdate()来执行。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值