servlet学习笔记(一)

jsp实质上也是一种servlet,所以就在这儿一块儿写。

1.若想使某个标签居中,可用<center></center>修饰。如想使按钮居中,则

<center><input type="submit" value="提交"></center>
2.一个重要问题

jsp页面部分代码为:

<form action="CheckServlet" method="post">
	用户名:<input name="username" value="" /><br>
	密码:<input name="password" type="password" /><br>
	两周内自动登录<input type="checkbox" name="autologin" value="1" /><br>
	<input value="登录" type="submit" />
</form>
而CheckServlet的部分代码为:

String name = request.getParameter("username");
String pwd = request.getParameter("password");
String autologin = request.getParameter("autologin");

if(name.equals("admin")&& pwd.equals("123")){
	if(autologin.equals("1")){
		//方法内容
	}
}
但这样写会出问题,在填写表单时,name和pwd都会写,但“两周内自动登录”却不一定勾选。这就可能会出问题,当未勾选该选项时,autologin的值为null,而null没有equals方法,即不能跟其他值作比较,会出错java.lang.NullPointerException。

正确的写法应该是调换顺序,前边name和pwd的也是如此。以后碰到类似情况时,也应该是是“值”在前,变量名在后。该改变自己一直以来错误的写法了。正确的如下:

if("admin".equals(name) && "123".equals(pwd)){
	if("1".equals(autologin)){
		//方法内容
	}
}
这种写法更严谨。

3.cookie简单用法

//声明cookie
String name = request.getParameter("username");
Cookie ck_set = new Cookie("name","admin");//意为cookie中name的值存为admin。这是获取cookie。如果要获取多个就得new多个cookie
ck.setMaxAge(3600);//设置cookie有效时间为一小时
response.addCookie(ck_set);//给浏览器添加cookie


Cookie[] ck_get = request.getCookies();//获取cookie,getCookies()方法得到的是数组
然后用循环取得cookie的值

HttpSession对象。取得session

HttpSession session = request.getSession();

session.getId();//返回相关的session的id
对于session,无需用户创建,直接拿来用即可。当用户打开浏览器时服务器就会给它生成一个sessionId,浏览器要么把这个sssionId放到cookie中,要么每次请求都带在url后边。如:

HttpSession session = event.getSession();
ServletContext application = session.getServlrtContext();
等类似的即可。
只有执行了getSession()才会生成session而cookie可以新建。
获取登陆的用户名可以用:

String uname = (String)session.getAttribute("userName");
4.类的修饰符回顾

private   //同一个类
default   //同一个类 同一个包 
protected //同一个类 同一个包 子类
public    //同一个类 同一个包 子类 所有类
5.注意在用static修饰的方法中不能用this

6.MVC模式,M指model,如entity类中的user,role等。V指view,视图指jsp页面,c指controller,servlet一类

7.

response.getWriter.write();//getWriter是得到输出流,再用write方法把数据写到输出流.
与下边的写法等价

PrintWriter out = response.getWriter();
out.print(某个值);
但分开写的这种方法还有一个好处就是容易扩展,

out.flush();
out.close();
8.上传文件要注意,form内method="post",并且enctype="multipart/form-data"

9.jsp有9个内置对象。这里介绍几个
①request,封装的是来自客户端的数据。若想接收这些数据,则用getParameter()[获取单个值],getParameterNames()[获取数组]
②response是服务器对客户端的响应。
③session是需要在不同的jsp页面保留客户信息时使用,如在线购物等。保存在服务器端。

10.四大作用域对象本质上都是map
①pageScope即pageContext,只在本页面共享数据。

②sessionID放置在cookie内,浏览器关闭session销毁了没?销毁了。更准确的说法就是浏览器关闭后,session还存在于服务器端,只不过当打开新的浏览器时又会创建新的session,并且这两个session是不一样的。服务器端才有session,客户端只是通过sessionId来匹配session。客户端存的是cookie
ssessionID没有有效期时间,放在浏览器内存,所以浏览器关闭,session就销毁。

11.servlet是一种特殊的单例模式,利用享元模式来共享一些数据来节约资源。
servlet的基本流程:若找到servlet实例,就直接使用。若没找到,就根据反射构造servlet对象,根据反射调用service的doGet/doPost方法。

12.服务器端跟客户端发送数据
①请求转发:地址栏不会变

response.getRequestDispatcher(某个页面).forward(request,response);
意为将客户端的请求转向(forward)到getRequestDispatcher()方法中参数定义的页面或者链接。换句话说就是当一个客户端的请求到这个页面后,不做处理或者不处理完,将请求转给另一个页面处理,然后再响应给客户端。利用这个方法参数可以被正确传递。
②重定向:地址栏会变
response.sendRedrict(某个页面);
比如response.sendRedirect("../success.jsp"),利用这个方法如果 跳转前有request.setAttribute("a","b")的话,那么参数是传不到success.jsp的。因为它在客户端重定向到success.jsp,本质上跳了两次,所以参数失效。
13.可以使用getAttribute(String name)获得变量值,

setAttribute(String name,Object value);//将变量值保存到对应的作用域中
若把变量放到pageContext内,说明它的作用域是page,有效范围只在当前jsp页面。从把变量放到pageContext开始,到jsp页面结束,都可以使用这个变量。

销毁session,可以用session.invalidate();

14.el表达式会从4个作用域按从小到大顺序依次取值。如果变量不存在,会输出空字符串"",而不是null,省去了手工判断的工作。

el为Expression Language,可以在jsp页面中禁用,禁用后回以原形式输出。如${username},本来想输出"张三",但输出也为${username}。

禁用el表达式,可以用

<%@ page isELIgnored="true" %>
说到el表达式,又需要说作用域。如果有${username}这一个正则表达式,则它会依次调用pageContext.getAttribute("username")-->request.getAttribute("username")--

>session.getAttribute("username")-->application.getAttribute("username"),最先找到哪个不为空的,就调用出来。但若多个作用域有相同变量,就需要添加作用域。如:

${pageScope.username},${requestScope.username}.

${cookie.name}是获取对应cookie的对象。比如将一段cookie发送给客户端:
Cookie ck = new Cookie("username","username in cookie");
response.addCookie(ck);//把cookie发送到客户端
意为创建一个名称为username,值为"username in cookie"的Cookie对象,然后发送给客户端。
然后${ck.username.name}是获取cookie名称,${ck.username.value}获取cookie值。
15.Class.forName()是惯用写法,可以强制加载指定的类。在连接数据库驱动时经常用到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值