G_05_JAVAWEB

	1、TOMCAT启动
		1)配置环境:
			将jdk文件目录 bin的上一目录地址加入到JAVA_HOME当中
		2)打开TOMCAT目录下的bin中的startup.bat
		3)启动后不要将startup.bat关掉
		4)测试是否启动成功
			http://localhost:8080
	2、启动过程出现端口冲突解决办法
		1)cmd->netstat -aov
		2)查找占用8080端口的程序的pid
		3)ctrl+alt+delete打开任务管理器->将对应PID的程序关闭
	3、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不能直接通过浏览器访问,是保护的外界不能直接访问
	4、再javaee中创建web项目
		1)new->other->web->dynamic web project->选择tomcat服务器->2.5版本
	5、再eclipse中配置server服务器
		window->preferences->server->runtime environments->添加tomcat服务器
	6、再eclipse底栏 中留下server
		如果eclipse底栏无可通过以下步骤添加
			window->show view->将需要显示的勾选
	7、我们再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
	8、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/>
	9、发布程序详解:
		打开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应用
	10、虚拟主机
		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)
			{
     }
		}
	14、ServletContext
	
		

三、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("

it666

"
); //解决中文乱码,再中文之前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.mp4 ">code.png ">c.rar 2)发送servlet下载 在html中填写: =a.mp4">a.mp4 =code.png">a.mp4 =c.rar">a.mp4 在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

G_05_JAVAWEB_第1张图片

七、JSP

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

你可能感兴趣的:(java)