JavaWeb
1.基本概念
1.前言
- web,网页
- 静态web
- html,css
- 提供给所有人看始终不会改变
- 动态web
- 提供给所有人看的数据始终会变化
- 技术栈:JSP/Servlet,ASP,PHP
动态web资源技术开发技术统称为javaweb
2.web应用程序
应用程序编写完成之后,想给外界访问,需要一个服务器统一管理
3.动态web
2.web服务器
1.JSP/Servlet
- sun公司主推B/S架构
- 基于java
- 可以承载三高问题带来的影响
- 语法像ASP
2.web服务器
服务器是被动操作,用来处理用户的请求和返回响应信息
-
IIS
- 微软,ASP,window自带
-
Tomcat
- 下载Tomcat压缩包
- 解压Tomcat压缩包到/Library/下
- 终端输入cd /Library/Tomcat/bin
- sudo chmod 755 *.sh
- 启动——sudo sh ./startup.sh
- 关闭——sh ./shutdown.sh
修改Tomcat的端口号
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
3.HTTP
HTTP(超文本传输协议),通常运行在TCP上
1.两个时代
- http1.0
- HTTP/1.0:短连接,获取一个资源后断开
- http1.1
- HTTP1.1:长连接,获取多个资源
HTTP格式
4.Servlet
1.开发流程
本质:一个接口,一个统一的web应用规范,一个协议
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web服务器中
把实现了Servlet接口的java程序叫做Servlet
2.HelloServlet
开发流程
-
构建普通Maven工程,删掉src目录,以后学习就在这个项目中建立Moudel,这个空的工程就是Maven主工程
-
关于Maven父子工程的理解:
- 父项目中会多出
<modules> <module>study</module> </modules>
- 子项目中会有
<parent> <artifactId>com.hznu.ch</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的依赖子项目都可以使用,相当于继承父类
-
Maven结构图
-
-
编写Servlet程序
- 编写普通类,实现Servlet接口,这里继承HttpServlet,并重写方法
public class ServletTest extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置字符编码 request.setCharacterEncoding("utf8"); //从 request 对象中获取username,password String username = request.getParameter("username"); String password = request.getParameter("password"); request.setAttribute("username", username); request.setAttribute("password", password); request.getRequestDispatcher("/new.jsp").forward(request, response); } }
- 编写jsp页面
<html> <body> <h2>This is new Page</h2> username: <%=request.getParameter("username") %> <br> password: <%=request.getParameter("password") %> </body> </html>
-
编写Servlet映射(web.xml)
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<!--映射名-->
<servlet-name>ServletTest</servlet-name>
<!--对应的类-->
<servlet-class>com.hznu.ch.servlet.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<!--映射名-->
<servlet-name>ServletTest</servlet-name>
<!--url-->
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
</web-app>
- 配置Tomcat
- 访问资源文件
参考文献
3.Mapping
- 一个Servlet对应一个页面
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.hznu.ch.servlet.ServletTest</servlet-class>
</servlet>
- 一个Servlet对应多个页面
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/ServletTest</url-pattern>
</servlet-mapping>
- 添加后缀
*.ch
将ch后缀名的url映射到某个Servlet
4.优先级问题
- 精确匹配,servlet-mapping1:/user/users.html,servlet-mapping2:/*。当一个请求http: //localhost:8080/appDemo/user/users.html来的时候,servlet-mapping1匹配到,不再用servlet-mapping2匹配
- 路径匹配,先最长路径匹配,再最短路径匹配servlet-mapping1:/user/,servlet-mapping2:/。当一个请求http: //localhost:8080/appDemo/user/users.html来的时候,servlet-mapping1匹配到,不再用servlet-mapping2匹配
- 扩展名匹配,servlet-mapping1:/user/,servlet-mapping2:.action。当一个请求http: //localhost:8080/appDemo/user/addUser.action来的时候,servlet-mapping1匹配到,不再用servlet-mapping2匹配
- 缺省匹配,以上都找不到servlet,就用默认的servlet,配置为/
5.原理
明确几件事:Tomcat的作用是将Socket传来的数据变成ServletRequest
类,交给Servlet处理
具体可以查看知乎大佬,里面有一个例子可以明白Tomcat做的最基本的事情,我来总结一下哈
Tomcat对Socket数据进行封装,请求包装成ServletRequest类,响应包装成ServletResponse类,然后都传给我们实现了Servlet接口的类,对这两个数据进行处理,再由Tomcat返回给客户端
Tomcat和Servlet的协同关系以及Servlet的生命周期
6.ServletContext
1.Servlet通信
//存入数据到ServletContext
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.setAttribute("username", "陈恒");
}
}
//读取ServletContext数据
public class GetNameServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
ServletContext context = this.getServletContext();
resp.getWriter().print("姓名:" + context.getAttribute("username").toString());
}
}
2.获取初始化参数
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
resp.getWriter().print("参数:" + context.getInitParameter("url"));
}
}