一 .使用javaEE版的Eclipse开发动态的web工程(Javaweb项目)
1,把开发选项切换到javaEE
2,可以在window->show view 中找到package Explorer,并把其拖拽到开发区的左边
3,在server面板中新建Tomcat服务器,一定要关联到Tomcat安装的根目录
4,新建一个Dynamic Web Protect,其中Target Runtime 需选择Tomcat6.0
5,开发JavaWeb应用
6,可以通过run on server 来运行Web项目。
二 .Servlet简介
1,Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和容器的通信采用“请求/响应”的模式。
功能:创建并返回基于客户请求的动态HTML页面。创建可嵌入到现有HTML页面中部分HTML页面(HTML片段)。
与其他服务器资源进行通信。
2,Servlet 容器响应客户请求的过程
①Servlet 引擎检查是否已经装载并创建该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象:调用该Servlet的构造器。
③调用Servlet实例对象init()方法。
④创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponset对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并字卸载之前调用Servlet的destroy()方法。
3,Servlet的HelloWorld
1),创建一个Servlet接口实现类。
public class HelloServlet implements Servlet{}
2),在Web.xml文件中配置和映射这个Servlet
<servlet>
<!--Servlet注册的名字-->
<servlet-name>HelloServlet<servlet-name>
<!--Servlet的全类名-->
<servlet-class>one.javaweb.HelloServlet<servlet-class>
</servlet>
<Servlet-mapping>
<!--需要和某一个Servlet节点的serlvet-name子节点的文本节点一致-->
<servlet-name>HelloServlet</servlet-name>
<!--映射具体的访问路径:/ 代表当前Web应用的根目录-->
<url-pattern>/MyJsp</url-pattern>
</Servlet-mapping>
三.Server容器:运行Servlet,jsp,Filter等的软件环境。
1.可以来创建Servlet,并调用Servlet的相关生命周期方法。
2.jsp,Filter,Listener,tag…
四.Servlet 生命周期的方法:以下方法都由Servlet容器负责调用。
1.构造器:只被调用一次,只有一次请求Servlet时,创建Servlet的实例。调用构造器,这说明Servlet的单实例。
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>one.javaweb.HelloServlet<servlet-class>
<!--可以指定Servlet被创建的时机-->
*<load-on-startup>2<load-on-startup>*
</servlet>
2.load-on-startup:可以指定Servlet被创建的时机,若为负数,则在第一次请求时被创建;若为0或正数,则在当前WEB应用被Servlet容器加载时创建实例,且数组越小越早被创建。【整数越小,越优先执行】
六.关于Servlet-mapping
1,同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。
2,在Servlet映射到的URL中也可以使用通配符,但是只能有两种固定的格式,一种格式是“.扩展名”但是只能有两种格式是以正斜杠(/)开头并以“/”结尾。
<Servlet-mapping>
<servlet-name>helloServlet</servlet-name>
*<url-pattern>*.html</url-pattern>或<url-pattern>*.do</url-pattern>*
</Servlet-mapping>
注意:以下既带 / 又带扩展名的不合法。
<Servlet-mapping>
<servlet-name>helloServlet</servlet-name>
*<url-pattern>/*.action</url-pattern>*
</Servlet-mapping>
七.ServletConfig:封装了Serlvet的配置信息,并且可以获取ServletContext对象
1,配置Servlet的初始化参数(局部的初始化参数)
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
2.获得初始化参数:
getInitParameter(Sring name):获取指定参数名的初始化参数
getInitParameterNames():获取参数名组成的Enumeration对象
String user =ServletConfig.getInitParameter("user");
System.out.println("user:"+user);
Enumeration<String> names=servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name=names.nextElement();
String value=servletConfig.getInitParameter(name);
System.out.println("^^"+name+":+value);
}
3.获取Servlet的配置名称(了解)
八.ServletContext
1.可以由SerlvetConfig获取
ServletContext ServletContext=ServletConfig.getServletContext();
2.该对象代表当前WEB应用:可以认为SerlvetContext是当前WEB应用的一个大管家。可以从中获取到当前WEB应用的各个方面的信息。
1).获取当前WEB应用的初始化参数
设置初始化参数:(全局的初始化参数)
<!--配置当前WEB应用的初始化参数(整个web值)-->
driver com.mysql.jdbc.Driver
方法:
getInitParameter
getInitParameterNames
代码:
ServletContext ServletContext =ServletConfig.getServletContext();
String driver=servletcontext.getInitParameter("driver");
System.out.println("driver:"+driver);
Enumeration<String>name2 =servletContext.getInitParameterName();
while(names2.hasMoreElements()){
string name=name2.nextElement();
system.out.println("-->"+name);
}
2). 获取当前WEB应用的某一个文件在服务器上的绝对路径,而不是部署的路径 getRealpath(String path);
代码:
String realpath=ServletContext.getRealpath("/note.txt");
system.out.println(realpath);
3).获取当前WEB应用的名称:getContextPath();
代码:
String contextPath=servlet.geetContextPath();
System.out.println(contextPath);
4).获取当前WEB应用的某一个文件对应得输入流。
getResourceAsSrteam(String path): path 的/ 为当前WEB应用的根目录。
代码:
InputStream is2=ServletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
5).和attribute相关的几个方法:
九.Get和Post请求:
1.使用GET方式传递参数:
1).在浏览器地址中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为Get。
2).如果网页中的表单素的method属性被设置为了“GET”浏览器提交这个 Form 表单时生成的HTTP请求方式也为GET.
3).使用GET请求方式给WEB服务器传递参数的格式:
http://www.atguigu.com/counter.jsp?name=1c&password=123
4).使用GET方式传递的数据量一般限制在1kb以下。
2.使用POST方式传递参数:
1).post请求方式主要用于向WEB服务器端程序提交FORM表单中的数据:form表单的method置为post
2).post方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大的多。
POST /counter .jsp HTTP/1.1
referer:http://localhost:8080/Register.html
content-type:application/x-www-form-urlencoded
host:localhost:8080
content-length:43
name=zhangsan&password=123 --请求体中传递参数。
十.如何在Servlet中获取请求信息:
1.Servlet的 Service()方法用于应答请求:因为每次请求都会调用service()方法
public void service(ServletRequest request,ServletResponse Response)
throws ServletException,IOExcetion
ServletRequest:封装了请求信息。可以从获取到任何的请求信息。
ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。
这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法时传入。
2.ServletRequest:
1).获取请求参数:
>String getparamenter(String name):根据请求参数的名字,返回参数值。
若请求参数有多个值(例如checkbox),该方法只能获取到第一个提交的值。
>String[]getParameterValues(String name):根据请求参数的名字,返回请求参数对应得字符串数组。
>Enumeration getParameterValues():返回参数的名对应得Enumeration对象,类似于ServletConfig(或ServletContext)的getInitParameterNames()方法。
>Map getParamenterMap():返回请求参数的键值对:key:参数名,value:参数值,String数组类型。
2).获取请求的URI:
HTTPServletRequest HTTPServletRequest=(HTTPServletRequest)request;
String requestURI=HTTPServletRequest.getRequestURI();
System.out.println(requestURI);
3).获取请求方式:
String method=httpServletRequest.getMethod();
System.out.println(method);//Get或post
4).若是一个GET请求,获取请求参数对应得那个字符串,即 ?后的那个字符串。
String method=httpServletRequest.getMethod();
System.out.println(queryString);//user=atguigu&password=123456&interesting=par
5).获取请求的Serlvet 的映射路径
String ServletPath=httpServletRequest.getServletPath();
System.out.println(servletPath); //loginServlet
6).和attribute 相关的几个方法:(重点)★★★★★
1).方法
void setAttribute(String name,Object o):设置属性
Object getAttribute(String name):获取指定的属性
Enumeration getAttributeNames():获得所有的属性的姓名组成的Enumeration
removeAttribute(String name):移除指定的属性
2).pageContext,request,session,application 对象都有这些方法,这四个对象也称之为域对象。
pageContext:属性的作用范围仅限于当前jsp页面
request:属性的作用范围仅限于同一个请求。(在有转发的情况下可以跨页面获得属性值)
session:属性的作用范围限于一次会话:浏览器打开直到关闭称之为一次对话(在此期间会话不失效)
application:属性的作用范围限于当前WEB应用,是范围最大的属性作用范围,只有在一次设置属性,在其他各处的jsp或Servlet中都可以获取到。
3.httpServletRequest:是SerlveRequest 的子接口。针对于HTTP请求所定义。里边包含了大量获取HTTP请求相关的方法。
4.ServletResponse:封装了响应信息,如果想给用户什么响应,具体可以使用接口方法实现。
1).getWriter():返回printWriter 对象,调用该对象的print()方法,将把print() 中的参数直接打印到客户的浏览器上。(res.getWriter().println("输出到浏览器字符串");
2).设置响应的内容类型:response.setContenType("application/msword"); //设置响应的内容类型,如word(application/msword:类型值)
3).void sendRedirect(String location):请求的重定向。(此方法为HTTPServletResponse中定义)
十一.练习:
在web.xml文件中设置两个WEB应用的初始化参数,user,password。定义一个login.html,里边定义两个请求字段:user,passworld。发送请求到loginServlet。在创建一个LoginServlet,在其中获取请求的user,password。比对其和web.xml文件的请求参数是否一致。若一致,响应Hello:XXX;若不一致,响应Sorry:XXX XXX为user
解答:
分为四个步骤:①获取请求参数:username,password
②获取当前WEB应用的初始化参数:user,password
③比对
④打印响应字符串
十二.GenericServlet(了解):
1).是一个Serlvet.是Servlet接口和ServletConfig接口的实现类,但是一个抽象类。其中的service方法为抽象方法。
2).如果新建的Servlet程序直接继承GenericSerlvet 会使开发更简洁。
3).具体实现:
①.在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化。
②.利用ServletConfig成员变量的方法实现了ServletConfig接口的方法。
③.还定义了一个init()方法,在init(SerlvetConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化
④.不建议直接覆盖init(ServletConfig),因为如果忘记编号super.init(config);,而还是用了ServletConfig接口的方法,则会出现空指针异常。
⑤.新建的init(){}并非Servlet的生命周期方法。而init(ServletConfig)是生命周期相关的方法。
public abstract class GeneriServlet implements Servlet,ServletConfig{
/**以下方法为Servlet接口的方法**/
@Override
public void destroy() {}
@Override
public ServletConfig getServletConfig() {
return ServletConfig;
}
@Override
public String getServletInfo() {
return null;
}
private ServletConfig servletConfig;
@Override
public void init(ServletConfig arg0) throws ServletException {
this.ServletConfig = arg0;
init();
}
public void init()throws ServletException{}
@Override
public abstract void service(ServletRequest arg0,ServletResponse arg1)
throws ServletException,IOException;
/**以下方法为ServletConfig接口的方法**/
@Override
public String getINitParameter(String arg0){
return servletConfig.getInitParameter(arg0);
}
@Override
public Enumeration getInitParameterNames(){
return servletConfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext(){
return servletConfig.getServletContext();
}
@Override
public String getServletName(){
return servletConfig.getServletName();
}
}
十三.HttpServlet:
1).是一个Servlet,继承自GenericServlet.针对于Http协议所定制。
2).在Service()方法中直接把ServletReuqest和ServletResponse转为HTTPServletRequest和HTTPServletResponse 并调用了重载的service(HttpServtRequest,HTTPServletResponse)
在service(HttpServtRequest,HTTPServletResponse)获取了请求方式:request.getMethod().根据请求方式有创建了doXXX()方法(XXX 为具体的请求方式,比如doGet,doPost)
/**在Service()方法中直接把ServletReuqest和ServletResponse转为HTTPServletRequest和HTTPServletResponse 。
并调用了重载的service(HttpServtRequest,HTTPServletResponse)**/
@Override
public void service(ServletRequest arg0,ServletRequest arg1)
throws ServletException,IOException{
HttpServletRequest request;
HttpServletResponse response;
try{
request = (HttpServletRequest)req;
Response = (HttpServletResponse)res;
}catch(ClassCastException e){
throw new ServletException("non-Http REquest or response");
}
service(request, response);
}
/**在service(HttpServtRequest,HTTPServletResponse)获取了请求方式:request.getMethod().根据请求方式有创建了doXXX()方法(XXX 为具体的请求方式,比如doGet,doPost)**/
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
//1.获得请求方式
String method = request.getMethod();
//2.根据请求方式再强用对应得处理方法
if("GET".equalsIgnoreCase(method)){
doGet(request,response);
}else if("Post".equalsIgnoreCase(method)){
doPost(request,response);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
3).实际开发中,直接继承HTTPServletRequest,并根据请求方式复写doXxx(doget/dopost)方法即可。
4).好处:直接由针对性的覆盖doXxx()方法;直接用HTTPServletRequest 和HttpServletResponse,不再需要强转。
十四.练习:
在MySQL数据库中创建一个test_users数据表,添加3字段;ID,user,password.并录入几条记录。
定义一个login.html,里边定义两个请求字段:user,password.发送请求到loginServlet
在创建一个LoginServlet(需要继承自HTTPServlet,并重写其dopost方法)。
在其中获得请求的user,password。
利用JDBC从Test_user中查询有没有和页面输入的user,password对应得记录
SELECT count(id)FROM test_users WHERE user = ?AND password = ?
若有,响应HelloXxx,若没有,响应Sorry.Xxx .Xxx为user.
十五.jsp:
1).WHY:
jsp是简Servlet编写的一种技术,它将java代码和HTML语句混合在同一个文件中编写,只对网页中的要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。
2)Java Server Page:Java服务器网页。在HTML页面中Java代码的页面。
helloworld:
新建一个jsp页面,在body节点内的<% %>即可编写java代码。
<body>
<%
Date date=new Date();
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页面的隐含变量:没有声明就可以使用的对象(共九个)
public void_jspService(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException{
PageContext pageContext = null;
HttpSession session =null;
ServetContext application =null;
JspWriter out = null;
Object page=this;
//...
//使用<% %>编写的代码在此位置。可以用到request,response,pageContext,
//session,application,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>hello.jsp</servlet-name>
<url-pattern>hello.jsp</url-pattern>
</servlet-mapping>
⑦.out:JspWriter对象。调用out.println()可以直接把字符串打印到浏览器。★
⑧.page:指向当前jsp对应Servlet对象的引用,但为Object类型,只能调用Object类的方法(几乎不用)。
⑨. except:在声明了page指令的isErrorPage="true"时,才可以使用。★
<%@ page isErrorPage="true"%>
【pageContext,request,session, application(对属性的作用的域范围从小到大)
out,response,config,page
exception 】
十六.请求的转发和重定向: ★★★★★
1).请求转发的代码
//1.调用HttpServletRequest的getRequestDispatcher()方法获取RequestDispatcher对象
//调用getRequestDispatcher需要传入要转发的地址
String path="testServlet";
RequestDispatcher RequestDispatcher=Request.getRequestDispatcher("/"+path);
//2.调用HttpServletRequest的forword(request,response)进行请求的转发。
RequestDispatcher.forword(request,response);
2).请求的重定向的代码:
//执行请求的重定向,直接调用response.sendRedirect(path)方法,
//path为要重定向的地址
String path="testServlet";
response.sendRedirect(path);
3).本质区别:请求的转发只发出了一次请求,而重定向则发出了两次请求。
具体:
①.请求的转发:地址是初次发出请求的地址。
请求的重定向:地址栏不再是初次发出的请求地址。地址栏为最后响应的那个地址
②.请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象。
请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象。
③.请求转发:只能转发给当前WEB应用的资源。
请求的重定向:可以重定到任何资源。
④.请求转发:/代表的是当前WEB应用的根目录。
请求的重定向:/代表的是当前WEB站点的根目录。
注:当前WEB应用的根目录:http://localhost:8989/day_30/
站点的根目录:http://localhost:8989/
(★★★★★表示关联,★表示常用)