JavaWeb(上)

一 .使用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的初始化参数(局部的初始化参数)

secondServlet one.javaweb.HelloServlet user root
	 <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/ 

(★★★★★表示关联,★表示常用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值