JSPServlet笔记.docx
- 文档编号:29249177
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:53
- 大小:93.73KB
JSPServlet笔记.docx
《JSPServlet笔记.docx》由会员分享,可在线阅读,更多相关《JSPServlet笔记.docx(53页珍藏版)》请在冰豆网上搜索。
JSPServlet笔记
1、利用(http)Servlet的(http)ServletSesponse对象将内容写入到web中
response.setContentType(“text/html”);
PrintWriterout=response.getWriter();//取得PrintWriter对象
out.println(//输出到网页的内容);
response.setContentType("text/html;utf-8");//告诉浏览器选择UTF-8编码方式
response.setCharacterEncoding("utf-8");//设置字符编码格式为UTF-8
2、servlet为单例模式,只会创建一个实例为多个用户共享,即只会调用一次init(),直到销毁。
3、
(1)因为servlet为单例,用户共享servlet对象的成员变量,所以需要一个成员变量为多个用户共享时,应当进行线程同步,防止最后一张票被多个人买到。
(方法里的局部变量不存在此问题)
synchronized(this){
if(ticket>0){
//买到了票
Ticket--;
}
Else{
//没有买到票
}
}
(2)如果一个变量不需要共享,则直接在doGet()或者doPost()定义,这样不存在线程安全问题。
4、servlet配置中的
当我们的网站启动时,可能会需要初始化一些数据。
利用
(没指定的servlet在用户访问时创建)
自动创建的servlet没必要配置
5、ServletConfig对象读取servlet配置的
—在该servlet配置的信息只能在该servlet中访问-->
在servlet中调用this.getServletConfig().getInitParameter(“name”)获取配置中相对应的value
利用
6、MVC中controller接收view中的数据
view:
controller:
Stringname=request.getParameter(“name”);
7、通过request获取HTTP请求信息
request.getHeader(“要获取的内容”);
//获取主机名
Stringhost=request.getHeader(“Host”);
8、利用referer防止盗链
HTTP请求信息中的Referer:
告诉服务器我来自哪里
Stringreferer=request.getHeader(“Referer”);
if(referer==null||!
referer.startsWith(“合法URL,如本网站URL”)){
//跳转到错误页面
}
9、定时跳转到页面/定时刷新本页面
HTTP响应里的消息头中的Refresh:
1?
;url=2?
response.setHeader(“Refresh”,”1?
url=2?
”);
1?
:
时间,单位秒
2?
:
要跳转的页面URL,如果要刷新本页面则写本页面的URL
10、利用文件输入输出流让用户下载文件
response.setHeader(“Content-Disposition”,”attachment;filename=文件名”)
//获取文件全路径
Stringpath=this.getServletContext().getRealPath(“/包/文件名”)
FileInputStreamfis=newFileInputStream(path);
bytebuff[]=newbyte[1024];
intlen=0;//实际读取的字节数
OutpurStreamos=response.getOutputStream();
while((len=fis.read(buff))>0){
os.write(buff,0,len);
}
of.close();
fis.close();
如果文件名是中文,则有可能会显示乱码,应该对文件名进行编码转换
Stringtemp=.URLEncoder.encode(“文件名”,”UTF-8”);
response.setHeader(“Content-Disposition”,”attachment;filename=temp”);
11、让浏览器缓存网页多长时间/不缓存网页
HTTP响应里的Expires:
?
Cache-Control:
?
Pragma:
?
告诉浏览器缓存方式
//指定该页面部缓存IE
response.setDateHeader(“Expires”,-1);
//为了保证兼容性
response.setHeader(“Cache-Control”,”no-cache”);
response.setHeader(“Pragma”,”no-cache”);
//缓存指定时间,这里演示一天
response.setDateHeader(“Expires”,System.currentTimeMillis()+3600*1000*24);
System.currentTimeMillis():
获取当前时间的毫秒数
3600*1000*24:
3600秒,1000毫秒,24小时
12、HttpServletResponse中getWriter()和getOutputStream()区别
getWriter()用户向客户端回送字符数据
getOutputStream()返回的对象,可以回送字符或字节(二进制)数据
PrintWriterout=response.getWriter();
out.println(String);
OutputStreamos=response.getOutputStream();
os.write(String.getBytes());
注意:
这两个流不能在同一个response对象中同时使用,因为在服务器检测到第一个流对象时,就会把out.println()里的信息封装到response里面返回给web服务器,然后web服务器拆解response的信息,生成http响应返回给浏览器,之后web服务器就回去检测response相关的流(第一个流)是否关闭,如果没有关闭,则关闭。
这就造成了第二个流不能成功输出。
这也是我们在servlet中使用流对象而没关闭,servlet没有报错的原因。
13、sendRedirect()重定向并传参数
sendRedirect(“/包/servleturl?
parameter=value”);GET请求
获取参数
Stringparam=request.getParameter(“parameter”);
此方法只能传字符串,不能传对象
要传多个参数用&分开
14、使用session对象传参数
request.getSession().setAttribute(“sessionParam”,value);
获取参数//要转型
Stringparam2=(String)request.getSession().getAttribute(“sessionParam”);
此方法能传字符串,也能传对象
15、中文乱码处理
产生中文乱码的三种情况处理
①表单form
post
//在获取Post参数之前设置编码方式
request.setCharacterEncoding(“utf-8”);
Stringvalue=request.getParameter(“param”);
get
//告诉浏览器数据以ISO-8859-1方式接收,并转换成UTF-8
Stringvalue=newString(request.getParameter(“param”).getBytes(“iso-8859-1”),”utf-8”);
②超链接 param=中文”>test 超链接本质上是GET一样,处理方式也和GET一样 ③sendRedirect(“URL? param=中文”) 16、获取用户通过表单提交的内容 Stringvalue=request.getParameter(“param”); //checkbox复选框 String[]values=request.getParameterValues(“param”); 17、将一个servlet的请求转发给下一个servlet(将数据放入到request域对象中) request.setAttribute(“paramName”,paramvalue); request.getRequestDispatcher(“/servletURL”).forwaed(request,response); 获取请求的参数 Stringvalue=request.getAttribute(“paramName”); 18、servlet连接数据库步骤(MYSQL) 把数据库驱动(jar)放到WEB-INF下的lib文件夹中 Connectionconn=null; ResutSetrs=null; PreparedStatementps=null; try{ //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.得到连接 conn=DriverManager.getConnection (“jdbc: mysql: //localhost: 3306/数据库名”,“username”,“password”); //3.创建PreparedSatement //查询 ps=conn.prepareStatement(“select*fromtablewherecolumn=? andcolumn2=? ”) //给? 复制,第一个? 为NUMBER类型,第二个问号为VARCHAR2类型 ps.setInt(1,int); ps.setString(2,String); //通用设置,setObject,会自动帮你转换 ps.setObject(1,int|String|…); //4.执行操作 rs=ps.execteQuery(); //5.根据结果做处理 //rs.next()有结果返回true,否则返回false while(rs.next()){ Stringcolumn=rs.getInt (1); Stringcolumn2=rs.getString (2); … } }catch(Exceptione){ e.printStackTrace(); }finally{ //关闭资源,后打开的先关闭 if(rs! ==null){ try{ rs.close(); }catch(SQLExceptione){ e.printStackTrace(); } //如果上面抛出异常,则让rs=null,让垃圾回收机制处理 rs=null; } if(ps! ==null){ try{ ps.close(); }catch(SQLExceptione){ e.printStackTrace(); } ps=null; } if(conn! ==null){ try{ conn.close(); }catch(SQLExceptione){ e.printStackTrace(); } conn=null; } } 19、完整的JDBC连接数据库 JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驱动程序类 ,加载驱动失败! "); e.printStackTrace() ; } 成功加载后,会将Driver类的实例注册到DriverManager类中。 2、提供JDBC连接的URL 连接URL定义了连接数据库时的协议、子协议、数据源标识。 书写形式: 协议: 子协议: 数据源标识 协议: 在JDBC中总是以jdbc开始 子协议: 是桥连接的驱动程序或是数据库管理系统名称。 数据源标识: 标记找到数据库来源的地址与连接端口。 例如: (MySql的连接URL) jdbc: mysql: //localhost: 3306/test? useUnicode=true&characterEncoding=gbk; useUnicode=true: 表示使用Unicode字符集。 如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。 characterEncoding=gbk: 字符编码方式。 3、创建数据库的连接 要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。 使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。 例如: //连接MySql数据库,用户名和密码都是root String url = "jdbc: mysql: //localhost: 3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("数据库连接失败! "); se.printStackTrace() ; } 4、创建一个Statement •要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型: 1、执行静态SQL语句。 通常通过Statement实例实现。 2、执行动态SQL语句。 通常通过PreparedStatement实例实现。 3、执行数据库存储过程。 通常通过CallableStatement实例实现。 具体的实现方式: Statement stmt = con.createStatement(); PreparedStatement pstmt = con.prepareStatement(sql) ; CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ? )}"); 5、执行SQL语句 Statement接口提供了三种执行SQL语句的方法: executeQuery 、executeUpdate 和execute 1、ResultSet executeQuery(String sqlString): 执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。 2、int executeUpdate(String sqlString): 用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如: CREATE TABLE和DROP TABLE等 3、execute(sqlString): 用于执行返回多个结果集、多个更新计数或二者组合的 语句。 具体实现的代码: ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ;boolean flag = stmt.execute(String sql); 6、处理结果 两种情况: 1、执行更新返回的是本次操作影响到的记录数。 2、执行查询返回的结果是一个ResultSet对象。 ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。 使用结果集(ResultSet)对象的访问方法获取数据: while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString (1) ; // 此方法比较高效 } (列是从左到右编号的,并且从列1开始) 7、关闭JDBC对象 操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反: 1、关闭记录集 2、关闭声明 3、关闭连接对象 if(rs ! = null){ // 关闭记录集 try{ rs.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(stmt ! = null){ // 关闭声明 try{ stmt.close() ; }catch(SQLException e){ e.printStackTrace() ; } } if(conn ! = null){ // 关闭连接对象 try{ conn.close() ; }catch(SQLException e){ e.printStackTrace() ; } } 20、登陆系统连接数据库后判断用户是否登陆成功 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM USERWHRERUSER=’username’ANDPASSWORD=’password’"); 用结果集rs判断用户是否合法 if(rs.next()){ //跳转到登陆成功的页面 request.getRequestDispatcher(“/MainFrame”).forward(request,response); }else{ //跳转到登陆页面并提示用户名或密码不正确 //将错误提示放入request域中 request.setAttribute(“error”,”用户名和密码错误! ”); request.getRequestDispatcher(“/Login”).forward(request,response); } //loginPage: StringerrInfo=(String)request.getAttribute(“error”); if(errInfo! =null){ out.println(“errInfo”); } 21、request.getAttribute()和request.getParameter()区别 (1)当两个Web组件之间为链接关系时,被链接的组件通过getParameter()方法来获得请求参数,例如假定welcome.jsp和authenticate.jsp之间为链接关系,welcome.jsp中有以下代码: username=weiqin">authenticate.jsp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JSPServlet 笔记