栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

JavaWeb使用详解

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb使用详解

一、Http

HTTP是基于TCP协议的,TCP负责数据传输,而HTTP只是规范了TCP传输的数据的格式。HTTP服务的底层实现就是socket编程。

8中请求类型:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT
常用的两种请求:
GET:
地址和参数信息中间用?分割
查询字符串会显示在地址栏的URL中,不安全
GET方法有大小限制:请求字符串中最多只能有1024个字符
GET请求能够被缓存,会被保存在浏览器的浏览记录中
可以添加书签
只允许ASCII字符类型,不能用二进制流
点击刷新时,不会有反应
GET请求主要用于获取数据
POST:
使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器
没有历史记录
参数类型没有限制,可以是字符串也可以是二进制流
数据不会显示在地址栏中,也不会缓存下来或保存在浏览记录中
查询字符串不会显示在地址栏中
POST传输的数据量大,可以达到2M
POST是为了将数据传送到服务器

二、创建Servlet
 
2.1 通过Servlet接口创建Servlet 
 
public class FirstServlet implements Servlet {
	//servlet:默认第一次访问的时候会被创建
	//通过配置可以设置服务器一启动的时候就创建对象:即在web.xml中servlet中添加4,其中数字代表优先级,
	//即启动服务器时,先创建哪个servlet
	//创建的对象会被缓存,即再次请求时仍然调用此对象
	
	//init当servlet创建的时候调用
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
//		System.out.println("init...");
		//config:可以获取一些配置信息
		//1.可以获取Servlet名称:web.xml中servlet-name
//		String name = config.getServletName();
//		System.out.println("FirstServletName:"+name);
		
		//2.获取一些初始化参数: web.xml中的init-param
//		String value = config.getInitParameter("myserv");
//		System.out.println("InitParameter:"+value);
		
		//3.获取ServletContext
//		ServletContext sc = config.getServletContext();
		
	}
	
	//service:当每一次发送请求的时候就会调用一次
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("Hello Servlet");
		
		HttpServletResponse hsr=(HttpServletResponse) res;
		hsr.getWriter().write("Hello Servlet,Welcome");
	}
	
	//destroy:当servlet销毁时调用,即服务器关闭时调用
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		//System.out.println("destroy...");
		
	}
    ...
}
// web.xml中配置

    aaa
    com.yc.FirstServlet
    
        myserv
        123
    
    3


    aaa
    /first


2.2 通过注解创建Servlet
@WebServlet("/servlet")  //括号中的内容就是url-pattern中的内容,需要添加/

//web.xml中web-app元素中可能带有metadata-complete属性,如果为true,则不扫描注解等配置,只应用web.xml中的配置,为false,则扫描,默认为false
public class MyServlet extends HttpServlet {
	//一旦写了service方法,就不会再去找doGet或doPost方法
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("111");
		response.getWriter().write("Hello World");
	}
    //当get请求时调用此方法
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet");
	}

	//当post请求时调用此方法
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost");
	}
}

2.2.1 HttpServlet

HttpServlet

  • 直接new的Servlet它是一个HttpServlet

  • 它是GenericServlet的子类
    class HttpServlet extends GenericServlet

  • GenericServlet实现了Servlet接口

    class GenericServlet implements Servlet

  • HttpServlet是专门负责处理http请求与响应的

  • 以后创建Servlet时,直接使用httpServlet

2.2.2 service方法
//1.获取请求参数
String name=request.getParameter("username");
String pwd=request.getParameter("pwd");
2.3 Eclipse中可以直接创建Servlet应用 三、ServletContext

@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		ServletContext sc1 = config.getServletContext();
		System.out.println("init:"+sc1);
	}

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("FirstServlet");
		//本质仍然是通过init方法中的config获取,当init重写后,无法获取到,运行时报错,此时需要在init方法中添加 super.init(config);
		ServletContext context = this.getServletContext();
		System.out.println("service:"+context);
		
		//加载一个文件时,需要绝对路径
		//把当前字符串与根路径拼接,得出字符串中文件的绝对路径
		//根路径:指web应用的根路径,如:D:DevelopToolsTomcatapache-tomcat-9.0.17webapps4_Servlet
		//此时a.txt是在项目的WebContent下,WEB-INF下的文件需要写成:WEB-INFb.txt,
		String realPath = context.getRealPath("a.txt");
		System.out.println(realPath);
		
		//项目中src下的文件会被加载到webapps4_ServletWEB-INFclasses下,
		//可以使用类加载器,获取字节码的路径,到字节码目录中加载资源
		//资源不存在则报错
		String path = FirstServlet.class.getClassLoader().getResource("c.txt").getPath();
		//String path = FirstServlet.class.getClassLoader().getResource("servlet/d.txt").getPath();
//		String path = FirstServlet.class.getClassLoader().getResource("../b.txt").getPath();
		System.out.println(path);
	}
}
//写入一些信息到ServletContext
sc.setAttribute("hk", "河南科技大学");
//删除信息
sc.removeAttribute("hk");
四、response 4.1 response设置响应信息

@WebServlet("/ResponseServlet")
public class A_ResponseServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置响应行中状态码
		response.setStatus(200);
		//response.setStatus(302);
		
		//设置响应头
		//添加响应头
		response.addHeader("name", "areadark"); //添加字符串类型
		response.addIntHeader("age", 18);  //添加int类型
		response.addDateHeader("my-Date", new Date().getTime());
		
		//修改响应头
		response.setHeader("name", "zs");
		response.setIntHeader("age", 22);
		
		//重定向:进行资源跳转或页面跳转
		//设置重定向
		//response.setHeader("location", "/06_Servlet/LocationServlet"); //需要将状态码设为301或302
		//response.sendRedirect("/06_Servlet/LocationServlet"); //不需要设置状态码
		
		//定时刷新
		//response.setHeader("refresh", "3;url=/06_Servlet/LocationServlet"); //3秒后跳转
		//response.setHeader("refresh", "2"); //2秒刷新一次
		
		
		//Response响应解决中文乱码问题:需要放在设置响应体之前设置
		//在写之前可以设置缓冲区使用的编码
		//response.setCharacterEncoding("UTF-8");
		
		//浏览器在响应时可能会使用其他编码,
		//所以在响应当中可以主动告诉浏览器使用什么编码来接收
		//response.setHeader("Content-Type", "text/html;charset=UTF-8");
		
		//使用简写形式
		//因为在setContentType方法中已经调用了setCharacterEncoding方法设置了Response容器的编码了,所以上面两行代码都可以省略
		response.setContentType("text/html;charset=UTF-8");
		
		//设置响应体
		//写字符
		response.getWriter().write("areadark");
		//如果字符中有HTML,浏览器会自动解析
		response.getWriter().write("areadark");
		
		//默认情况,写的内容存到缓冲区中使用的是ISO8859,不支持中文,会乱码
		response.getWriter().write("河南科技大学");
	}
}
4.2 向浏览器发送图片
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//向浏览器写一张图片
		String path = this.getServletContext().getRealPath("1.jpg");
		//加载图片
		FileInputStream in=new FileInputStream(path);
		//获取一个输出流,通过ServletOutputStream向浏览器输入二进制流
		//getWrite()和getOutputStream()不能同时使用
		ServletOutputStream out = response.getOutputStream();
		int total=0;
		byte[] bs=new byte[1024];
		while((total=in.read(bs))!=-1) {
			out.write(bs, 0, total);
		}
		in.close();
		out.close();
	}

五、request 5.2 request获取请求信息
@WebServlet("/A_Request")
public class A_Request extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//请求行
		//1.1获取请求方式:get/post
		String method = request.getMethod();
		System.out.println(method);
		//1.2请求资源 URL URI
		StringBuffer url = request.getRequestURL();
		String uri = request.getRequestURI();
		System.out.println(url);
		System.out.println(uri);
		//1.3获取get请求参数
		String queryString = request.getQueryString();
		System.out.println(queryString);
		//1.4获取当前web应用名称
		String contextPath = request.getContextPath();
		System.out.println(contextPath);
		
		//请求头
		//1. 获取所有的请求头名称
		Enumeration headerNames = request.getHeaderNames();
		while(headerNames.hasMoreElements()) {
			System.out.println(headerNames.nextElement());
		}
		//2.根据名称获取指定的头信息
		//referer:通过获取referer可以获取此次访问请求的来源,即告诉服务器从哪个页面链接过来的
		
		String referer = request.getHeader("referer");
		System.out.println("referer : "+referer);
		//3.打印所有的请求头和请求头内容
		Enumeration hn = request.getHeaderNames();
		while(hn.hasMoreElements()) {
			String name=hn.nextElement();
			String value=request.getHeader(name);
			System.out.println(name+" : "+value);
		}
		
		//请求体
		//1.获取一个值
		String user = request.getParameter("user");
		System.out.println(user);
		//2.获取多个值,如多选按钮
		String[] values = request.getParameterValues("hobby");
		System.out.println(Arrays.toString(values));
		//3.获取所有请求参数名称
		Enumeration names = request.getParameterNames();
		while(names.hasMoreElements()) {
			System.out.println("参数名称:"+names.nextElement());
		}
		System.out.println("-----------------");
		//4.获取所有请求参数
		Map map = request.getParameterMap();
		for(Map.Entry m:map.entrySet()) {
			System.out.println(m.getKey());
			System.out.println(Arrays.toString(m.getValue()));
		}
	}
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		
		//使用post提交方式时,可以使用下面设置编码方式,对于get不适用
		//设置编码需要放在获取参数前面
		request.setCharacterEncoding("UTF-8");
		String user = request.getParameter("user");
		//System.out.println(user);
		
		Map map = request.getParameterMap();
		for(Map.Entry m:map.entrySet()) {
			System.out.println(m.getKey());
			System.out.println(Arrays.toString(m.getValue()));
		}
		
		User u=new User();
		try {
			//把传入的参数转成User对象
			//注:标签中的name名必须和对象中的属性名一样
			BeanUtils.populate(u, map);
		} catch (IllegalAccessException | InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(u);
	}
5.3 请求转发
//请求转发
//1.获取转发器
RequestDispatcher dis = request.getRequestDispatcher("/C_Request2");

//request域对象:作用域一次请求中,包括请求转发过程
//生命周期:从一次请求开始到请求结束
request.setAttribute("aa", "areadark");
dis.forward(request, response);
5.4 会话技术
 
5.4.1 cookie 
//1.创建cookie
cookie cookie = new cookie("name", "zs");

//设置cookie在客户端的存储时间,单位为秒,设置持久化时间后,cookie信息会被存储到浏览器的磁盘文件里,过期自动删除
//为0时,相当于立即删除cookie
cookie.setMaxAge(20);

//设置只要在指定的web过程下,都可以携带cookie信息
//cookie.setPath("/10_Servlet_cookie_Session");
//设置访问某一个servlet时携带cookie信息
cookie.setPath("/10_Servlet_cookie_Session/SecondServlet");
//设置访问服务器下部署的所有过程都能携带cookie,一般不会用
//cookie.setPath("/");

//2.响应给浏览器
response.addcookie(cookie);
//服务器获取客户端携带的cookie
//通过request对象的getcookies()方法,获取的是所有cookie,需要进行遍历,找到需要的那个
cookie[] cs = request.getcookies();
if(cs!=null) {
    for(cookie c:cs) {
        String name = c.getName();
        if(name.equals("name")) {
            response.getWriter().write(c.getValue());
        }
    }
}
5.4.2 session
@WebServlet("/Session_01")
public class Session_01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置session对象
		
		HttpSession session = request.getSession();
		session.setAttribute("add", "areadark.com");
		//主动销毁对象
//		session.invalidate();
	}
}
HttpSession session = request.getSession();
cookie cookie = new cookie("JSESSIONID", session.getId());
cookie.setPath("/10_Servlet_cookie_Session");
cookie.setMaxAge(60*5);
response.addcookie(cookie);

session.setAttribute("url", "www.areadark.com");

**注:**tomcat6之后,默认情况下,设置session持久化,关闭服务器,session仍然保存下来,
可以将tomcat中conf文件夹下的context.xml中的 注释取消掉。

六、JSP 6.1 JSP简介

JSP:本质就是一个Servlet,jsp在第一次被访问时会被web容器翻译成servlet,即编译成java和class文件,
存放在tomcat目录下:workCatalinalocalhost11_JSPorgapachejsp

  • <% java代码 %> 脚本片段,可以直接编写Java代码,内部的java代码会翻译成service内部的方法

  • <%=java变量或表达式 %> JSP表达式,可以将一个对象直接输出到页面中,翻译成service方法内部的out.print(…)

  • <%! java代码 %> 声明,会被翻译成servlet的成员内容

HTML注释: JSP源码、翻译后的servlet、页面可见
Java注释:// 或 jsp源码可见,翻译后的servlet、页面中看不到
JSP注释:<%–内容–%> 只有jsp源码可见

6.2 JSP指令

JSP指令:用于设置整个JSP页面的相关信息,以及用于JSP页面与其它容器之间的通信,
形式:<%@ 指令名称 attribute=“value” …%>
1.include指令:在JSP页面中包含其他文件,属于静态包含,<%@ include file=“文件的相对地址” %>
2.page指令:用于设定整个JSP页面的属性和相关功能,为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
page指令的属性:
contentType:指定JSP页面的MIME和编码格式。
pageEncoding:指定JSP文件的编码格式。
import:在JSP中引入Java的包和类,多个包之间用逗号隔开。
session:指定当前页面是否能获得当前用户的session对象,默认为true,为false时,无法使用session。
errorPage:如果当前页面发生异常,会重定向到errorPage指定的页面处理。
isErrorPage:指定当前页面是否可以作为另一个JSP页面的错误处理页面。
language:定义JSP页面所用的脚本语言,默认是Java。
extends:用于指定该JSP生成的servlet继承自哪个类,指明包加类名,一般不用。
buffer:设置输出流缓冲区大小。
autoFlush:用来指定当输出流缓冲区满了的时候,是否自动刷新缓冲区。
isThreadSafe:指定对JSP页面的访问是否为线程安全,是否支持多线程访问,默认为true。
info:定义JSP页面的描述信息。
isELIgnored:指定是否执行EL表达式。
3.taglib:声明了JSP文件使用了标签库。
标签库:JSP标准标签库、第三方标签库、自定义标签库。

6.3 标签动作

标签动作:与JSP指令元素不同的是,JSP标签动作在请求处理阶段起作用,
利用JSP标签动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。

  1. 动态包含:
    与静态包含区别:静态包含会把包含文件与原JSP文件转化成同一个servlet,并编译成一个java和class文件,而动态包含则是把包含文件与原JSP文件转化成各自的servlet,并编译成各自的java和class文件,在原JSP转化的servlet中引用包含文件转化的servlet。

  2. 请求转发:

  3. 加载JavaBean:

  加载一个将在JSP页面中使用的JavaBean
      设置已经实例化的Bean对象的属性,可以用value给属性赋值,或者用param指定用哪个请求参数作为Bean属性的值,value和param不能同时用。
      提取指定Bean属性的值,转换成字符串,然后输出。

6.4 JSP隐式对象

JSP隐式对象(内置对象):
是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。

预定义变量解释
requestHttpServletRequest 接口的实例
responseHttpServletResponse 接口的实例
outJspWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关
configServletConfig类的实例
pageContextPageContext类的实例,也是一个域对象,提供对JSP页面所有对象以及命名空间的访问,可以向指定的其他域中存取数据,如:pageContext.setAttribute(“str”, attr, pageContext.APPLICATION_SCOPE); ,可以获得其他8个隐式对象
page指当前页面转换后的servlet类的实例,类似于Java类中的this关键字
ExceptionException类的对象,代表发生错误的JSP页面中对应的异常对象
<%-- 如果在JSP页面上同时使用out对象和response.getWriter()对象进行输出,
	不管哪个对象在前面调用write()方法,都是response.getWriter()对象会先输出数据。 
	out写的内容放到out缓冲区中,最后把out缓冲区中的内容合并到response缓冲区后,
	当out缓冲区设置为0时,代表关闭out缓冲区,out写的内容直接写到response缓冲区中
	--%>
<%
	out.write("ccc");
	response.getWriter().write("ddd");
%>
6.5 EL表达式

EL表达式(Express Language):
可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是替代jsp页面中脚本的编写。
作用:主要是获得四大域中的数据,

域对象格式
pageContext${pageScope.key名}
session${sessionScope.key名}
request${requestScope.key名}
application(ServletContext)${applicationScope.key名}

pageContext获得其他八大隐式对象,如:获得当前项目名称: p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h 简 写 : {pageContext.request.contextPath} 简写: pageContext.request.contextPath简写:{key名},从四个域中获取某个值,依次从pageContext域,request域,session域,application域,即范围从小到大找,找到之后就不再往后寻找了。
EL执行表达式:是指在${…}内部可以进行运算

request和requestScope的区别:

(1)request对象通常用来接收从客户端通过表单提交过来的数据,然后在servlet或者action中用request.getParameter()的方法获取获取参数内容;

(2)而requestScope通常是在servlet和action中通过request.setAttribute()方法把数据放到request对象中供客户端获取,然后客户端获取的方法就是requestScope.getAttribute()。

6.6 JSTL

JSTL(JSP Standard Tag Library):JSP 标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能,
出现的目的同el一样也是要替代jsp页面中的脚本代码
JSTL标准标签库有5个子库,常用:Core:核心库:
1.需要把标签库jar包导入:jstl-1.2.jar
2.引入标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
if标签:内容
test中为判断条件,满足条件时,内容才会显示出来,通常结合el表达式一起使用。
var相当于在域中定义一个存储数据的key,域默认为PageContext,即pageScope,用scope可以修改var的作用域,两者可以不添加。
forEach标签:
普通循环:输出内容 begin和end中数据为int类型,第一个元素下标为0
增强for循环:
1.遍历字符串集合:


	${status.index}
	${s }

​ //strList是一个集合
​ //varStatus:循环的状态信息,
​ varStatus属性的参数:
​ current:当前这次迭代的(集合中的)项
​ index:当前这次迭代从 0 开始的迭代计数
​ count:当前这次迭代从 1 开始的迭代计数
​ first:用来表明当前这轮迭代是否为第一次迭代的标志,返回true/false
​ last:用来表明当前这轮迭代是否为最后一次迭代的标志,返回true/false
​ 如:${status.index}
​ 2.遍历对象集合
​ 3.遍历map

七、四大域对象
域对象作用范围
PageContext域作用范围是整个JSP页面,是四大作用域中最小的一个;生命周期是当对JSP的请求时开始,当响应结束时销毁。
Request 域作用范围是整个请求链(请求转发也存在);生命周期是在service方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
Session域作用范围是一次会话
ServletContext作用范围是整个Web应用。当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟着销毁。
八、javaEE开发模式
model1模式(早期模式):jsp+javaBean,业务多时,导致jsp页面容易混乱
model2模式:jsp+servlet+javaBean,
	优点:开发中使用各个技术擅长的方面,如servlet擅长java的业务代码,jsp擅长页面的展示。
	此模式即MVC模式:
		Model:javaBean  封装数据
		View:JSP  页面展示
		Controller:servlet  获取数据,对数据进行封装,传递数据、指定页面显示

三层架构:是指Web层、Service层、DAO层,Web层采用的是MVC模式li
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/334109.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号