JavaWEB基础知识整理_第1页
JavaWEB基础知识整理_第2页
JavaWEB基础知识整理_第3页
JavaWEB基础知识整理_第4页
JavaWEB基础知识整理_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Day1一、使用JavaEE版的Eclipse开发动态的WEB工程(JavaWEB项目)1).把开发选项切换到JavaEE2).可以在Window->ShowView中找到PackageExplorer,并把其拖拽到开发区的左边3).在Servers面板中新建Tomcat服务器.一定要关联到Tomcat安装的根目录4).新建一个DynamicWebProject.其中TargetRuntime需选择Tomcat6.05).开发JavaWEB应用6).可以通过runonserver来运行WEB项目.二、Servlet的HelloWorld1).创建一个Servlet接口的实现类.publicclassHelloServletimplementsServlet2).在web.xml文件中配置和映射这个Servlet(因此可以通过浏览器访问java类) <!--配置和映射Servlet--> <servlet> <!--Servlet注册的名字--> <servlet-name>helloServlet</servlet-name> <!--Servlet的全类名--> <servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class>指向HelloServlet文件 </servlet> <servlet-mapping> <!--需要和某一个servlet标签的serlvet-name子标签的文本节点一致--> <servlet-name>helloServlet</servlet-name> <!--映射具体的访问路径:/代表当前WEB应用的根目录.--> <url-pattern>/hello</url-pattern> </servlet-mapping>三、Servlet容器:运行Servlet、JSP、Filter等的软件环境.1).可以来创建Servlet,并调用Servlet的相关生命周期方法.2).JSP,Filter,Listener,Tag...四、Servlet生命周期的方法:以下方法都是由Serlvet容器负责调用.1).构造器:只被调用一次.只有第一次请求Servlet时,创建Servlet的实例.调用构造器.这说明Serlvet的单实例的!2).init方法:只被调用一次.在创建好实例后立即被调用.用于初始化当前Servlet.3).service:被多次调用.每次请求都会调用service方法.实际用于响应请求的.4).destroy:只被调用一次.在当前Servlet所在的WEB应用被卸载前调用.用于释放当前Servlet所占用的资源.五、load-on-startup参数:1).配置在servlet节点中: <servlet> <!--Servlet注册的名字--> <servlet-name>secondServlet</servlet-name> <!--Servlet的全类名--> <servlet-class>com.atguigu.javaweb.SecondServlet</servlet-class> <!--可以指定Servlet被创建的时机--> <load-on-startup>2</load-on-startup> </servlet> 2).load-on-startup:可以指定Serlvet被创建的时机.若为负数,则在第一次请求时被创建.若为0或正数,则在当前WEB应用被Serlvet容器加载时创建实例,且数组越小越早被创建.六、关于serlvet-mapping:1).同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。2).在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。<servlet-mapping> <servlet-name>secondServlet</servlet-name> <url-pattern>/*</url-pattern>/*表示所有类型可匹配</servlet-mapping>OR<servlet-mapping> <servlet-name>secondServlet</servlet-name> <url-pattern>*.html</url-pattern>*.html匹配.html</servlet-mapping>注意:以下的既带/又带扩展名的不合法.<servlet-mapping> <servlet-name>secondServlet</servlet-name> <url-pattern>/*.action</url-pattern></servlet-mapping>七、ServletConfig:封装了Serlvet的配置信息,并且可以获取ServletContext对象1).配置Serlvet的初始化参数 <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>com.atguigu.javaweb.HelloServlet</servlet-class> <!--配置Serlvet的初始化参数。且节点必须在load-on-startup节点的前面--> <init-param> <!--参数名--> <param-name>user</param-name> <!--参数值--> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>1230</param-value> </init-param> <load-on-startup>-1</load-on-startup> </servlet>2).获取初始化参数: >getInitParameter(Stringname):获取指定参数名的初始化参数>getInitParameterNames():获取参数名组成的Enumeration对象.Stringuser=servletConfig.getInitParameter("user"); System.out.println("user:"+user); Enumeration<String>names=servletConfig.getInitParameterNames(); while(names.hasMoreElements()){ Stringname=names.nextElement(); Stringvalue=servletConfig.getInitParameter(name); System.out.println("^^"+name+":"+value); }3).获取Serlvet的配置名称(了解)八、ServletContext1).可以由SerlvetConfig获取:ServletContextservletContext=servletConfig.getServletContext();2).该对象代表当前WEB应用:可以认为SerlvetContext是当前WEB应用的一个大管家.可以从中获取到当前WEB应用的各个方面的信息.①.获取当前WEB应用的初始化参数设置初始化参数:可以为所有的Servlet所获取,而Servlet的初始化参数只用那个Serlvet可以获取.<!--配置当前WEB应用的初始化参数--><context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value></context-param>方法:getInitParametergetInitParameterNames 代码:ServletContextservletContext=servletConfig.getServletContext(); Stringdriver=servletContext.getInitParameter("driver");System.out.println("driver:"+driver);Enumeration<String>names2=servletContext.getInitParameterNames();while(names2.hasMoreElements()){ Stringname=names2.nextElement(); System.out.println("-->"+name);}②.获取当前WEB应用的某一个文件在服务器上的绝对路径,而不是部署前的路径getRealPath(Stringpath);代码:StringrealPath=servletContext.getRealPath("/note.txt");System.out.println(realPath);③.获取当前WEB应用的名称:getContextPath()代码:StringcontextPath=servletContext.getContextPath();System.out.println(contextPath);④.获取当前WEB应用的某一个文件对应的输入流.getResourceAsStream(Stringpath):path的/为当前WEB应用的根目录.代码:InputStreamis2=servletContext.getResourceAsStream("/WEB-INF/classes/perties"); ⑤.和attribute相关的几个方法: 九、GET请求和POST请求:1).使用GET方式传递参数:①.在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。②.如果网页中的<form>表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。③.使用GET请求方式给WEB服务器传递参数的格式:/counter.jsp?name=lc&password=123④.使用GET方式传送的数据量一般限制在1KB以下。2).使用POST方式传递参数:①.POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据:form表单的method置为POST②.POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。POST/counter.jspHTTP/1.1referer:http://localhost:8080/Register.htmlcontent-type:application/x-www-form-urlencodedhost:localhost:8080content-length:43name=zhangsan&password=123--请求体中传递参数.十、如何在Serlvet中获取请求信息:1).Servlet的service()方法用于应答请求:因为每次请求都会调用service()方法publicvoidservice(ServletRequestrequest,ServletResponseresponse) throwsServletException,IOException ServletRequest:封装了请求信息.可以从中获取到任何的请求信息.ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现.这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法时传入.2).ServletRequest:封装了请求信息.可以从中获取到任何的请求信息.①.获取请求参数: >StringgetParameter(Stringname):根据请求参数的名字,返回参数值. 若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值. >String[]getParameterValues(Stringname):根据请求参数的名字,返回请求参数对应的字符串数组. >EnumerationgetParameterNames():返回参数名对应的Enumeration对象, 类似于ServletConfig(或ServletContext)的getInitParameterNames()方法. >MapgetParameterMap():返回请求参数的键值对:key:参数名,value:参数值,String数组类型.②.获取请求的URI: HttpServletRequesthttpServletRequest=(HttpServletRequest)request; StringrequestURI=httpServletRequest.getRequestURI(); System.out.println(requestURI);///day_29/loginServlet③.获取请求方式: Stringmethod=httpServletRequest.getMethod(); System.out.println(method);//GET ④.若是一个GET请求,获取请求参数对应的那个字符串,即?后的那个字符串. StringqueryString=httpServletRequest.getQueryString(); System.out.println(queryString);//user=atguigu&password=123456&interesting=game&interesting=party&interesting=shopping⑤.获取请求的Serlvet的映射路径StringservletPath=httpServletRequest.getServletPath();System.out.println(servletPath);///loginServlet⑥.和attribute相关的几个方法: 3).HttpServletRequest:是SerlvetRequest的子接口.针对于HTTP请求所定义.里边包含了大量获取HTTP请求相关的方法.4).ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现.①.*getWriter():返回PrintWriter对象.调用该对象的print()方法,将把print()中的参数直接打印到客户的浏览器上.②.设置响应的内容类型:response.setContentType("application/msword");③.voidsendRedirect(Stringlocation):请求的重定向.(此方法为HttpServletResponse中定义.)在web.xml文件中设置两个WEB应用的初始化参数,user,password.定义一个login.html,里边定义两个请求字段:user,password.发送请求到loginServlet在创建一个LoginServlet,在其中获取请求的user,password.比对其和web.xml文件中定义的请求参数是否一致若一致,响应Hello:xxx,若不一致,响应Sorry:xxxxxx为user.补充:http://localhost:8080/day0001/app/index.jspgetContextPath()/day0001getServletPath()/app/index.jspgetRequestUri()/day0001/app/index.jspDay2一、GenericServlet(了解):1).是一个Serlvet.是Servlet接口和ServletConfig接口的实现类.但是一个抽象类.其中的service方法为抽象方法2).如果新建的Servlet程序直接继承GenericSerlvet会使开发更简洁.3).具体实现:①.在GenericServlet中声明了一个SerlvetConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化②.利用servletConfig成员变量的方法实现了ServletConfig接口的方法③.还定义了一个init()方法,在init(SerlvetConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化.④.不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(config);而还是用了SerlvetConfig接口的方法,则会出现空指针异常.⑤.新建的init(){}并非Serlvet的生命周期方法.而init(ServletConfig)是生命周期相关的方法.publicabstractclassGenericServletimplementsServlet,ServletConfig{ /**以下方法为Servlet接口的方法**/ @Override publicvoiddestroy(){} @Override publicServletConfiggetServletConfig(){ returnservletConfig; } @Override publicStringgetServletInfo(){ returnnull; } privateServletConfigservletConfig; @Override publicvoidinit(ServletConfigarg0)throwsServletException{ this.servletConfig=arg0; init(); } publicvoidinit()throwsServletException{} @Override publicabstractvoidservice(ServletRequestarg0,ServletResponsearg1) throwsServletException,IOException; /**以下方法为ServletConfig接口的方法**/ @Override publicStringgetInitParameter(Stringarg0){ returnservletConfig.getInitParameter(arg0); } @Override publicEnumerationgetInitParameterNames(){ returnservletConfig.getInitParameterNames(); } @Override publicServletContextgetServletContext(){ returnservletConfig.getServletContext(); } @Override publicStringgetServletName(){ returnservletConfig.getServletName(); }}二、HttpServlet:1).是一个Servlet,继承自GenericServlet.针对于HTTP协议所定制.2).在service()方法中直接把ServletReuqest和ServletResponse转为HttpServletRequest和HttpServletResponse.并调用了重载的service(HttpServletRequest,HttpServletResponse)在service(HttpServletRequest,HttpServletResponse)获取了请求方式:request.getMethod().根据请求方式有创建了doXxx()方法(xxx为具体的请求方式,比如doGet,doPost)@Overridepublicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{HttpServletRequestrequest;HttpServletResponseresponse;try{request=(HttpServletRequest)req;response=(HttpServletResponse)res;}catch(ClassCastExceptione){thrownewServletException("non-HTTPrequestorresponse");}service(request,response);}publicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //1.获取请求方式. Stringmethod=request.getMethod(); //2.根据请求方式再调用对应的处理方法 if("GET".equalsIgnoreCase(method)){ doGet(request,response); }elseif("POST".equalsIgnoreCase(method)){ doPost(request,response); }}publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //TODOAuto-generatedmethodstub }publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ //TODOAuto-generatedmethodstub }3).实际开发中,直接继承HttpServlet,并根据请求方式复写doXxx()方法即可.4).好处:直接由针对性的覆盖doXxx()方法;直接使用HttpServletRequest和HttpServletResponse,不再需要强转.三、转发://1、调用HttpServletRequest的getRequestDispatcher()方法,参数为转发地址,获取DequestDispatcher对象 Stringpath="testServlet"; RequestDispatcherrequestDispatcher=request.getRequestDispatcher("/"+path); //2、调用HttpServletRequest的forward(request,response)进行转发 requestDispatcher.forward(request,response); 重定向//直接调用response.sendRedirect()方法,参数为重定向的地址 response.sendRedirect("testServlet");在MySQL数据库中创建一个test_users数据表,添加3个字段:id,user,password.并录入几条记录.定义一个login.html,里边定义两个请求字段:user,password.发送请求到loginServlet在创建一个LoginServlet(需要继承自HttpServlet,并重写其doPost方法),在其中获取请求的user,password.利用JDBC从test_users中查询有没有和页面输入的user,password对应的记录SELECTcount(id)FROMtest_usersWHEREuser=?ANDpassword=?count(id)大于0,登陆成功,等于0,登录失败若有,响应Hello:xxx,若没有,响应Sorry:xxxxxx为user.四、请求的转发和重定向:1).本质区别:请求的转发只发出了一次请求,而重定向则发出了两次请求.具体:①.请求的转发:地址栏是初次发出请求的地址.请求的重定向:地址栏不再是初次发出的请求地址.地址栏为最后响应的那个地址②.请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象.请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象.③.请求的转发:只能转发给当前WEB应用的的资源请求的重定向:可以重定向到任何资源.④.请求的转发:/代表的是当前WEB应用的根目录,如/c.jsp请求的重定向:/代表的是当前WEB站点的根目录,如/day30/c.jsp注:当前WEB应用的根目录:http://localhost:8080/day30/当前站点的根目录:http://localhost:8080/五、JSP:1).WHY:JSP是简Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。2).JavaServerPage:Java服务器端网页.在HTML页面中编写Java代码的页面.2).helloworld:新建一个JSP页面,在body节点内的<%%>即可编写Java代码.<body> <% Datedate=newDate(); System.out.print(date); %></body>3).JSP可以放置在WEB应用程序中的除了WEB-INF及其子目录外的其他任何目录中,JSP页面的访问路径与普通HTML页面的访问路径形式也完全一样。4).JSP的运行原理:JSP本质上是一个Servlet.每个JSP页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件.然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。5).JSP页面的隐含变量:没有声明就可以使用的对象.JSP页面一共有9个隐含对象.publicvoid_jspService(HttpServletRequestrequest,HttpServletResponseresponse)throwsjava.io.IOException,ServletException{PageContextpageContext=null;HttpSessionsession=null;ServletContextapplication=null;ServletConfigconfig=null;JspWriterout=null;Objectpage=this; //... //使用<%%>编写的代码在此位置.可以用到request,response,pageContext,session //application,config,out,page这8个隐含对象.(实际上还可以使用一个叫exception的隐含对象)}①.request:HttpServletRequest的一个对象.*②.response:HttpServletResponse的一个对象(在JSP页面中几乎不会调用response的任何方法.)③.pageContext:页面的上下文,是PageContext的一个对象.可以从该对象中获取到其他8个隐含对象.也可以从中获取到当前页面的其他信息.(学习自定义标签时使用它)*④.session:代表浏览器和服务器的一次会话,是HttpSession的一个对象.后面详细学习.*⑤.application:代表当前WEB应用.是ServletContext对象.*⑥.config:当前JSP对应的Servlet的ServletConfig对象(几乎不使用).若需要访问当前JSP配置的初始化参数,需要通过映射的地址才可以.映射JSP:<servlet> <servlet-name>hellojsp</servlet-name> <jsp-file>/hello.jsp</jsp-file> <init-param> <param-name>test</param-name> <param-value>testValue</param-value> </init-param></servlet><servlet-mapping> <servlet-name>hellojsp</servlet-name> <url-pattern>/hellojsp</url-pattern> </servlet-mapping>⑦.out:JspWriter对象.调用out.println()可以直接把字符串打印到浏览器上.*⑧.page:指向当前JSP对应的Servlet对象的引用,但为Object类型,只能调用Object类的方法(几乎不使用)⑨.exception:在声明了page指令的isErrorPage="true"时,才可以使用.*<%@pageisErrorPage="true"%>pageContext,request,session,application(对属性的作用域的范围从小到大)out,response,config,pageexception6).JSP模版元素:JSP页面中的静态HTML内容称7).JSP表达式(expression)提供了将一个java变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%=和%>之中。<% Datedate=newDate(); out.print(date);%><%=date%>8).JSP脚本片断(scriptlet)是指嵌套在<%和%>之中的一条或多条Java程序代码。多个脚本片断中的代码可以相互访问<% StringageStr=request.getParameter("age"); Integerage=Integer.parseInt(ageStr); if(age>=18){%> 成人...<% }else{%> 未成人...<% }%>9).JSP声明:JSP声明将Java代码封装在<%!和%>之中,它里面的代码将被插入进Servlet的_jspService方法的外面(在JSP页面中几乎从不这样使用)10).JSP注释的格式:<%--JSP注释--%><!--HTML注释-->区别:JSP注释可以阻止Java代码的执行.六、和属性相关的方法:1).方法voidsetAttribute(Stringname,Objecto):设置属性ObjectgetAttribute(Stringname):获取指定的属性EnumerationgetAttributeNames():获取所有的属性的名字组成的Enumeration对象removeAttribute(Stringname):移除指定的属性2).pageContext,request,session,application对象都有这些方法!这四个对象也称之为域对象.pageContext:属性的作用范围仅限于当前JSP页面request:属性的作用范围仅限于同一个请求.(在转发的情况下,可以跨网页获取属性值)session:属性的作用范围限于一次会话:浏览器打开直到关闭称之为一次会话(在此期间会话不失效)application:属性的作用范围限于当前WEB应用.是范围最大的属性作用范围,只要在一处设置属性,在其他各处的JSP或Servlet中都可以获取到.(关闭服务器会销毁当前WEB应用)Day3一、JSP指令:1.JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。基本格式:<%@指令属性名="值"%><%@pagecontentType="text/html;charset=UTF-8"%>2.在目前的JSP2.0中,定义了page、include和taglib这三种指令3.page指令:1).page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。2).page指令常用的属性:①.import属性:指定当前JSP页面对应的Servlet需要导入的类.<%@pageimport="java.text.DateFormat"%>②.session属性:取值为true或false,指定当前页面的session隐藏变量是否可用,也可以说访问当前页面时是否一定要生成HttpSession对象.<%@pagesession="false"%>③.errorPage和isErrorPage属性: >errorPage指定若当前页面出现错误时实际响应页面时什么.其中/表示的是当前WEB应用的根目录. <%@pageerrorPage="/error.jsp"%> >在响应error.jsp时,JSP引擎使用的请求转发的方式. >isErrorPage指定当前页面是否为错误处理页面,可以说明当前页面是否可以使用exception隐藏变量.需要注意的是:若指定 isErrorPage="true",并使用exception的方法了,一般不建议能够直接访问该页面. >如何使客户不能直接访问某一个页面呢?对于Tomcat服务器而言,WEB-INF下的文件是不能通过在浏览器中直接输入地址的方式 来访问的.但通过请求的转发是可以的! >还可以在web.xml文件中配置错误页面: <error> <!--指定出错的代码:404没有指定的资源,500内部错误.--> <error-code>404</error-code> <!--指定响应页面的位置--> <location>/WEB-INF/error.jsp</location> </error> <error> <!--指定异常的类型--> <exception-type>java.lang.ArithmeticException</exception-type> <location>/WEB-INF/error.jsp</location> </error> ④.contentType属性:等同于response.setContentType(type),指定当前JSP页面的响应类型.实际调用的是response.setContentType("text/html;charset=UTF-8");通常情况下,对于JSP页面而言其取值均为text/html;charset=UTF-8.charset指定返回的页面的字符编码是什么.通常取值为UTF-8⑤.pageEncoding属性:指定当前JSP页面的字符编码.通常情况下该值和contentType中的charset一致.⑥.isELIgnored属性:指定当前JSP页面是否可以使用EL表达式.通常取值为false. 4.include指令:<%@includefile="b.jsp"%>1).include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。2).file属性的设置值必须使用相对路径3).如果以/开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。推荐使用/方式来指明路径jsp标签:jsp:include:1).<jsp:includepage="b.jsp"></jsp:include> 2).动态引入:并不是像include指令生成一个Servlet源文件,而是生成两个Servlet源文件,然后通过一个方法的方式把目标页面包含进来.org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"b.jsp",out,false);2.jsp:forward:1).<jsp:forwardpage="/include/b.jsp"></jsp:forward> 相当于. <% request.getRequestDispatcher("/include/b.jsp").forward(request,response);%>2).但使用jsp:forward可以使用jsp:param子标签向b.jsp传入一些参数.同样jsp:include也可以使用jsp:param子标签.<jsp:forwardpage="/include/b.jsp"> <jsp:paramvalue="abcd"name="username"/></jsp:forward> OR<jsp:includepage="/include/b.jsp"> <jsp:paramvalue="abcd"name="username"/></jsp:include>在b.jsp页面可以通过request.getParameter("username")获取到传入的请求参数.三、关于中文乱码:1).在JSP页面上输入中文,请求页面后不出现乱码:保证contentType="text/html;charset=UTF-8",pageEncoding="UTF-8"charset和pageEncoding的编码一致,且都支持中文.通常建议取值为UTF-8还需保证浏览器的显示的字符编码也和请求的JSP页面的编码一致.2).获取中文参数值:默认参数在传输过程中使用的编码为ISO-8859-1①.对于POST请求:只要在获取请求信息之前(在调用request.getParameter或者是request.getReader等),调用request.setCharacterEncoding("UTF-8")即可.②.对于GET请求:前面的方式对于GET无效.因为tomcat默认GET请求使用ISO-8859-1将传输数据编码进了URI可以在输出前使用newString(str.getByte("iso-8859-1"),"UTF-8")进行ISO-8859-1解码后重新UTF-8编码也可以通过修改Tomcat的server.xml文件来改变默认URI的编码参照http://localhost:8989/docs/config/index.html文档的useBodyEncodingForURI属性.为Connector节点添加useBodyEncodingForURI="true"属性即可.<ConnectorconnectionTimeout="20000"port="8989"protocol="HTTP/1.1"redirectPort="8443"useBodyEncodingForURI="true"/>DAY4一、MVC:(前期)M:Model,DAO类V:View.jsp,在页面上填写Java代码实现显示C:Controller.Servlet,受理请求,获取request中的参数,调用DAO方法,根据实际需要将DAO返回值放入request中,转发(或重定向)页面转发与重定向的选择:若目标的响应界面不需要从request中获取值,则可以使用重定向(重定向可以防止表单的重复提交)目前缺点:没有使用数据库连接池,DBUtils,JDBCUtil,工具类,DAO基类等应该一个模块一个Servlet而不是一个请求一个Servlet需要再页面上加入jQuery提示,提高用户体验二、MVC案例需求:使用MVC设计模式实现对一张数据表的增删改查1、没有业务层,没有事务操作,直接由Servlet调用DAO,DAO中可以直接获取Connection对象2、MVC设计模式3、技术:MVC设计模式,JSP,Servlet,POJO数据库使用MySql数据库连接池使用C3P0JDBC工具使用DBUtil页面提示使用jQuery4、难点:多个请求如何共有一个Servlet:方法一、在请求URI后面设置参数和对应的值比如?method=add/delete等缺点:URL暴露了方法,有安全隐患方法二、修改servlet映射,使用getServletPath区分每个请求,使用subString()去除多余部分,再调使用反射调用方法缺点:代码量大如何实现模糊查询根据传入的name,address,phone进行模糊查询,例如name:a,address:b,phone:3sql语句为SELECTid,name,address,phoneFROMcontactsWHEREnameLIKE‘%a%’ANDaddressLIKE‘%b%’ANDphoneLIKE‘%3%’需要在ContactDAO接口中定义一个getForListWithCriteriaContact(CriteriaContactcc)方法CriteriaContact类用于封装查询条件,name,address,phone,因为查询条件和domain类不一定相同,因此需要做成单独的类拼写sql:”SELECTid,name,address,phoneFROMcontactsWHEREnameLIKE?ANDaddressLIKE?ANDphoneLIKE?”;占位符无条件时为”%%”,有条件时为”%a%”Servlet中将请求参数分装为CriteriaContact对象,将query方法中的getAll()(换为getForListWithCriteriaContact()(因为就是getAll()其实是模糊查询的一种情况,当模糊条件全是”%%”时)如何实现新增或修改时,验证用户名是否被占用,并给出提示删除:超链接delete.do?=<%c.getId()%>servlet中获取id,调用删除方法,重定向到query.do(类似刷新页面的效果,但需要在输入框中保留查询条件,此练习先不实现)JSP中进行jQuery提示:确认删除xxx的信息吗,需要导入jquery.js才能使用jQuery语句,并添加<scripttype="text/javascript"src="scripts/jquery.js"></script>语句添加:设置超链接到newContact.jsp,在newContact.jsp中进行添加Servlet中取出request中的信息,检验name是否重复,调用添加方法之前获取到数据表中相同name的数据条数,条数大于0表示不可用,request中放入提示,重定向页面,并且输入框中保留之前的数据,若条数等于0,调用save方法,重定向addSuccess.jsp页面细节,填入的信息不完整,需要提醒,字体颜色,回显的地方需要判断是否为null。修改:携带id到edit方法,方法中根据id从数据库中获取信息,并将信息转发到修改界面,修改页面获取request中的信息,显示出来,修改完成后,提示修改的id,id提前使用隐藏域保存(type=”hidden”),跳转到query.do修改过程中要判断name是否可用,name可以和旧的一样(即不改name),但不能和其他的name一样(修改了name)方法:保存旧名字,当提交修改后,比较新旧name是否相同,相同,就不管name,不同再去数据库寻找是否有重复的nameView:JSP呈现数据,从request中取出参数接受用户输入3、View:JSP呈现数据,从request中取出参数接受用户输入3、编写JS代码给出对应提示Controller:Servlet1、获取请求信息验证请求参数的合法性,验证失败,给出提示将请求参数分装为JavaBean调用DAO方法,获取返回结果将返回结果放入request中响应页面(转发,重定向)Model:DAO1、获取数据库连接2、执行增删改查3、返回结果MySQL注意:不能跨层访问,从右向左进行编写1.加入C3P0数据源:C3P0的jar包和c3p0-config.xml配置文件,数据库驱动jar包2.编写DAO,JDBCUtils工具类,ContactDAO接口3.提供ContactDAO接口的实现类4.Servlet映射为*.do5.doGet调用doPost方法,doPost中使用反射调用相应的方法6.查询流程:query.dodoPostquery(使用模糊查询)JSP(获取request的属性值,遍历)7.模糊查询:SELECTid,name,address,phoneFROMcontactsWHEREnameLIKE?ANDaddressLIKE?ANDphoneLIKE?”;占位符无条件时为”%%”,有条件时为”%a%”,将筛选条件封装成类,在封装类中重写get方法,该属性为null时return”%%”,不为null时return”%”+属性值+”%”三、深入理解面向接口编程在类中调用接口的方法,而不关心具体的实现方法,这有利于代码的接口,是代码具有更好的可移植性和可扩展性。ContactDAOJdbcImplContactDAOXmlImplContactDAOContactServlet实现接口的方法使用接口的ContactDAOJdbcImplContactDAOXmlImplContactDAOContactServlet实现接口的方法使用接口的方法使用接口的方法通过修改类路径下的properties文件,来动态改变Contacts的存储方式1、Servlet中不能通过ContactDaodao=newContactDaoJdbcImpl()来获得接口实现类对象2、应该通过一个类的方法来获取具体的实现类对象第一个启动的服务器的init()方法中,读取properties文件中的配置,得到type,并传给工厂类工厂类:根据type属性,返回不同的实现类对象ContactServlet:调用工厂类的方法,获得实现类对象DAY5一、CookieCookie是完成会话跟踪的一种机制,另一种是Ssessioncookie是由服务端产生的,浏览器(客户端)访问服务端时,服务器在Http的响应头中放入一个小文本文件传给浏览器,这个文件就是cookie。一旦浏览器保存了cookie,在下一次访问服务器时,会在Http请求头中将cookie传回给服务器默认情况下cookie只能存在于一次会话中,临时保存在浏览器内存中,关闭浏览器后再次访问时,浏览器需要重新获取cookie持久性的cookie,设置cookie的最大有效时间,秒为单位,0表示立即删除该cookie,负数表示不保存cookie自动登录:需求:Login.jsp登录后转到index.jsp显示name,在cookie有效期间,打开index.jsp可以直接显示name,在cookie无效后,打开index.jsp会自动跳转到login.jsp实现:index.jsp界面,如果从request中获取到的name不为null,则打印出Hello:XXXX,并设置cookie,最大有效时间为30s否则,如果可以从request中直接获取到cookie,且length>0,则读取用户信息,并打印出Hello:XXXX上两种都不满足,则重定向到login.jsp显示最近浏览的五本书需求:books.jsp界面选择书名,跳转到book.jsp浏览详情,return,回到books.jsp界面,可以看到下方有刚刚浏览的书的名字,最多可以显示五本,且最新书名的会把最旧的顶下去实现:books.jsp界面:获取所有cookie找出和书名相关的cookie,显示cookievaluebook.jsp界面:取出所有的cookie,遍历筛选出保存书名的cookie(startWith()),保存到list中同时判断是否有重复的书名,有重复,则删除|||||||无重复有重复(已被删除了)||||||||||||list.length>=5list.length<5|||||||\/\/\/删除最旧的cookie添加新cookieCookie作用域cookie的默认的作用范围为当前目录和子目录,即当前目录写入的可以被当前目录和子目录读取,不能被其他目录的读取可以手动修改cookie的作用范围"/"表示站点根目录补充request.getContextPath()返回当前WEB应用根目录二、Session当客户端请求创建一个session时,服务器先检查请求中是否有sessionid的cookie,若包含,则服务器会去检索id对应的session对象,若不包含,服务器则会创建一个session对象,并将sessionid用cookie的方式响应给客户端。1、Session的生命周期1)什么时候创建HttpSession对象:对于JSP:如果当前JSP是客户端在WEB应用的中访问的第一页面,session为true时,则JSP会创建session对象,session为false时,则不会创建session对象;如果客户端在访问当前JSP之前已经访问过同一个WEB应用的其他JSP,而且之前访问的JSP已经为其创建了session对象,当前JSP就会返回之前那个session对象,而不会创建一个新的,不论当前JSP页面session属性是true或false对于Servlet:如果当前servlet是客户端在WEB应用的中访问的第一个资源,只有调用了request.getSession()或request.getSession(true)才会创建session对象,否则不会创建;如果客户端在访问当前servlet之前已经访问过同一个WEB应用的其他servlet,而且之前访问的servlet已经为其创建了session对象,当前servlet就会返回之前那个session对象,而不会创建一个新的。Session=”false”:页面禁用隐式session,就是不能直接session.方法,但可以使用显式session,自己创建一个session,比如HttpSessionsession=request.getSession()2)关于request.getSession(flag)方法若flag为true,则一定会返回一个HttpSession对象,如果已经有和当前JSP页面关联的HttpSession对象,直接返回;如果没有,则创建一个新的返回.flag为false:若已经存在关联的session,则返回;若没有,则返回null;request.getSession():相当于request.getSession(true)3)什么时候销毁Httpsession对象:①.直接调用HttpSession的invalidate()②.HttpSession超过过期时间. >返回最大时效:getMaxInactiveInterval()单位是秒 >设置最大时效:setMaxInactiveInterval(intinterval) >可以在tomacat配置目录下的web.xml文件中配置Session的最大时效,单位是分钟. <session-config><session-timeout>30</session-timeout></session-config>③.卸载当前WEB应用.注意:关闭浏览器不会销毁Session!2、如何在浏览器禁用cookie的情况下使用sessionURL重写:将URL改为response.encodeURL(URL)或encodeRedirectURL()原理:将sessionID以参数的形式附加在URL地址后面3、简版session购物车4、路径问题:开发时建议写绝对路径。绝对路径:相对于当前WEB应用的根目录(request.getContextPath())的路径,即相对路径都必须带上当前WEB应用的根目录,相对于站点根目录的路径不算。http://localhost:8080/request.getContextPath()/A.jsp是相对路径http://localhost:8080/A.jsp不是相对路径路径中的第一个“/”:表示WEB应用根目录:WEB.xml文件中的映射路径、请求转发(由servlet解析的路径)表示站点根目录:a标签的href属性、from标签中的action属性、请求重定向(由浏览器解析的路径)5、表单的重复提交1)重复提交的情况:①.在表单提交到一个Servlet,而Servlet又通过请求转发的方式响应一个JSP(HTML)页面,此时地址栏还保留着Serlvet的那个路径,在响应页面点击"刷新"②.在响应页面没有到达时重复点击"提交按钮".③.点击"返回",再点击"提交",(返回的是缓存页面,没有执行java代码)2)不是重复提交的情况:点击"返回","刷新"原表单页面,再"提交"。3).如何避免表单的重复提交:在表单中做一个标记,提交到Servlet时,检查标记是否存在且是否和预定义的标记一致,若一致,则受理请求,并销毁标记,若不一致或没有标记,则直接响应提示信息:"重复提交"①.仅提供一个隐藏域:<inputtype="hidden"name="token"value="atguigu"/>.行不通:没有方法清除标记.只有removeAttribute(),没有removeParameter(),此处的标记是参数而不是属性②.使用setAttribute()把标记放在reques中.此方法行不通,因为浏览器访问JSP页面的request和JSP通过表单提交方式访问servlet的request不是同一个.JSP页面中setAttribute()是针对浏览器访问JSP页面的request,而在servlet中getAttribute()是针对JSP访问servlet的request。③.把标记放在session中.可以! >在原表单页面,生成一个随机值keyValueStringkeyValue=newDate().getTime()+""; >在原表单页面,把keyValue值放入session属性中 >在原表单页面,把keyValue值放入到隐藏域中. >在目标的Servlet中:获取session和隐藏域中的token值 >比较两个值是否一致:若一致,受理请求,且把session域中的token属性清除 >若不一致,则直接响应提示页面:"重复提交"优势:对比①:session可以setAttribute()也可以removeAttribute()对比②:session存在于会话中,可以跨页面访问同一个,而request要实现多页面传输只能只用转发,提交表单会产生新的requestbb6、使用HttpSession实现验证码1).基本原理:和表单重复提交一致: >在原表单页面,生成一个验证码的图片,生成图片的同时,需要把该图片中的字符串放入到session中. >在原表单页面,定义一个文本域,用于输入验证码. >在目标的Servlet中:获取session和表单域中的验证码的值 >比较两个值是否一致:若一致,受理请求,且把session域中的验证码属性清除 >若不一致,则直接通过重定向的方式返回原表单页面,并提示用户"验证码错误"Day6一、EL:1、特性:1)Scope表示在指定范围内寻找customer对象如果不指明范围,则依次从>request->session->application找,找到就返回对象,没找到返回null2)例如customer.age这样的带符号的属性名,只能使用[]中括号[“customer.age”]${sessionScope["customer.age"].age}3)el可以自动类型转

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论