软件架构
C/S:Client/Server.需要安装才能使用。
B/S:Brower/Server。有浏览器就可以。
资源分类
动态资源:每个用户访问相同的资源后,得到的结果可能不一样,称为动态资源。动态资源被访问后,先转换为静态资源,再被浏览器解析。
静态资源:所有的用户在访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析
服务器
服务器:安装了服务器软件的计算机。
服务器软件:接收用户的请求,处理请求,做出响应。(接请求,传参数,给响应)
web服务器软件:接收用户的请求,处理请求,做出响应。(接请求,传参数,给响应)
在web服务器软件中,可以部署web项目。让用户通过浏览器来访问这些项目。
常见的服务器软件
动态服务器:
webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
webSphere:IBM公司。大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
JBOSS:JBOSS公司。大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
Tomcat:Apache基金组织,中小型的javaEE服务器,仅仅支持少量的JavaEE规范servle/JSP。开源免费。(300左右的并发)
静态服务器:
nginx:代理,极高的并发
apache:Apache基金组织。PHP领域。
Tomcat
Tomcat早期是Sun公司。javaWEBServer
Tomcat4.0,里程碑版本。实现了Servlet
Tomcat的目录结构
bin:存放的是Tomcat的启动,停止批量处理脚本文件
startup.bat,startup.sh:启动tomcat的脚本文件
shutdown.bat,showdown.sh:停止tomcat的脚本文件
conf:用来存放Tomcat的相关配置文件
Catania:用来存储每个虚拟机的context配置
Context.xml:定义所有的web应用需要加载的context配置
Catalina.properties:Tomcat的环境变量
Logging.properties:Tomcat的日志配置文件,修改Tomcat的日志级别。
server.xml:Tomcat的核心配置文件
lib:Tomcat服务器的依赖包
logs:Tomcat默认的日志存放目录
webapps:Tomcat默认的web应用部署目录
work:Web应用jsp代码生成和编译的临时目录。
Servlet
servlet就是一个Java程序,一个java类。用来处理请求和响应。
Servlet的生命周期
init():Servelt进行初始化。
在tomcat启动的时候就会对所有的Servelt进行初始化
init方法只初始化一次
单例模式。
service():处理请求
可以处理GET,POST,PUT,DELETE请求
destroy():释放资源
创建servlet的三种方式
实现javax.servlet.Servlet接口
继承javax.servlet.GenericServlet类
继承javax.servlet.HttpServlet类
Servlet注册的两种方式
通过配置文件web.xml方式注册----Servlet3.0之前
WEB-INF:加密路径,不允许在地址栏
在web.xml进行注册servlet
<!---注册servlet-->
<servlet>
<servlet-name>myServlet</servlet-name>
<!--写全类名-->
<servlet-class>com.jsoft.morning.Myservlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<!--url pattern 当发起什么样的请求的时候,才让myServlet去处理-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
通过注解方式进行注册√
@WebServlet("/haha")
public class MyServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("MyServlet3 doGet....");
}
Servlet的参数
HttpServletRequest:
简称request,代表请求对象,当请求来的时候,request会自动实例化
HttpServletResponse:
简称response
response代表响应,当请求来的时候,response会自动实例化。
如果写中文,需要设置相应的字符集
响应头:增加一个响应头,并且解决字符集问题。
response.setCharacterEncoding("utf-8");
response.addHeader("content-type","text/html;charaset=utf-8");
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("MyServlet3 doGet....");
//向页面打印回去一句话
//服务器和客户端之间的通信依然是使用的流
response.setCharacterEncoding("utf-8");
response.addHeader("content-type","text/html;charaset=utf-8");
PrintWriter out = response.getWriter();
//把后台想要给出的响应写会去
out.write("我收到了你的请求!!!");
}
URL匹配规则
精确匹配,每个servlet是可以处理多个请求的。
@WebServlet(urlPatterns = {"/haha","/haha1","/haha2"})
localhost:8080/javaweb20230214/haha2
路径匹配
@WebServlet(urlPatterns = {"/haha/*"})
localhost:8080/javaweb20230214/haha/aaa
扩展名匹配
@WebServlet(urlPatterns = {"*.do"})
localhost:8080/javaweb20230214/aaa.do
缺省匹配
@WebServlet(urlPatterns = {"/"})
注意:
不能出现/*.do
多看控制台
匹配顺序
精确匹配
路径匹配,先最长路径匹配,再最短路径匹配。 /user/* /user/add/*
扩展名匹配。
注意:扩展名匹配,前面不能有任何的路径,包括不能有/
/*和/的含义:
/*属于路径匹配。覆盖所有的扩展名匹配
/servlet中的特殊匹配模式
会拦截静态资源!!!
启动时初始化:
<servlet-class>com.jsoft.morning.Myservlet1</servlet-class>
<load-on-startup>1</load-on-startup>
Request
request功能分为以下几种:
封装请求头:
封装一些正文数据。如果是get请求,没有正文。
request实际上是一个域对象,可以把它当成map来添加和获取数据。
request提供请求转发功能。
常用的方法:
getRemoteaddr():获取客户端的IP地址。
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println(request.getRemoteAddr());
System.out.println(request.getRemoteHost());
if(Objects.equals(request.getRemoteHost(),"127.0.0.1")){
response.getWriter().write("your Ip is closed!!!");
}
}
获取请求参数
常见的客户端传参方式:
浏览器地址栏直接输入:GET请求
超链:GET请求
表单:可以是GET,可以是POST。
Ajax:可以是GET,可以是POST
GET请求和POST请求的区别?
GET请求:
请求参数会在浏览器地址栏显示,所以不安全
请求的参数长度在1k以内。
GET请求没有请求体
POST请求:
请求参数不会显示在浏览器的地址栏,相对安全
请求参数没有限制
有请求体
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
response.addHeader("content-type","text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// System.out.println("username:"+username+",password:"+password);
//调用service,调用dao,返回一个结果
boolean flag=true;
if(flag){
out.write("登录成功,欢迎你"+username);
}
}
<form action="login" method="post">
username:<input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="登录">
</form>
登录注册:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobbies = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
Enumeration<String> names= request.getParameterNames();
while(names.hasMoreElements()){
System.out.println(names.nextElement().toString());
}
Map<String, String[]> parameterMap = request.getParameterMap();
for(Map.Entry entry:parameterMap.entrySet()){
System.out.println(entry.getKey()+"-->"+Arrays.toString((String[])entry.getValue()));
};
response.addHeader("content-type","text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// System.out.println("username:"+username+",password:"+password);
//调用service,调用dao,返回一个结果
boolean flag=true;
if(flag){
out.write("登录成功,欢迎你"+username);
}
}
<form action="login" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="gender" value="man">男
<input type="radio" name="gender" value="woman" >女<br>
爱好:<input type="checkbox" name="hobby" value="swimming">游泳
<input type="checkbox" name="hobby" value="readding">读书
<input type="checkbox" name="hobby" value="writting">写字
<br>
复选:<select name="select" multiple>
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
</select>
<input type="submit" value="登录">
</form>