javaweb学习
-
Servlet
-
什么是Servlet:用于开发动态web的一门技术
-
创建HelloServlet
-
建立一个Maven项目
-
导入需要的jar包
<dependencies> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency>
</dependencies> -
创建HelloSerlvet类并继承HttpServlet 重写doGet和doPost方法
public class HelloServlet extends HttpServlet { //doGet与doPost方法都能够接受浏览器的请求,两者区别在于 //get :请求能够携带的参数比较少,大小有限制 不安全 但高效 //post :请求能够携带的参数比较多,大小没有限制 安全 不高效 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入了deGet()方法");//后台检测是否进入了doGet()方法 PrintWriter writer = resp.getWriter();//相应流,对浏览器输出一个流 writer.println("HelloServlet!!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
配置Tomcat
-
在web.xml中配置Servlet的映射
<!-- 注册Servlet类 --> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.twilight.servlet.HelloServlet</servlet-class> </servlet> <!-- servlet映射 --> <!-- 在浏览器输入 /hello 后会根据此配置走找到hello的处理类com.twilight.servlet.HelloServlet --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
启动Tomcat
-
-
servlet原理
-
srevlet-mapping(servlet映射)
-
一个Servlet可以指定一个、多个、默认映射路径
<!-- servlet映射 --> <!-- 在浏览器输入 /hello 后会根据此配置走找到hello的处理类com.twilight.servlet.HelloServlet --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- 多个请求可以访问HelloServlet --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <!-- 任意的请求都可以访问HelloServlet --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
-
指定前缀、后缀
-
优先级问题:会先走指定的路径,如果找不到指定的路径,就会走默认路径
-
-
ServletContext对象 Servlet上下文对象 以及HttpServletResponse HttpServletRequest 的各个方法熟悉
-
ServletContext为各个Servlet之间的属性的传输提供了一种方法,各个Servlet都可以创建同一个ServletContext对象,并可以将自己的默写属性传进ServletContext对象,然后其他的Servlet就通过创建该对象获取该属性。
-
HelloServlet通过ServletContext对象传入username属性
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入了doGet方法"); String username = "杜锋"; ServletContext context = this.getServletContext(); context.setAttribute("username",username);//将一个数据保存在ServletContext中 } }
-
该Servlet通过ServletContext对象获得HelloServle的username属性并映射到浏览器
public class GetServet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); String name = (String)context.getAttribute("username"); resp.setContentType("text/html"); resp.setCharacterEncoding("utf-8"); resp.getWriter().print("名字" + name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
当然以上两个类都需要注册并映射
<servlet> <servlet-name>hello</servlet-name> <servlet-class>com.twilight.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet> <servlet-name>getc</servlet-name> <servlet-class>com.twilight.servlet.GetServet</servlet-class> </servlet> <servlet-mapping> <servlet-name>getc</servlet-name> <url-pattern>/getc</url-pattern> </servlet-mapping>
-
ServletContext的应用
-
获取初始化参数方法 getInitParameter();
//测试getInitParameter()方法获取初始化的参数 public class GetParameterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); servletContext.getInitParameter("url"); resp.getWriter().print(servletContext); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
请求转发 getRequestDispatcher()
/测试请求转发 public class GetRequestDispatcherServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); context.getRequestDispatcher("/hello").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
getResourceAsStream()方法获取类资源
//测试getResourceAsStream()方法获取类资源 public class GetResourceAsStreamServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); InputStream is = context.getResourceAsStream("/WEB-INF/classes/demo.properties"); Properties prop = new Properties(); prop.load(is); String name = prop.getProperty("username"); String pwd = prop.getProperty("password"); resp.getWriter().print(name + ":" + pwd); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
以上各类均需注册和映射,再次没有写出
- 重定向 重定向与请求转发的区别 相同点:都可以实现页面的跳转 不同点:1、重定向会跳转url地址,而请求转发不会跳转url地址 2、resp.sendRedirect("/r/target"); req.getRequestDispatcher("/success.jsp").forward(req,resp);
public class RedirectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.sendRedirect("/r/target"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
用户登录页面一般会使用重定向
public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入了loginServet"); String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username+ ":" +password); resp.sendRedirect("/r/target"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
<html> <body> <h2>Hello World!</h2> <%-- action表示提交路径,需要找到项目的路径 --%> <%-- ${pageContext.request.getContextPath()}代表当前项目下 --%> <form action="${pageContext.request.getContextPath()}/login" method="get"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><><br> <input type="submit"> </form> </body> </html>
-
-
-
request应用
- 先认识两个方法
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setCharacterEncoding("UTF-8"); req.setCharacterEncoding("UTF-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String[] hobbys = req.getParameterValues("hobbys"); System.out.println("======================="); System.out.println(username); System.out.println(password); System.out.println(Arrays.toString(hobbys)); System.out.println("======================="); //通过请求转发 req.getRequestDispatcher("/success.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
- 先认识两个方法
- cookies讲解 session 讲解
- cookie和session有什么用:我们在从客户端进入服务器,会获得一个标记(cookie),或在服务器上填写一个记录(session),来告诉服务器访问的对象是你,从而实现个人的网页生成,可以把cookie和session理解成“信物”,每次访问服务器时,服务器会认得时你。
- cookie
//未运行成功,未解决!!报500错误,cookie不能及时刷新,并且输出乱码 public class CookieDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入了CookieDemo01"); //服务器告诉你来到的时间,并将其封装成一个Cookie给你,你下次来,通过Cookie这个“信物”,就可以知道是你来了 //解决中文乱码 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); PrintWriter out = resp.getWriter(); //服务器从客户端获取Cookie //返回的是数组,说明cookie可以有多个 Cookie[] cookies = req.getCookies(); if(cookies != null) { out.print("您第一次访问的时间是"); for(int i = 0;i<=cookies.length; i++){ Cookie cookie = cookies[i]; if(cookie.getName().equals("lastLoginTime")){ //如果 String value = cookie.getValue(); long lastLoginTime = Long.parseLong(value); Date date = new Date(lastLoginTime); out.print(date.toLocaleString()); } } }else { out.write("这是您第一次进入网站"); } //服务器给客户端相应一个cookie //System.currentTimeMillis()+""获取当前时间并返回成字符串类; Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
- session(重点)
//session在浏览器开启时就创建好,关闭时就注销 //每开启一个一个浏览器会自动生成一个session public class SessionDemo01 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //得到session HttpSession session = req.getSession(); //给session中存东西 session.setAttribute("name",new Person("杜锋",20)); //获取session的id String sessionId = session.getId(); //判断session是不是新建的 if(session.isNew()){ resp.getWriter().write("创建成功 id:" + sessionId); }else { resp.getWriter().write("session已经在服务器中存在了 id:" + sessionId); } //session创建事做了什么事 // Cookie cookie = new Cookie("JSESSION",sessionId); // resp.addCookie(cookie);
} @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }//跨Servlet获取Session里的对象,类比ServletContext public class SessionDemo02 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题 req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=utf-8"); //获得session HttpSession session = req.getSession(); Person person = (Person) session.getAttribute("name"); System.out.println(person.toString()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
//手动注销session public class SessionDemo03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name");//移除session里的一个对象数据 session.invalidate();//注销session,意味着sessionId将会别注销,但立马会生成一个新的session } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
- cookie与session的区别
- cookie判断你是否来过的原理是通过给你一个cookie,你下次访问网站时会带上cookie,服务器就会根据这个cookie识别你。而session判断则是在你访问服务器时,在服务器上记录一个sessionId和session数据,然后只返回你一个sessionId(sessionId返回的实现原理就是cookie),但session里的数据不会返回,而是记录在服务器上。
- session里可以存对象,而cookie里只能存字符。
-

浙公网安备 33010602011771号