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
public class User{
private String uid;
private String username;
private String password;
@Setter @Getter
private String phone;
}
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 {
Cookie cookie=new Cookie("lk","it666");
resp.addCookie(cookie);
}
}
Cookie默认存储时间:
1)默认cookie为会话级别:打开浏览器关闭浏览器为y依次会话。
如果不设置持久化时间,cookie会存储在浏览器内存中,浏览器关闭cookie信息销毁。
2)设置cookie在客户端存储时间:
cookie.setMaxAge(int second);
设置的时间为秒;如果设置持久时间 cookie的信息会持久到浏览器磁盘文件中,过期会自动删除。
3)设置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自己名称的那一个。
Cookie[] cookies=request.getCookies();
if(cookies!=null){
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 c=new Cookie("lastTime",currentTime);
response.addCookie(c);
String lastTime=null;
Cookie[] cookies=request.getCookies();
if(cookies!=null){
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注释
3)jsp注释<%--..--%> 可见范围:jsp源码
3、jsp指令