G_05_JAVAWEB

	1、Tomcat下载:
		1下载地址:https://tomcat.apache.org/download-80.cgi
		2、下载完成后解压到任意指定目录
		3、目录介绍:
			bin:脚本程序 可执行命令
			conf:配置目录 内部有一个server.xml核心配置文件
			lib:依赖库目录
			logs:日志目录
			temps:临时文件
			webapps:WEB应用发布目录 把开发的项目都放在该目录运行
			work:tomcat处理jsp的工作目录
		4、启动tomcat
			进入解压目录
			找到bin目录
			找到startup.bat 双击启动脚本 
				启动失败原因:
					1)没有配置JAVA_HOME
						将jdk文件目录 bin的上一目录地址加入到JAVA_HOME当中
					2)端口冲突:默认端口8080
						i、终止端口占用成序: cmd->netstate -aov
							查找占用8080端口的程序的pid
							ctrl+alt+delete打开任务管理器->将对应PID的程序关闭
						ii、到config目录中的server.xml
							找到<Connector port=8080 protocol="HTTP/1.1"
										connectionTimeout="20000"
										redirectPort="8443"/>
							进行修改
	2、TOMCAT启动
		1)配置环境:
			将jdk文件目录 bin的上一目录地址加入到JAVA_HOME当中
		2)打开TOMCAT目录下的bin中的startup.bat
		3)启动后不要将startup.bat关掉
		4)测试是否启动成功
			http://localhost:8080
	3、启动过程出现端口冲突解决办法
		1)cmd->netstat -aov
		2)查找占用8080端口的程序的pid
		3)ctrl+alt+delete打开任务管理器->将对应PID的程序关闭
	4、TOMCAT WEB应用目录结构
		webName:
			1)html jsp js
			2)WEB-INF
				i、classes目录:java类字节码文件
				ii、lib目录:java类运行时需要的jar包
				iii、web.xml文件:当前整个web应用的核心配置文件
								可以到ROOT当中复制一个过来
				WEB-INF下的资源bbu不能直接通过浏览器访问,是保护的外界不能直接访问
	5、再javaee中创建web项目
		1)new->other->web->dynamic web project->选择tomcat服务器->2.5版本
	6、再eclipse中配置server服务器
		window->preferences->server->runtime environments->添加tomcat服务器
	7、再eclipse底栏 中留下server
		如果eclipse底栏无可通过以下步骤添加
			window->show view->将需要显示的勾选
	8、我们再workspace中创建javaweb项目,所以需要将其加入到webapps中
		右击server-》add and remove
		说明:
			1)会再tomcat的webapps目录下创建一个m名称mypro的目录
			2)会把WEB-CONTENT当中所有内容f放入到webapps目录下
			3)不会把java代码放入,运行时只需要字节码
		双击server
		选择Use Tomcat installation 
		Deploy path :webapps
		右击server-》start
	9、Tomcat启动速度优化
		Dynamic web model version选择2.5是考虑可以自动创建web.xml
		1)Dynamic web model version选择3.0
		2)将Dynamic web model version选择2.5创建的web.xml文件复制过来
		3)将web.xml约束文件改成3.0版本的 并再约束后面加<absolute-ordering/>
	10、发布程序详解:
		打开Servers下的server.xml
		<Context docBase="mypro2" path="/mypro2" reloadable="true" source="org.eclipse.jst.jee.server:mypro2"/>
		表示将mypro2发布到server中,
		Context:
			docBase:相对我门当初部署时webapps的文件路径
			path:表示url地址http://localhost:8080/mypro2 中8080后跟的内容
			reloadable:字节码变化服务器是否重新加载web应用
	11、虚拟主机
		Host文件:windows/System32/drivers/etc
		在这里插入图片描述
	

在这里插入图片描述

二、Servlet和Servlet配置

	1、第一个Servlet程序
		1)创建一个web程序
		2)再src下c创建一个包名:com.it666.servlet
		3)再包当中创建一个class 起名为FirstServlet
		4)FirstServlet实现Servlet接口(重点看service)
		5)再web.xml进行配置
			<servlet>
				<servlet-name>abc</servlet-name>
				<servlet-class>com.it666.servlet.FirstServlet</servlet-class>
			</servlet>
			<servlet-mapping>
				<servlet-name>abc</servlet-name>
				<url-pattern>/first</url-pattern>
			</servlet-mapping>
	2、获取字节码文件
		Class clazz1=Class.forName("...");
		Class clazz2=Person.class;
		Person p=new Person()
		Class clazz3=p.getClass();
	3、通过字节码创建对象:
		Person p=(Person) clazz1.newInstance();
	3、通过有参数的构造器创建对象
		Constructor c=clazz1.getConstructor(String.class,Integer.class);
		Person p2=(Person)c.newInstance("鲁班",6);
	4、获取公共字段
		Field f=clazz1.getField("name");
		f.set(p2,"李白");
	5、获取私有字段
		Field f=clazz1.getDeclaredField("age");
		f.setAccessible(true);
		f.set(p,20);
	6、获取公共方法:
		Method m1=clazz1.getMethod("show");
	7、获取私有方法
		Method m2=clazz1.getDeclaredMethod("eat",String.class);
		m2.setAccessible(true);
		m2.invoke(p2,"米饭");
	8、通过反射绕过集合泛型检测
		ArrayList<Integer> list=new ArrsyList<>();
		list.add();
		 
		 Class<?>clazz=Class.forName("java.util.ArrayList");
		 Method m=clazz.getMethod("add",Object.class);
		 m.invoke(list,"dasd");
	9、Tomcat反射加载Servlet
	10、Servlet方法调用时机:
		1)init:当servlet创建时调用
		2)service:每一次发送请求时调用
		3)destroy:servlet销毁时调用(服务器关闭时调用)
		启动优先级:
			<servlet>
				<servlet-name>abc</servlet-name>
				<servlet-class>com.it666.servlet.FirstServlet</servlet-class>	
				<load-on-startup>3</load-on-startup>
			</servlet>
			<servlet-mapping>
				<servlet-name>abc</servlet-name>
				<url-pattern>/first</url-pattern>
			</servlet-mapping>
	11、Servlet访问流程
	12、init方法参数介绍:
		ServletConfig config:
		1)可以获取一些配置信息
			//1、可以获取Servlet名称(web.xml中的servlet-name中的值)
			String name=config.getServletName();
			//2、hhu获取一些初始化参数web.xml
			String value=config.getInitParameter("myxq");
			<servlet>
				<servlet-name>abc</servlet-name>
				<servlet-class>com.it666.servlet.FirstServlet</servlet-class>	
				<init-param>
					<param-name>myxq</param-name>
					<param-value>1234</param-value>
				</init-param>
			</servlet>
			<servlet-mapping>
				<servlet-name>abc</servlet-name>
				<url-pattern>/first</url-pattern>
			</servlet-mapping>
			//3、获取ServletContext
			ServletContext sc=config.getServletContext();
	13、使用注解创建servlet
		在web.xml的约束中,将metadata-complete="true"改成false,即进行注解扫描
		@WebServlet("/lkServlet")  括号中的内容是url-pattern
		public class LkServlet extends HttpServlet{	
		}
	14、doGet doPost:
		@WebServlet("/lkServlet")  括号中的内容是url-pattern
		public class LkServlet extends HttpServlet{
			private static final long serialVersionUID=1L;
			//一旦你写了service就不会再找doGet doPost
			protected void service(HttpServletRequest request,HttpServletResponce responce)
			{}
			protected void doGet(HttpServletRequest request,HttpServletResponce responce)
			{}
			protected void doPost(HttpServletRequest request,HttpServletResponce responce)
			{}
		}
	15、登录功能
		1)index.html
			<form action="http://localhost:8080/25-servlet/LoginServlet" method="get">
				<input type="text" name="username"/>
				<input type="text" name="pwd"/>
				<input type="submit" value="登录"/>
			</form>
			
		1)再com.it666.login包下c创建一个Servlet
			@WebServlet("/LoginServlet")
			public class LoginServlet extends HttpServlet{
				//1、获取请求参数
				String username=request.getParamater("username");
				String pwd=request.getParameter("pwd");
				//2、使用dbutils连接到数据库中
				jdbcUtil.getDataSource();
			}
			dbutils连接到数据库操作:
				1)导入jar包:commons-dbutils-1.4.jar
							druid-1.0.15.jar
							mysql-connector-java-5.1.40.jar
		

三、Responce响应

	1、相应行:设置状态码
	response.setState(int code);
	2、响应头:添加响应头
	response.addHeader("name","it666");
	response.addIntHeader("age",10);
	response.addDateHeader("my-Date",new Date().getTime());
	3、修改响应头
	response.setHeader("name","lk");
	response.setIntHeader("age",20);
	4、response重定向
		到服务器中找servlet1结果servlet1当中没有这个资源,告诉你去找servlet2,再去发送一个请求到servlet2
		1)状态码:302
		2)特点:要访问两次服务器
		第一次访问是人为的去访问,第二次是自动访问。浏览器地址栏已经发生变化
		3)设置重定向
			//设置状态码
			response.setStatus(302);
			//设置响应头
			response.setHeader("location","/bei/servlet2");
			//内部封装的重定向
			response.sendRedirect("/bei/servlet2");
			//定时刷新重定向 隔3秒才去转发
			response.setHeader("refresh","3;url=/bei/servlet2");
	5、设置响应体
		//写字符
		response.getWriter().write("it666");
		//如果字符当中有html浏览器会帮你解析
		response.getWriter().write("<h1>it666</h1>");
		//解决中文乱码,再中文之前ssh设置缓冲区编码UTF-8
		response.setCharacterEncoding("UTF-8);
		response.getWriter().write("我叫");
		//上述设置编码可以解决服务器中文编码,但有时浏览器编码非utf-8也会发生乱码,以下再servlet中告诉浏览器用何种编码接收
		response.setHeader("Content-Type","text/html;charset=UTF-8");
		简写:
		response.setContentType("text/html;charset=UTF-8");
	6、FileInputSteam读取一个字符
		String path=this.getServletContent().getRealPath("a.txt");
		FileInputStream in=new FileInputStream(path);
		//读取字节码
		//读取一个字符
		System.out.println(in.read());
		System.out.println(in.read());
		System.out.println(in.read());
		in.close();
	7、FileInputStream读取多个字符
		String path=this.getServletContent().getRealPath("a.txt");
		FileInputStream in=new FileInputStream(path);
		byte[] buffer=new byte[3];
		//len返回当前读取了几个字符 如果一个字符都没读返回-1
		len=in.read(buffer);
	8、FileInputStream读取整个文件
		ine len=0;
		while((len=in.read(buffer))!=-1){
			System.out.println(Arrays.toString(buffer);
			System.out.println(new String(buffer,0,len));
		}
	9、Response响应图片
		String path=this.getServletContent().getRealPath("a.png");
		FileInputStream in=new FileInputStream(path);
		//获取一个输出流
		ServletOutPutStream out=response.getOutputStream();
		byte[] buffer=new byte[1024];
		while((len=in.read(buffer))!=-1){
			System.out.println(Arrays.toString(buffer);
			out.write(buffer,0,len);
		}
	10、文件下载
		1)a标签下载
			<a href="/26-Servlet/download/a.mp4">a.mp4</a>
			<a href="/26-Servlet/download/code.png">code.png</a>
			<a href="/26-Servlet/download/c.rar">c.rar</a>
		2)发送servlet下载
			在html中填写:
			<a href="/26-Servlet/DownloadServlet?filename=a.mp4">a.mp4</a>
			<a href="/26-Servlet/DownloadServlet?filename=code.png">a.mp4</a>
			<a href="/26-Servlet/DownloadServlet?filename=c.rar">a.mp4</a>
			在servlet的service中填写:
			String name=request.getParameter("filename");
			//根据文件名来获取mime类型
			String mimeType =this.getServletContent().getMimeType(name);
			//设置mimeType
			response.setContentType(mimeType);
			//告诉浏览器是以附件形式来下载,不要解析
			response.setHeader("Content-Disposition","attachment;filename="+name);
			String path=this.getServletContext().getRealPath("download/"+name);
			根据path加载文件
			FileInputStream in= new FileInputStream(path);
			ServletOutputStream out=response.getOutputStream();
			byte[] buffer =new byte[1024];
			int len=0;
			while((len=in.read(buffer))!=-1){
				out.write(buffer,0,len);
			}
		
	

四、request

	1、获取请求
		1)在index.html当中
		<form action="/27-Request/RequestServlet">
			<input type="text" placeholder="请输入一些信息...">
			<input type="submit" value="提交" placeholder="请输入一些信息...">
		</from>
		2)servlet
		@WebServlet("/RequestServlet")
		public class RequestServlet extends HttpServlet{
			private static final long serialVersionUID=1L;
			protected void service(HttpServletRequest request,HttpServletResponse response){
				//请求行
				//1、获取请求方式
				String method =request.getMethod();
er				StringBuffer requestURL=request.getRequestURL();
				String requestURI=request.getRequestURI();
				//3、获取get请求参数
				String queryString=request.getQueryString();
				//4、获取当前web应用名称
				String contextPath=request.getContextPath();

				//请求头
				//1、获取所有的请求头名称
				Enumeration<String> headNumbers=request.getHeaderNames();
				while(headerNames.hasMoreElements()){
					System.out.println("name="+headerNames.nextElement());
				}
				//2 根据名称获取指定
			}
		}

五、登录注册功能

	1、每次创建domain都要创建getter和setter方法,比较冗余,可以安装lombok
		1)lombok
			官方地址::https://projectlombok.org/
			github:https://github.com/rzwitserloot/lombok
			是一款小巧的代码生成工具
			自动生成getter 和setter方法
			提高开发效率
			代码简洁 直观 减少大量冗余代码
			减少后期的维护成本
		2)Ideal中lombok安装
			下载:http://projectlombok.org/download
			网盘地址:https://pan.baidu.com/s/1nJseVJGq8llSKDPQ2IEyeA 
					提取码:zily 
		3)eclipse安装lombok     
			1)下载lombok.jar  http://projectlombok.org/download
			2)打开下载的lombok文件夹
				按住shift同时鼠标右键 点击命令窗口
			3)运行lombok.jar
				在lombok.jar所在目录中打开cmd  输入java-jar .\lombok.jar
			4)运行后会出现新的界面
				界面中会自动找到eclipse.exe所在路径 
				如果没找到自己指定位置即点击Specify location 找到eclipse.exe所在目录
			5)点击install/upstate即安可安装
		4)ideal安装lombok
			[lombok安装教程](https://jingyan.baidu.com/article/0a52e3f4e53ca1bf63ed725c.html)
		4)eclipse中lombok导入jar包方式
			1)第一种方式
			将lombok.jar放入WEB-INF下的lib目录下
			点击buildPath
			弊端:每个工程都要导入
			2)第二种方式
			右击项目名->选择BuildPath ->Config Build Path
			点击Add library 选择user library 点击按钮User Libraries 点击new  输入名字(例如lombok)  点击add External JARs  找到lombok.jar并打开  点击Apply andClose
			使用时
			右击项目名->选择BuildPath->ConfigBuild Path->add library->UserLibrary->选择lombok
			
		@getter@setter
		public class logit {
    		private String uid;
    		private String username;
		}
	2、lombok其它注解
		1)作用域
		@Getter @Setter//写到类上表名所有字段都添加Getter Setter方法
		public class User{
			private String uid;
			private String username;
			private String password;
			@Setter @Getter
			private String phone;//在某一个字段前面添加Getter Setter可以只对某一个字段添加Getter Setter
		}
		2)其它注解方法
		@ToString
		@EqualsAndHashCode
		@NoArgsConstructor   无参构造器
		@AllArgsConstructor  有参构造器

六、Cookie与Session

	1、会话技术:
		用户打开一个浏览器-》点开多个超链接 访问服务器多个web资源-》给关闭浏览器
		这个过程称为一个会话
	2、会话技术解决什么问题:
		保持各个客户端自己的数据
		每个用户在使用浏览器与服务器会话过程中,不可避免会产生一些数据,程序要先办法为每个用户保存这些数据
	3、Ideal当中没有找到Servlet文件创建位置解决办法
		1、按住 ctrl shift alt S  进入Libraries ->按住左上角+->添加java->将tomcat bin目录下的servlet-api.jar导入
		2、选择Modules-》点击左上角+->选择Web-->选择你要操作的项目->Source Roots勾选上
		3、点击Facets->左上角+->点击Web-》选择你对应的项目
		[无Servlet解决办法](https://blog.csdn.net/qq_36927265/article/details/103508689?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param)
	4、Cookie
	@WebServlet(name = "CookieServlet")
	public class CookieServlet extends HttpServlet {
   	 	private static final long serialVersionUID=1L;
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、创建Cookie
        Cookie cookie=new Cookie("lk","it666");
        //2、响应给浏览器
        resp.addCookie(cookie);
    	}
	}
	Cookie默认存储时间:
		1)默认cookie为会话级别:打开浏览器关闭浏览器为y依次会话。
			如果不设置持久化时间,cookie会存储在浏览器内存中,浏览器关闭cookie信息销毁。
		2)设置cookie在客户端存储时间:
			cookie.setMaxAge(int second);
			设置的时间为秒;如果设置持久时间 cookie的信息会持久到浏览器磁盘文件中,过期会自动删除。
		3)设置Cookie携带路径
		//访问某一个资源时要不要带cookie信息
		//如果不设置携带路径,m默认情况下会访问创建cookie的web资源相同路径都携带cookie信息。
		http://localhost:8080/29-Cookie-Session/CookieServlet
		http://localhost:8080/29-Cookie-Session/CookieServlet2
		在CookieServlet文件创建的cookie在CookieServlet2也能访问到,因为它们都属于同一个目录http://localhost:8080/29-Cookie-Session/下。

		http://localhost:8080/29-Cookie-Session/myxq/CookieServlet
		http://localhost:8080/29-Cookie-Session/CookieServlet2
		在http://localhost:8080/29-Cookie-Session/myxq/下的Servlet文件中创建的cookie在CookieServlet2中无法看到
		//设置携带路径
		cookie.setPath(String path);
		cookie.setPath("/CookiePro/cookieServlet");只有访问cookieServlet才携带cookie信息
		cookie.setPath("/CookiePro");//访问指定的工程时都会携带
		cookie.setPath("/");//访问服务器下部署的所有工程都会携带
	4)删除cookie
		如果想删除客户端已经存储的cookie信息;
		使用同名同路径下的c持久化时间为0d的cookie进行覆盖j即可
		Cookie cookie=new Cookie("lk","it666");
		cookie.setMaxAge(0);
		response.addCookie(cookie);
	5)从服务器获取cookie
		通过Request对象的getCookies()方法,获取的是所有的cookie.要进行遍历找到z自己名称的那一个。
		//1、获取所有的cookie对象
		Cookie[] cookies=request.getCookies();
		if(cookies!=null){
			//遍历所有的cookie
			for(Cookie cookie :cookies){
				String name=cookie.getName();
				if(name.equals("lk"))
					System.out.println(cookie.getValue());
			}
		}
	6)获取上次访问时间
		response.setContentType("text/html;charset=utf-8");
		//获取当前时间
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
		String currentTime=sdf.format(date);
		//创建cookie
		Cookie c=new Cookie("lastTime",currentTime);
		response.addCookie(c);
		//获取当前cookie
		String lastTime=null;
		Cookie[] cookies=request.getCookies();
		if(cookies!=null){
			//遍历所有的cookie
			for(Cookie cookie :cookies){
				if(cookie.getName().equals("lastTime"))
					lastTime=cookie.getValue();
			}
		}
		if(lastTime!=null)
			response.getWriter().write("你上次的登录时间为:"+lastTime);
			else
			response.getWriter().write("你是第一次登录");
	5、Session
		1)Session简介:
			Session技术是将s数据存储在服务器端的技术
			会为每个客户端都创建一块内存空间存储客户数据;
			客户端需要每次都携带一个标识ID去f服务器找寻属于自己的内存空间
			Session需要借助于Cookie存储客户的唯一标识SESSIONID
		2)Session域对象
			Session对象获取:
				HttpSession session=request.getSession();
				获取专属于当前会话的Session对象
				如果服务器没有该会话的Session对象会创建一个新的Session返沪
				如果已经有了s属于该会话的Sessionz直接将已有的Session返回
				本质就是根据SESSIONID发现服务器是否有Session
				HttpSession session=request.getSession();
				session.setAttribute("lk","www.it666.com");
			Session也是一个域对象
				session.setAttribute(String name,Object obj);
				session.getAttribute(String name);
				session.removeAttribute(String name);
		3)Session生命周期
			创建:第一次执行request.getSession()创建
			销毁:服务器关闭时;session过期;手动销毁;浏览器关闭session就关闭是错误的。
			i、手动配置session过期时间(从最后一次操作开始计时):
				在web.xml中添加
				<session-config>
					<session-timeout>30</session-timeout>
				</session-config>
			在server中的web.xlm中配置上述session过期时间会使所有工程会话都生效
			应该在需要生效的项目下的web.xml中进行配置
			ii、手动销毁
			session.invalidate();
			iii、作用范围:默认在一次会话中即y一次会话中任何资源公用一个session
		4)
		清楚浏览器缓存:ctrl+sift+delete

在这里插入图片描述

七、JSP

	1、jsp编写java
		1<%...%>
		2)<%! ....%>
		3)<%=...%>
	2、java编写注释
		1)html注释<!--...-->  可见范围:jsp源码 翻译后的servlet 页面
		2)java注释//  /* */ 可见范围:jsp源码 翻译后的servlet 页面看不见
		3)jsp注释<%--..--%> 可见范围:jsp源码
	3、jsp指令
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值