您的位置:首页 > 其它

servlet学习笔记(一)

2013-10-03 17:01 176 查看
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()是惯用写法,可以强制加载指定的类。在连接数据库驱动时经常用到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: