版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目一、Servlet概 B/S架构(了解 什么是 什么是 使用MyEclipse开发 Servlet是如何运行 二、HTTP协 什么是HTTP协 数据格 TCP/IPMonitor的使 get请求与post请 如何请求参 案例:添加员工(MySql数据库 异常 三、编码问 编 Servlet如何输出中 四、重定 两个特 五、 什么是 工厂 六、工厂设计模 七、Servlet容器处理细 八、Servlet的生命周 实例 初始 就 销 Servlet生命周期 九、JSP(简要介绍,详细内容见JSP笔记 什么是 JSP与Servlet的关 如何写一个JSP文 JSP是如何运行 指 十、请求转 案例:修改6.4案例中step7中的 十一、异常的处 用输出流 案例:将10.9案例中的step3中的所有catch块修 十二、路径问 十三、状态管 查询 案例:写一个 如何创建一个session对 session的超 用 url重 session的优 session的缺 十四、过滤 优 十五、 Servlet上下文的作 十六、上传文 十七、Servlet线程安全问 十八、Servlet小 Servlet基 Servlet 十九、其他注意事 知名C/S架构: B/S架构 一、Servlet概述B/S架构(了解B/Sweb浏览器,客户端跟服务器之间使用HTTP协议;C/S②开发相对简单;C/S架构需要我们分别在,客户端和服务器端编写相应的通信处Web服务器已经包含了相应的通信模块了。什么是web静态资源(html文件写好(即需要依据请求参为了让这些web杂(因为需要程序员自己去分析请求参数、性能不佳(Web服务器收到请求之后,CGI进程来处理请求、CGI程序依赖平台(可移植性不好。serverebServlet容器发送请求,Servlet容器负责解析请求数据包。当然,也包括网络通讯相关的一些ServletWeb服务器来使用。什么是TomcatServletServlet运行环境的一个程序,但是Tomcat8080。安装 cd/home/soft01vicd/home/soft01vicdcdhome/soft01/tomcatshstartup.shshcatalina.shcdhome/soft01/tomcatcdhome/soft01/tomcatsh②Windows系统下安装和配置的步骤) PATH(可以不配置。 “srup.at “dwn.a 如何写一个Servlet(不使用开发工具publicoWorldServletextendsHttpServletpublicoWorldServletextendsHttpServletthrowsout输出时,使用指定的编码格式进行编码step2step2:执行编译操作:javacd o/**out.close()不调用也可以,因为Servlet方法执行完毕,容器会自动调用out.close方法*/ -d.把Tomcat安装 中common中lib中的servlet-api.jar和刚编写类放一起(是编译时需要用的jar再次编译:javac-cpservlet-api.jar-d.oWorldServlet.java,其中-cpservlet-api.jar表示告诉Java编译器去哪里找需要的class文件(到servlet-api.jar的jar包中找。|--web.xml(url-<?xmlversion="1.0"<?xmlversion="1.0"encoding="UTF-<web-appversion="2.4"根元素" <url- o</url-pattern><!-- 下step3创建的文件夹使用jar.war为后缀的文件,step5:启动Servlet容器,ServletMyEclipsestep1MyEclipseMyEclipse能够管理Tomcat点击上的“Run/Stop/RestartMyEclipseServers”图标旁边的下拉箭头,选择“ConfigureServer“eeenes“Myclipse
ervrs
oca
注意事项:选择你目前电脑上TomcatTomcat5nabe(Disable点击“Tomcathomedirectory”之后的“Browse”按钮,选择Tomcat主 然后“Tomcatbasedirectory”和“Tomcattempdirectory”自动生成,点击“OKJDKTomcatLaunch--“TomcatlaunchmodeRunmodel,默认为Debugmode而该模式在有些时候会显示不正常。回到上的“Run/Stop/RestartMyEclipseServers”图标旁边的下拉箭头,选择Tomcat5.x,点击“Start当在控制台显示“ServerstartupinXXXms“,则TomcatTomcatshutdown命令,关闭之前开启的TJDK默认,点击“Finishstep3Java类和web.xml1)点击“DeployMyEclipseJ2EEProjecttoServer”按钮。2)弹出框“ProjectDeployments,点击“Add”按钮。”5.x“Finish”②“Remove”按钮:删除Tomcatstep5:Tomcat服务器上的Servlet实例IDEServlet的开发步骤:1java类手动234步部署不用手动拷贝,点一下第5步启动服务器,servlet手动WebContextrootRULServlet是如何运行的 o为请求资源路径step1ipportServletstep2:浏览器将请求数据打包(http协议的要求,将相关数据封装成一个数据包,一般称之为请求数据包)Servlet容器。response对象。 step5:ServletServletservicerequest对responseserviceServlet对象。step6:Servletrequestresponsestep7:Servlet容器response对象上的数据,然后将处理结果打包(响应数据包)并发送常见错误及解决方式确处理了请求,404的意思是说:服务器依据请求资源路径,找不到对应的资源。解决:①依据检查你的请求地址是否正确②仔细检查web.xmlservlet-nameweb.xml,类名要填写正确。3)405service方法。案例:根据请求次数显示结果和显示当前时间eg1:在地址栏输入后,获得5个opublicvoidservice(HttpServletRequestpublicvoidservice(HttpServletRequestHttpServletResponseHttpServletResponseresponse)throwsStringqtyStr=request.getParameter("qty");intqty=Integer.parseInt(qtyStr);//转成整数Stringrs=""; for(inti=0;i<qty;i++){//处理请求,生成处理结果 o //content-type,告诉浏览器返回的数据类型是一个html文档 step1:Java类中写publicpublicvoidservice(HttpServletRequestHttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();//通过响应对象,获得一个输出流Datedate=newDate();SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-String 二、HTTP协议什么是HTTP协议定,它定义了浏览器(或者其他客户端)Web服务器之间通讯的过程及数据格式。通讯的过程(Socketstep2:浏览器要将请求数据打包(请求数据包Web服务器。step3:Web服务器将处理结果打包(响应数据包step4:Web服务器关闭连接。注意事项:特点:一次请求,一次连接。优点:Web服务器可以利用有限的连接个数为数据格式面,如果请求方式为get,浏览器会将请求参数添加到请求资源路径的后面。1MyEclipseTCP/IPMonitor,TCP/IPMonitor相当于一个TCP/IPMonitor的使用理端!执行完毕,即可查看TCP/IPMonitor出现的内容。get请求与post请求 ②点击地址③表单默认的提交方法:<formmethod="get(默认)/post">。2)post方法发请求:postget①get限(也就是地址栏的最长字节数get请求只能提交少量的数据。址post②post请求不会将请求参数显示在浏览器地址栏,相对安全一些。但是,post请求并不会对请求参数进行加理。用HTTPS协议进行加理。Java如何请求参""[]数据库(MySql)MySqlMySql:mysqluroot;//mysql,使用root③创建一个新的数据库:createdatabasedb_changdefaultcharactersetutf8;//创建db_changutf8编码集(-④使用某个数据库:use droptabletablname;//删createcreatetablenameidintprimarykeysalaryageint一个唯一的值(Oraclesequence使用JDBC数据step1JDBC驱动放到WEB-INF\lib案例:添加员工(MySql数据库<formaction="addempmysql"<formaction="addempmysql" :<input薪水:<input :<input ConnectionConnectiontry{Class.forName("com.mysql.jdbc.Driver");Statementstate=conn.createStatement();ResultSetrs=state.executeQuery("select*fromchang_emporderbyid");out.println("<tableborder='1'width='60%'cellpadding='0'cellspacing='0'>"); longid=rs.getLong("id"); Stringname=rs.getString("name");doublesalary=rs.getDouble("salary"); intage=rs.getInt("age");out.println("<tr><td>"+id+"</td><td>"+name+"</td><td>"+salary+"</td>"+ }catch(Exceptione) }finally{if(conn!=null){try{}catch(SQLExceptione){e.printStackTrace(); StringStringsalaryStr=request.getParameter("salary");StringStringsalaryStr=request.getParameter("salary");StringConnectionconn=null;//将员工信息插入到数据库tryClass.forName("com.mysql.jdbc.Driver");/**此处不妥~若插入中文数据,会出现乱码*/PreparedStatementprep=conn.prepareStatement(prep.setString(1,nameStr); prep.setDouble(2,Double.parseDouble(salaryStr));prep.setInt(3,Integer.parseInt(ageStr)); out.println("<ahref='addEmpMySql.html'>再次添加</a>");//不使用重定向 }catch(Exceptione)/**异常发生之后,首先记录日志,一般会将日志记录到文件里面,可以用一些日志工log4j来记录*/异常,比如:数据库服务停止、连接数据库的网络中断等*/ //与step2相同,此处略 step4:web.xml内容(为了省纸,采取如下格式) 异常:IllegalStateException出现如下错误可以不用理会,是因为Tomcat三、编码问题Java语言在内存当中默认使用的字符集编码Unicode这种编码格式对应的字节数组。ISO-8859-11Servlet如何输出中文用来指定编码格式,只要支持中文即可,比如也可设置为charset=gbk如果表单有中文参数值,也需要注意编码问题码格式进行编码,而服务器默认情况下,会使用ISO-8859-1去,所以,会产生乱码问<metahttp-equiv="content-typecontent="text/html;charset=utf-8"已是一种规范(模content-type消息头,告诉浏览器正在解析的数据类型和编码格式。step2request.setCharacterEncoding("utf-8");意思是告诉服务器,使用指定的编比如:Stringname=比如:Stringname=newString(name.getBytes("iso-8859-1"),"utf-案例:根据请求正确显示中文<formmethod="post"<formmethod="post" o"请输入数量:<inputname="qty"/>打招呼的人:<inputname="uname <inputtype="submitvalue="确定StringqtyStr=request.getParameter("qty");//读请求参数值intqty=Integer.parseInt(qtyStr);//转成整数StringunamenewString(uname.getBytes("iso-8859-1"),"utf-8");//方式二Stringrs="";//处理请求,生成处理结果++){"++"</行编码*/PrintWriterout=response.getWriter();//通过响应对象,获得一个输出流将中文数据插入到数据库程序从内存Unicode编码格式>MySql的数据库时设置编码:createdatabasedb_changdefaultcharactersetstep2:JDBC驱动必须能够正确地进行编码和 。有些MySql的驱动不能够正确进行编码和(默认使用ISO-8859-1进行编码和可以在JDBC的URL后添加:“useUncoe=rechrcMySql的数据库时设置编码:createdatabasedb_changdefaultcharactersetMySql客户端也是一个程序,也会有编码问题,若你的程序中数据显示正常,MySql客户端中查询的数据为乱码,则更改下编码,使用:setnamesgbk;命四、重定向什么是重定向302Location消息头(值是一个地址,称为重定向地址如何重定向注意两个问题response对象上缓存的数据。Servlet只允许同时发送两个特点404重定向原理图:以2.8案例为例五、什么是如何写一个为了方便对数据库中的记录进行操作而封装的一个普通的Java为了方便对数据库中的记录进行操作而封装的一个普通的Java类。比如,有一个表chang_emp,可以根据表中的字段设计一个Employee类,属性名与表中的字段名相同,且有get/set方法。step2:DAO接publicList<Employee>findAll()throwsSQLException;//错误的!因为限制了只能是用JDBC来实现,SQLException是JDBC的错误>>()step4:DAO过DriverManager工厂类获得一个符合Connection接口要求的对象conn工厂类六、工厂设计模式什么是工厂使用工厂设计模式的好处(如何使用工厂模式现在做这样一个假设,假如我们的底层数据不再使用JDBC,而采用Hibernate(框EmployeeDAO增加一个实现案例:为2.8案例添加新功能,并使用DAO和工厂模式publicstaticConnectionpublicstaticConnectiongetConnection()throwsException{Connectionconn=null;try{Class.forName("com.mysql.jdbc.Driver");}catch(Exceptione){e.printStackTrace();returnconn;publicstaticvoidclose(Connectionthrowe;} try }catch(SQLExceptione)}}publicList<Employee>findAll()throwspublicList<Employee>findAll()throwsException;publicvoidadd(Employeee)throwsException;publicvoiddelete(longindex)throwsException;publicvoidmodify(Employeee)throwsException;publicEmployeefindById(longid)throwsstep4DAO接口的实现类publicpublicList<EmployeefindAllthrowsException{//查找所有员工List<Employee>employees=newArrayList<Employee>();Connectionconn=DBUtil.getConnection();StatementResultSetrs=state.executeQuery("select*fromchang_emporderbyid"); intid=rs.getInt("id"); Stringname=rs.getString("name");doublesalary=rs.getDouble("salary");intage=rs.getInt("age");Employeee=newEmployee(); returnemployees; publicvoidadd(EmployeeethrowsException{//Connectionconn=DBUtil.getConnection();PreparedStatementprep=conn.prepareStatement("insertintochang_emp(name,salary,age)value(?,?,?)");prep.setString(1,e.getName()); prep.setDouble(2,e.getSalary());prep.setInt(3,e.getAge()); publicvoiddelete(longindex)throwsException{//删除员工ConnectionPreparedStatementprep=conn.prepareStatement("deletefromchang_empwhereid=?");prep.setLong(1,index); publicvoidmodify(EmployeeethrowsException{//Connectionconn=DBUtil.getConnection();PreparedStatementprep=conn.prepareStatement("updatechang_empsetname=?,salary=?,age=?"whereid=?");prep.setString(1,e.getName()); prep.setDouble(2,e.getSalary());prep.setInt(3,e.getAge()); prep.setLong(4,e.getId()); publicEmployeefindById(longidthrowsExceptionidConnectionPreparedStatementprep=conn.prepareStatement("select*fromchang_empwhereid=?");prep.setLong(1,id); ResultSetrs=prep.executeQuery(); Employeee=null;if(rs.next()){e=newEmployee(); returne; publicstaticObjectpublicstaticObjectgetInstance(Stringtype){Objectobj=null;obj=new/**obj=newEmployeeDAOHibernateImpl();当不再使用JDBC连接数据库时如HibernateI连接时,就需要更改每个newEmployeeDAOJdbcImpl();不方便。使用工厂模式就可以统一更改了*/ return step6AddEmpMySql.javatry块,finally块也不需要了(DAODBUtil的try{try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");Employeee=new }step7ListEmpServlet.javatry块,finally块也不需要了(DAODBUtil的trytry{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");List<Employee>Employees=newArrayList(); "<tableborder='1'width='60%'cellpadding='1'cellspacing='1'>");out.println("<tr><td>id</td><td></td><td>薪水</td><td></td>"+for(inti=0;i<Employees.size();i++){ Employeee=Employees.get(i);"<td><ahref='del?id="+e.getId()+">删除</a>& ;"+ longid=Long.parseLong(request.getParameter("id"));try{EmployeeDAOdao=(EmployeeDAO) longid=Long.parseLong(request.getParameter("id"));try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO"); }catch(Exception out.println("删除失败!请稍后再试!");} longid=Long.parseLong(request.getParameter("id"));try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");Employeee=dao.findById(id); out.println("<formaction='modify?id="+id+"'method='post'>");out.println("id:"+id+"<br/>"); :<inputname='name'value='"+e.getName()+"'/><brout.println("薪水:<inputname='salary'value='"+e.getSalarybrout.println(":<inputname='age'value='"+e.getAge()+"'/><br/>");//或out.println("<inputtype='hidden'name='id'value='"+id+"/>");out.println("<inputtype='submit'value='确定'/>"); }catch(Exception PrintWriterout= PrintWriterout=response.getWriter();longid=Long.parseLong(request.getParameter("id"));Stringname=request.getParameter("name");doublesalary=Double.parseDouble(request.getParameter("salary"));intage=Integer.parseInt(request.getParameter("age"));try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");Employeee=newEmployee(); }catch(Exceptione){ 七、Servlet容器处理细节Servlet容器如何处理请求资源路径以及匹配step1:Servlet容器会先假设的是一个Servlet,会依据应用名(appname)找到应用所在的文件夹,然后找到web.xml文件。“*:<url-pattern>/*</url-pattern>3)后缀匹配:使用“*.”开头,后接任意的字符串,比如:<url- 正 正step3:如果都不匹配,则容器认为的是一个静态资源文件(比如html文件,然后容器404。一个Servlet如何处理多种请求step2String八、Servlet的生命周期Servlet的生命周期的含义ServletServletServletServlet对Servlet对象的整个过程。Servlet生命周期的四个阶段实例化2:容器事先(容器启动时)Servlet(load-on-startup参数)对数加在web.xml配置文件里的某个<servlet>里,如<load-on-startup>1</load-on-startup>初始化init方法:①init②GenericServlet已经实现了init方法,该方将容器创建好的ServletConfig对象init方法。③ServletConfig对象提供了一个getInitParameter方法来Servlet的初始化参数step1④如果GenericServlet的init(override)init()方法,覆盖的是不带参数的,对有参数的无影响。有参数的init方法执行时,同时无参的也被执行(initinit方法,叫钩子方法。就绪HttpServlet的doGet,doPost方法选择二:覆盖HttpServletservice方法销毁Servlet生命周期图ServletServlet在服务器调用destroy()Servlet实例的init()Servlet②③④new(实例化init(初始化service(就绪destroy(销毁Servlet生命周期相关的几个接口与类Servletinit(ServletConfigconfig)//init②service(ServletRequestreq,ServletResponseres) 2)GenericServletServletinit,destroy方法3)HttpServletGenericServletservice方法4)ServletConfig接口:StringgetInitParameter(StringparaName)5)ServletRequest接口是HttpServletRequest的父接口6)ServletResponseHttpServletResponse的父接口九、JSP(简要介绍,详细内容见JSP笔记)什么是JSP为什么要使用JSP,,JSPServlet的关系JSP其实是一个以.jsp为后缀的文件,容器会自动将.jsp文件转换成一个.java文件(其实ServletServlet。所以,从本质上讲,JSPServlet。如何写一个JSP文件JSJava代码:形式一:Java代码片段:<%Java代码%>形式二:JSP表达式:Java%>形式三:JSP:<%!%>JSP是如何运行的step1:容器依据.jsp文件生成.java文件(也就是先转换成一个Servlet)1)HTML(CSS、JS)放到service方法里,使用out.write输出 %>也放到service方法里,照搬,不改动。 %>Servlet添加新的属性或者新的方法。JSPServlet容器。注意事项:out.writer方法只能输出简单的字符串,对象是没法输出的。优点是<%所谓隐含对象(9JSP总结.jsp文件里面直接可以使out、request、response、session、application(ServletContext上下文)等。Servlet指令<%@指令名称属性名=属性值%>3)page指令(属性,见JSP笔记例如:<%@pageimport="java.util.*"%><!--例如:<%@pageimport="java.util.*"%><!--注意:没有分号!<%@page<!--多 currentcurrenttime:<%out.println(newDate());%><brcurrenttime:<%=newDate()注意事项:两个是等价,newDate()会被放入out.print();%><!--%><!--件的内容(即)时,不会出现乱码。最好加入,有些容器默认以ISO8859-1编码。注意事项:页面最好添加:<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">CSSJSIE有个混杂模式,即自动降4)includejspinclude指令导入,如此实告诉容器,在将.jsp文件转换成.java文件时,在指令所在的位置插入相应的文件的“内案例:创建emplist.jsp页面,将表示逻辑交给JSP处理 <bodystyle="font-<tablecellpadding="0"cellspacing="0"border="1"<%//DAOList<Employee>employees=dao.findAll();for(intEmployeeEmployee<trclass="row<%=i%2+1}十、请求转发什么是转发ServletJSP去展现。如何转发编程需要注意的两个问题 rd.forward(request rd.forward(requestresponse);//能看到结果out.close()或着out.flush ,转发原理图转发的特点转发和重定向的区别Web组件可以共享request何时用重定向比如用户作删除操作时,删除操作已做完,重定向何时用转发ListServletServlet(通信模块转发给负责显示的做完,重定向案例:修改6.4案例step7step1tryout.prinltn();即将表示逻辑删除。使用转发,将表示逻辑交给emplist.jsp展示try{try{//EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");List<Employee>employees=dao.findAll();,转发RequestDispatcherrd=request.getRequestDispatcher("emplist.jsp");//step2:获得转发器rd.forward(request,response);//step3:转发 <%List<Employee><%List<Employee>for(inti=0;i<employees.size();i++){Employee<trclass="row<%=i%2+1<td><ahref="del.do?id=<%=e.getId() ()%>">}ServletServletActionServet.java,其中的service方法内容为:PrintWriterout=response.getWriter();String 数据try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");List<Employee>employees=dao.findAll();RequestDispatcherrd=request.getRequestDispatcher("emplist.jsp");//step2:获得转,}catch(Exceptione) }elseStringDoublesalary=Double.parseDouble(request.getParameter("salary"));intage=Integer.parseInt(request.getParameter("age"));{//EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");Employeee=newEmployee(); }catch(Exceptione) }elselongtry{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO"); }catch(Exception }elselongid=try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");Employeee=dao.findById(id); request.setAttribute("e_modifye);//转发}catch(Exception e.printStackTrace(); }elselongid=Long.parseLong(request.getParameter("id"));Stringname=request.getParameter("name");doublesalary=Double.parseDouble(request.getParameter("salary"));intage=Integer.parseInt(request.getParameter("age"));try{EmployeeDAOdao=(EmployeeDAO)Factory.getInstance("EmployeeDAO");Employeee=newEmployee(); }catch(Exception } 十一、异常的处理用输出流catch(Exceptioncatch(Exceptione) 用转发的方式outcatch(Exceptione)request.setAttribute("syserror","系统繁忙,稍后重试!");catch(Exceptione)request.setAttribute("syserror","系统繁忙,稍后重试!");}<%Stringmsg= 让容器处理系统异常catch(Exceptione)e.printStackTrace();//catch(Exceptione)e.printStackTrace();//throwe;报错,子类异常个数不能大于父类thrownewServletException(e);//这里将异常转化}<!--<!--案例:将10.9案例中的step3中的所有catch块修改十二、路径问题<a<formaction="add.do"><a<formaction="add.do">什么是相对路径<ahref="../a2.jsp">点击a2.jsp</a><!--../的用法为:向上跳一级--什么是绝对路径如何写绝对路径12.5。如何防止硬编码案例:相对、绝对路径对比web05_pathWebRoot文件夹下有a2.jspapp01app01文件夹中a1.jsp。<bodystyle="font-size:30px;color:red<bodystyle="font-size:30px;color:reda1.jspa1的内容……<br/>使用相对路径<br/><a a2.jsp</a><br使用绝对路径:硬编码<bra使用绝对路径:方法<bra2.jsp</a><br a2.jsp<body<bodystyle="font-size:30px;color:reda2.jspa2的内容……<br/>使用相对路径<br/><a a1.jsp</a><br使用绝对路径:方法<br 四种情况下,正确的绝对路径写法 十三、状态管理什么是状态管理将浏览器与Web服务器之间多次交互当作一个整体来看待,并且将多次交互所涉及的数如何进行状态管理第二大类:服务器端状态管理技术,即将状态保存在Web什么是:①是一种客户端的状态管理技术。②当浏览器服务器的时候,服务器可以将少量的数据以set-消息头的方式发送给浏览器,浏览器会将这些数据保存下来。当浏览器再次服务器时,会将之前保存的这些数据以消息头的方式发送给服如何创建一个c=new(Stringname,Stringvalue);//namec=new(Stringname,Stringvalue);//name: 的名称。value:的 成功 查询String.getName();//返回的名称String.getValue();//返回的PrintWriterout=PrintWriterout=s!=null){for(intStringString }编码问题的值或者名称只允许合法的ASCII码字符串,如果是中文,需要将中文转换成ASCII的生存时间默认情况下浏览器会将保存在内存里只要浏览器不关闭会一直存在seconds时缺省(浏览器会将保存在内存里④当seconds=0时删除。所以中无删除方法设置为0即可而修改则为覆盖用相同的name eg1:删除名称为userIdname,值为zsPrintWriterout=response.getWriter(); s!=null){booleanflag=false;for(inti=0;i< 的路径问题的路径是否匹配,只有匹配的才会发送。有一个默认的路径值等于创建该的组件的路径比如:/web06_/app01/add.jsp创建了一个,则该默认的路径为:/web06_/app01。进行发送。/app01, 1.jsp页面(2、3相同,1放在 中,2放 s!=null){for(int s!=null){for(int jsp//jsp5)修 样,应用内部的某个组件所添加的可以被该应用内部的其他组件到。("userid","abc");("userid","abc");的限制1)可以被用户2)因为保存在浏览器端,所以不安全。对于一些敏感的数据,需要加3)只能够保存少量的数据(大约是4K左右服务器也有个数的限制,大约是20个。案例:写一个privatestaticString publicstaticvoid (Stringname,String,HttpServletResponseresponse,intage)throws} UtilpublicpublicstaticStringStringvalue=null;[]cooikes=request.getfor(inti=0;i<cooikes.length;i++){ value=c.getValue(); }returnpublicstaticvoid}(name,"");}response.setContentType("text/html");PrintWriterout=Stringvalue= ("name",("name","zs",response,3600);session(会话sessionIdsessionIdsession对象。如何创建一个session对象flag=truesessionsessionIdsession对象。flag=falsesessionsessionIdnull。等价于HttpSessionHttpSession接口中提供的常用方法StringgetId()setAttribute(Stringname,Objectobj)session对象上3)getAttribute(Stringname)null4)removeAttribute(Stringname):解除绑定(request也有)session的超时sessionsession超时限30分钟。要重新启动Tomcat服务器。也可以修改某个应用的session:invalidate();//session对象的内容,然后可以给其他人session对象用户以后,如何继续使用 ,服务器仍然会将sessionId以的方式发送给浏览器,是,浏览器不再保存这个(即sessionIdurl重写来实现sessionId的url重写url而应该使用服务器生成的包含有sessionId的地址。比如以13.19案例中次数为例:当一个新页面有个时<ahref="SomeServlet">someServlet</a>是错误的!点刷新是不会计数的,因为被了。应该是<ahref="<%=response.encodeURL("SomeServlet")%>">someServlet</a>此时去点击刷新count1的。 加sessionId(不 如何进行url例如:<form例如:<formsession的优点session能够保存的数据大小更大(只能保存大约4K左右的数据,理论sessionsession没有被的问题,也就不需要url重写 可以被用户session的缺点session会将数据放在服务器端,所以,对服务器的资源的占用比较大,而 sessionsessionId以session保存到内存中,如果浏览器关闭,浏览器发请求时就没有sessionId,服务器端的session对象就找不到了。案例:session验证和次1)session验证:session验证经常用于保护一些需要登录之后才能的资源。比如:只有登录成功以后,才能main.jsp<%<%Objectobj=session.getAttribute("user"); 注意事项:若不写return,则该页面中body中的内容,虽然看不到,但还是会2)次step1:SomeServletservice PrintWriteroutresponse.getWriter();HttpSessionsession=request.getSession();//获得一个session对象Integercount=(Integer)session.getAttribute("count");//绑定必须是个对象,所以用包装类 ,则设置count=1 ,则原有值基础上加1 session.setAttribute("count",count); 案例:/**step1//1创建一个内存映像对象(类似一个画布BufferedImageGraphicsg=image.getGraphics();//2获得画布Randomr=newRandom();//3g.fillRect(0,0,WIDTH,HEIGHT);//4给画布设置一个背景颜色Stringnumber=getNumber(5);//5绘图//6numbersessionHttpSessionsession=request.getSession(); session.setAttribute("number",number);g.setColor(newColor(0,0,0));//7//8for(int /**step2: 压缩,然后输出到客户端(浏览器)/**设置content-type消息头,告诉浏览器返回的数据是一张jpeg格式的 /**将原始 image按照指定的压缩格式jpeg进行压缩,然后,将压缩之后生成的数javax.imageio.ImageIO.write(image"jpeg",os);step2:CheckcodeServletgetNumber方法privateprivateStringgetNumber(intsize)StringStringString Randomr=newfor(inti=0;i<size;i++){rs+=str.charAt(r.nextInt(str.length()));return Stringuri=request.getRequestURI();Stringaction=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf(".")); Stringuri=request.getRequestURI();Stringaction=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf(".")); HttpSessionsession=request.getSession();//number2numberStringnumber2=(String)session.getAttribute("number");错误request.getRequestDispatcher("login.jsp").forward(request,response); Stringusername=request.getParameter("username");Stringpwd=request.getParameter("pwd");UserDAOdao=newUserDAO();try{User if(user!=null&& request.setAttribute("login_error","用户名或 request.getRequestDispatcher("login.jsp").forward(request,response); }catch(Exceptione){ thrownew step4:web.xml <tr><tdvalign="middle"<td<tr><tdvalign="middle"<tdvalign="middle"<inputtype="text"name="number"<%Stringmsg2=(String)request.getAttribute("number_error");<ahref="javascript:;" Mathranom();案例:购物车createtablecreatetableidbigintprimarykeyauto_increment, modelvarchar(20), picvarchar(50),prodDesctext, pricedouble);)insertintochang_product(model,pic,prodDesc,pricevalues('x500','x500.jpg','性价比最好',4000);insertintochang_product(model,pic,prodDesc,price)values('x600','x600.jpg','性能不错',6000);step2:Productprivateprivateint privateStringprivateStringprivateStringprivatedouble publicstaticConnectionpublicstaticConnectiongetConnection()throwsException{Connectionconn=null;try{Class.forName("com.mysql.jdbc.Driver");}catch(Exceptione){ returnconn;publicstaticvoidclose(Connectionthrowe;} try }catch(SQLExceptione) step4:ProductDAOpublicpublicList<Product>findAll()throwsList<Product>products=newArrayList<Product>(); Connectionconn=null;try{conn=DBUtil.getConnection(); Statementstat=conn.createStatement();ResultSetrs=stat.executeQuery("select*from Productp=new }catch(Exceptione){ returnproducts; publicProductfindById(intid){Productp=null; Connectionconn=null;try{conn=DBUtil.getConnection(); Statementstat=conn.createStatement();ResultSetrs=stat.executeQuery("select*fromchang_productwhereid="+id); p=new}}catch(Exceptione) return}privateProduct privateint ……//get/setstep6Cart.java类,原因:用户发送请求(buy),服务器创建Session对象,不需要再直接Session的方法,而是Session绑定一个Cart对象,然后用户商品时,只调privateProduct privateint ……//get/setprivateList<CartItem>items=new/**添加商品:需要对items进行遍历,如果已 过该商品,则不再添加并且返publicbooleanadd(CartItemitem){for(int CartItem returnfalse;/**}return}}publicdouble doublefor(inti=0;i<items.size();i++){ CartItemcurr=items.get(i);total+=curr.getQty()*curr.getP().getPrice(); return /**返回用户 的所有商品publicList<CartItem>list()/**return}publicvoidclear() /**publicvoiddelete(intfor(inti=0;i<items.size();i++){/**publicvoidmodify(intid,intqty){for(inti=0;i<items.size();i++){CartItem}}}CartItem}}}Stringuri=StringStringuri=Stringaction=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf(".")); ProductDAOdao=newtry{List<Product>products=dao.findAll();request.setAttribute("products",products);}catch(Exceptione) thrownew }elseif(action.equals("/buy")){ HttpSessionsession=request.getSession();Cartcart=(Cart)session.getAttribute("cart"); cart=newCart();session.setAttribute("cart",cart);}//ProductDAOdao=newProductDAO();CartItemitem=newCartItem(); booleanflag=cart.add(item); 过 }catch(Exceptione) thrownew }elseif(action.equals("/delete")){ intid=Integer.parseInt(request.getParameter("id"));HttpSessionsession=request.getSession(); }elseif(action.equals("/clear")){ HttpSessionsession=request.getSession();Cartcart=(Cart)session.getAttribute("cart");cart.clear();}elseif(action.equals("/modify")){intid=Integer.parseInt(request.getParameter("id"));intqty=Integer.parseInt(request.getParameter("qty"));HttpSession Cart List<Product>products= List<Product>products=for(intProductp=<tr><tdheight="90"<td<%Stringmsg=(String)request.getAttribute("buy_msg_"+p.getId()); <span<% <inputclass="button"type="button"value="查看购物车onclick="location=<%//<%//session当中,取出cartCartcart=(Cart)session.getAttribute("cart"); List<CartItem>items=cart.list();for(int CartItem <tdclass="altbg2"><inputtype="text"size="3"value=""id="num_<%=item.getP().getId/td><!--id<td<ahref="javascript:;"onclick="location='modify.do? 更改数量</a></td><!--注意!location中的地址不能用回车换行 ""}<inputclass="button"type="button"value="返回商品列表onclick="location=<inputclass="button"type="button"value="清空购物车onclick
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 6S管理干部版考试试题及详细答案
- 1月8日税务师考试真题及详细答案解析(全科完整版)
- 合规转利润:降本增效全指南(2026)《GBT 39338-2020综合机械化固体充填采煤技术要求》
- 钢模板现场施工方案
- 合规转利润:降本增效全指南(2026)《GBT 39198-2020一般固体废物分类与代码》
- 合规转利润:降本增效全指南(2026)《GBT 39126-2020室内绿色装饰装修选材评价体系》
- 耒阳市第二中学2026-2027学年高一上学期开学综合能力测试物理答案
- 2026年浙江省高中物理热学基础习题集
- 《汽车专业英语》-1.7 cooling system 2
- 合规转利润:降本增效全指南(2026)《GBT 38775.7-2021电动汽车无线充电系统 第7部分:互操作性要求及测试 车辆端》
- 2027届高考语文一轮复习:正确理解运用实词虚词
- 2026盐城市国资委直属事业单位公开选调工作人员考试参考题库及答案详解
- 2026 年秋季开学大学军训网络文明行为教育课件
- 2026年外研版五年级英语上册单词表衡水体描红英语字帖(三年级起点)
- 某机械厂采购管理办法
- 2026中国智能仓储物流机器人系统集成市场发展白皮书
- 2026-2030中国暖宫带市场销售格局与前景需求潜力研究研究报告
- 放射科肺部CT影像评估培训指南
- 人教版(2024)七年级上册生物全册教学设计
- (2026年)检验检测机构资质认定“一单一库”的学习与解读(2026年实施)课件
- 机修钳工(高级)证考试题及答案
评论
0/150
提交评论