方法一:网址重写

通过在url地址后面添加若干的token作为查询字符串来实现。token的值一般为 键=值

url?key1=value1&key2=value2&...&keyn=valuen

url与token之间需要用?分开,两个token之间则是需要用一个&符号隔开。

此方法适用于token不需要在多个页面中使用时使用。

缺点是

a.在某些浏览器当中url长度有限制

b.url中的信息是可见的,安全性差

c.某些字符需要进行编码

package com.SessionManage.Test;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "Top10Servlet", urlPatterns = {"/top10"})

public class Top10Servlet extends HttpServlet {

private static final long serialVersionUID = 987654321L;

private List londonAttractions;

private List parisAttractions;

@Override

public void init() throws ServletException {

londonAttractions = new ArrayList(10);

londonAttractions.add("Buckingham Palace");

londonAttractions.add("London Eye");

londonAttractions.add("British Museum");

londonAttractions.add("National Gallery");

londonAttractions.add("Big Ben");

londonAttractions.add("Tower of London");

londonAttractions.add("Natural History Museum");

londonAttractions.add("Canary Wharf");

londonAttractions.add("2012 Olympic Park");

londonAttractions.add("St Paul's Cathedral");

parisAttractions = new ArrayList(10);

parisAttractions.add("Eiffel Tower");

parisAttractions.add("Notre Dame");

parisAttractions.add("The Louvre");

parisAttractions.add("Champs Elysees");

parisAttractions.add("Arc de Triomphe");

parisAttractions.add("Sainte Chapelle Church");

parisAttractions.add("Les Invalides");

parisAttractions.add("Musee d'Orsay");

parisAttractions.add("Montmarte");

parisAttractions.add("Sacre Couer Basilica");

}

@Override

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

String city = request.getParameter("city");

if(city!=null&&(city.equals("london")||city.equals("paris"))){

showAttractions(request,response,city);

}else{

showMainPage(request,response);

}

}

private void showMainPage(HttpServletRequest request,

HttpServletResponse response) throws IOException {

// TODO Auto-generated method stub

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.print("

"

+ "

Top 10 Tourist Attractions"

+ "

"

+"please select a city:"

+"London"

+"Paris"

+"");

}

private void showAttractions(HttpServletRequest request,

HttpServletResponse response, String city) throws ServletException,IOException {

// TODO Auto-generated method stub

int page = 1;

String pageParameter = request.getParameter("page");

if(pageParameter!=null){

try{

page = Integer.parseInt(pageParameter);

}catch(NumberFormatException e){

e.printStackTrace();

}

if(page>2){

page = 1;

}

}

List attractions = null;

if(city.equals("london")){

attractions = londonAttractions;

}else if(city.equals("paris")){

attractions = parisAttractions;

}

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.println("

"

+"

Top 10 Tourist Attractions"

+"

");

writer.println("Select City");

writer.println("


Page"+page+"


");

int start = page*5-5;

for(int i = start; i < start+5; i++){

writer.println(attractions.get(i)+"
");

}

writer.print("


"

+ "Page 1");

writer.print(" Page 2");

writer.println("");

}

}

方法二:隐藏域

主要适用于页面当中含有表单的情况,当用户提交表单时,隐藏域中的值也传送到服务器。只有当页面包含表单,或者可以在页面添加表单时,才适合使用隐藏域。

此技术胜过网址重写的地方在于可以将更多的字符传递到服务器,且不需要进行字符编码。但仅当所需传递的信息不需要跨越多个页面时,才适合使用这种技术。

package com.SessionManage.Test2;

public class Customer {

private int id;

private String name;

private String city;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getCity() {

return city;

}

public void setCity(String city) {

this.city = city;

}

}

package com.SessionManage.Test2;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "CustomerServlet",urlPatterns = {

"/customer","/editCustomer","/updateCustomer"})

public class CustomerServlet extends HttpServlet {

private static final long serialVersionUID = -20L;

private List customers = new ArrayList();

@Override

public void init() throws ServletException{

Customer customer1 = new Customer();

customer1.setId(1);

customer1.setName("Donald D.");

customer1.setCity("Miami");

customers.add(customer1);

Customer customer2 = new Customer();

customer2.setId(2);

customer2.setName("Mickey M.");

customer2.setCity("Orlando");

customers.add(customer2);

}

private void sendCustomerList(HttpServletResponse response)

throws IOException {

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.println("

Customer"

+"

Customers

");

writer.println("

  • ");

for(Customer customer : customers){

writer.println("

"+customer.getName()

+"("+customer.getCity()+") "

+"edit");

}

writer.println("

");

writer.println("");

}

private Customer getCustomer(int customerId){

for(Customer customer : customers){

if(customer.getId()==customerId){

return customer;

}

}

return null;

}

private void sendEditCustomerForm(HttpServletRequest request,HttpServletResponse response)

throws IOException {

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

int customerId = 0;

try{

customerId = Integer.parseInt(request.getParameter("id"));

}catch(NumberFormatException e){

e.printStackTrace();

}

Customer customer = this.getCustomer(customerId);

if(customer!=null){

writer.println("

"

+"

Edit Customer"

+"

EditCustomer

"

+"

+"action='updateCustomer'>");

writer.println("");

writer.println("

writer.println("

Name:"

+"

+"'/>

");

writer.println("

City:"

+"

+"'/>

");

writer.println("

"

+"

"

+"

"

+"

");

writer.println("

"

+"Customer List"

+"

");

writer.println("

");

writer.println("

");

}else{

writer.println("No customer found");

}

}

@Override

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException, IOException {

String uri = request.getRequestURI();

if(uri.endsWith("/customer")){

this.sendCustomerList(response);

}else if(uri.endsWith("/editCustomer")){

this.sendEditCustomerForm(request, response);

}

}

@Override

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException, IOException{

int customerId = 0;

try{

customerId = Integer.parseInt(request.getParameter("id"));

}catch(NumberFormatException e){

e.printStackTrace();

}

Customer customer = this.getCustomer(customerId);

if(customer!=null){

customer.setName(request.getParameter("name"));

customer.setCity(request.getParameter("city"));

}

this.sendCustomerList(response);

}

}

方法三:cookie

cookie信息可以跨越多个页面,这点是采用网址重写和隐藏域所无法实现的。cookie是自动在web服务器和浏览器之间传递的一小块信息。

cookie适用于那些需要跨越许多页面的信息。因为cookie是作为http标头嵌入的,因此传输它的过程由http协议处理。此外,可以根据自

己的需要设置cookie的有效期限。对于web浏览器而言,每台web服务器最多可以支持20个cookie。

cookie的不足之处是用户可以通过修改其浏览器设置来拒绝接受cookie。

关于cookie的代码如下:

package com.SessionManage.Test3;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet(name="PreferenceServlet",urlPatterns={"/preference"})

public class PreferenceServlet extends HttpServlet {

private static final long serialVersionUID = 888L;

public static final String MENU =

"

"

+"Cookie Class  "

+"Cookie Info  "

+"Preference"+"

";

@Override

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.print("

"+"Preference"

+"

+"background:NavajoWhite}"

+"

"

+MENU

+"Please select the values below:"

+"

"

+"

+"

Title Font Size:"

+"

"

+"large"

+"x-large"

+"xx-large"

+"

"

+"

"

+"

Title Style & Weight:"

+"

"

+"italic"

+"bold"

+"

"

+"

"

+"

Max. Records in Table: "

+"

"

+"5"

+"10"

+"

"

+"

"

+"

"

+"

"

+"

"

+"

"+""+"");

}

@Override

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

String maxRecords = request.getParameter("maxRecords");

String[] titleStyleAndWeight = request.getParameterValues("titleStyleAndWeight");

String titleFontSize = request.getParameter("titleFontSize");

response.addCookie(new Cookie("maxRecords",maxRecords));

response.addCookie(new Cookie("titleFontSize",titleFontSize));

Cookie cookie = new Cookie("titleFontWeight","");

cookie.setMaxAge(0);

response.addCookie(cookie);

cookie = new Cookie("titleFontStyle","");

cookie.setMaxAge(0);

response.addCookie(cookie);

if(titleStyleAndWeight!=null){

for(String style : titleStyleAndWeight){

if(style.equals("bold")){

response.addCookie(new Cookie("titleFontWeight","bold"));

}else if(style.equals("italic")){

response.addCookie(new Cookie("titleFontStyle","italic"));

}

}

}

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.println("

"+"Preference"

+"

"+MENU

+"Your preference has been set."

+"
Max. Records in Table: "+maxRecords

+"
Title Font Size: "+titleFontSize

+"
Title Font Style & Weight: ");

if(titleStyleAndWeight!=null){

writer.println("

  • ");

for(String style : titleStyleAndWeight){

writer.print("

"+style+"");

}

writer.println("

");

}

writer.println("");

}

}

package com.SessionManage.Test3;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet(name="CookieClassServlet",urlPatterns={"/cookieClass"})

public class CookieClassServlet extends HttpServlet{

private static final long serialVersionUID = 837369L;

private String[] methods = {

"clone","getComment","getDomain",

"getMaxAge","getName","getPath",

"getSecure","getValue","getVersion",

"isHttpOnly","setComment","setDomain",

"setHttpOnly","setMaxAge","setPath",

"setSecure","setValue","setVersion"

};

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

Cookie[] cookies = request.getCookies();

Cookie maxRecordsCookie = null;

if(cookies!=null){

for(Cookie cookie : cookies){

if(cookie.getName().equals("maxRecords")){

maxRecordsCookie = cookie;

break;

}

}

}

int maxRecords = 5;

if(maxRecordsCookie!=null){

try{

maxRecords = Integer.parseInt(maxRecordsCookie.getValue());

}catch(NumberFormatException e){

e.printStackTrace();

}

}

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.print("

"+"Cookie Class"

+"

"

+PreferenceServlet.MENU

+"

Here are some of the methods in "+

"javax.servlet.http.Cookie");

writer.print("

  • ");

for(int i = 0;i < maxRecords; i++){

writer.print("

"+methods[i]+"");

}

writer.print("

");

writer.print("

");

}

}

package com.SessionManage.Test3;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.ws.rs.core.Cookie;

@WebServlet(name="CookieInfoServlet",urlPatterns={"/cookieInfo"})

public class CookieInfoServlet extends HttpServlet {

private static final long serialVersionUID = 3829L;

@Override

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

javax.servlet.http.Cookie[] cookies = request.getCookies();

StringBuilder styles = new StringBuilder();

styles.append(".title{");

if(cookies!=null){

for(javax.servlet.http.Cookie cookie : cookies){

String name = cookie.getName();

String value = cookie.getValue();

if(name.equals("titleFontSize")){

styles.append("font-size:"+value+";");

}else if(name.equals("titleFontWeight")){

styles.append("font-weight:"+value+";");

}else if(name.equals("titleFontStyle")){

styles.append("font-style:"+value+";");

}

}

}

styles.append("}");

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.print("

"+"Cookie Info"

+""

+"

"+PreferenceServlet.MENU

+"

"

+"Session Management with Cookies:

");

writer.print("

");

if(cookies==null){

writer.print("No cookie in this Http response");

}else{

writer.println("
Cookie in this Http response");

for(javax.servlet.http.Cookie cookie : cookies){

writer.println("
"+cookie.getName()+":"+cookie.getValue());

}

}

writer.print("

");

writer.print("");

}

}

方法四:HttpSession对象

用户可以没有或者有一个HttpSession,并且只能访问自己的HttpSession。HttpSession是当一个用户第一次访问某个站点时创建的。通过request中getSession()方法,可以获取用户的HttpSession。而通过HttpSession的setAttribut(name,value)方法可以将值放入到HttpSession当中。

同网址重写、隐藏域和cookie所不同的地方在于,放在HttpSession中的值是保存在内存中的。因此,你只能将尽可能小的对象放在里面,并且数量不能太多。

添加到HttpSession当中的值不一定是String,可以为任意的java对象,只要它的类实现了java.io.Serializable接口即可,以便当Servlet容器认为有必要的时候,保存的对象可以序列化成一个文件或者保存到数据库中。

setAttribute方法要求不同的对象有不同的名称。如果传递一个之前用过的属性名称,那么该名称将与旧值无关联,而与新值关联。

通过HttpSession的getAttribute(name)属性可以获取HttpSession中保存的对象。其另外一个方法getAttributeNames()返回一个Enumeration,迭代一个HttpSession中的

所有属性。

注:HttpSession中保存的值不发送到客户端,这与其它的Session管理方法不同。而是Servlet容器为它所创建的每一个HttpSession生成一个唯一标示符,并将这个标示符作为一个token发送给浏览器,一般是作为一个名为JSESSIONID的cookie,或者作为一个jsessionid参数添加到url后面。在后续的请求中,浏览器会将这个token发送回服务器,使服务器知道是哪个用户在发出请求。

相关代码如下:

package com.SessionManage.Test4;

public class Product {

private int id;

private String name;

private String description;

private float price;

public Product(int id,String name,String description,float price){

this.id = id;

this.name = name;

this.description = description;

this.price = price;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public float getPrice() {

return price;

}

public void setPrice(float price) {

this.price = price;

}

}

package com.SessionManage.Test4;

public class ShoppingItem {

private Product product;

private int quantity;

public ShoppingItem(Product product,int quantity){

this.product = product;

this.quantity = quantity;

}

public Product getProduct() {

return product;

}

public void setProduct(Product product) {

this.product = product;

}

public int getQuantity() {

return quantity;

}

public void setQuantity(int quantity) {

this.quantity = quantity;

}

}

package com.SessionManage.Test4;

import java.io.IOException;

import java.io.PrintWriter;

import java.text.NumberFormat;

import java.util.ArrayList;

import java.util.List;

import java.util.Locale;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

@WebServlet(name="ShoppingCartServlet",urlPatterns={"/products","/viewProductDetails",

"/addToCart","/viewCart"

})

public class ShoppingCartServlet extends HttpServlet {

private static final long serialVersionUID = -20L;

private static final String CART_ATTRIBUTE = "cart";

private List products = new ArrayList();

private NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.US);

@Override

public void init() throws ServletException{

products.add(new Product(1,"Bravo 32' HDTV","Low-cost HDTV from renowned TV manufacturer",159.95F));

products.add(new Product(2,"Bravo BluRay Player","High quality stylish BluRay player",99.95F));

products.add(new Product(3,"Bravo Stereo System","5 speaker hifi system with iPod player",129.95F));

products.add(new Product(4,"Bravo iPod player","An iPod plug-in that can play multiple formats",39.95F));

}

@Override

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

String uri = request.getRequestURI();

if(uri.endsWith("/products")){

sendProductList(response);

}else if(uri.endsWith("/viewProductDetails")){

sendProductDetail(request,response);

}else if(uri.endsWith("/viewCart")){

showCart(request,response);

}

}

@Override

protected void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

int productId = 0;

int quantity = 0;

try{

productId = Integer.parseInt(request.getParameter("id"));

quantity = Integer.parseInt(request.getParameter("quantity"));

}catch(NumberFormatException e){

e.printStackTrace();

}

Product product = getProduct(productId);

if(product!=null&&quantity>=0){

ShoppingItem shoppingItem = new ShoppingItem(product,quantity);

HttpSession session = request.getSession();

List cart = (List)session.getAttribute(CART_ATTRIBUTE);

if(cart==null){

cart = new ArrayList();

session.setAttribute(CART_ATTRIBUTE, cart);

}

cart.add(shoppingItem);

}

sendProductList(response);

}

private Product getProduct(int productId) {

// TODO Auto-generated method stub

for(Product product : products){

if(product.getId()==productId){

return product;

}

}

return null;

}

private void showCart(HttpServletRequest request,

HttpServletResponse response) throws IOException {

// TODO Auto-generated method stub

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.println("

Shopping Cart"

+"");

writer.println("

"

+"Product List

");

HttpSession session = request.getSession();

List cart = (List)session.getAttribute(CART_ATTRIBUTE);

if(cart!=null){

writer.println("

writer.println("

Quantity"

+"

"

+"

Product"

+"

Price"

+"

Amout");

double total = 0.0;

for(ShoppingItem shoppingItem : cart){

Product product = shoppingItem.getProduct();

int quantity = shoppingItem.getQuantity();

if(quantity!=0){

float price = product.getPrice();

writer.println("

");

writer.println("

"+quantity+"");

writer.println("

"+product.getName()+"");

writer.println("

"+currencyFormat.format(price)+"");

double subtotal = price*quantity;

writer.println("

"+currencyFormat.format(subtotal)+"");

total += subtotal;

writer.println("

");

}

}

writer.println("

+"style='text-align:right'>"

+"Total:"

+currencyFormat.format(total)

+"

");

}

writer.println("

");

}

private void sendProductDetail(HttpServletRequest request,

HttpServletResponse response) throws IOException {

// TODO Auto-generated method stub

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

int productId = 0;

try{

productId = Integer.parseInt(request.getParameter("id"));

}catch(NumberFormatException e){

e.printStackTrace();

}

Product product = this.getProduct(productId);

if(product!=null){

writer.println("

"

+"

Product Details"

+"

Product Details

"

+"

");

writer.println("

+"value='"+productId+"'/>");

writer.println("

writer.println("

Name:"

+product.getName()+"

");

writer.println("

Description:"

+product.getDescription()+"

");

writer.println("

"+""

+"

"

+"

"

+"

"

+"

");

writer.println("

"

+"Product List"

+"

");

writer.println("

");

writer.println("

");

}else{

writer.println("No product found");

}

}

private void sendProductList(HttpServletResponse response) throws IOException {

// TODO Auto-generated method stub

response.setContentType("text/html");

PrintWriter writer = response.getWriter();

writer.println("

Products"

+"

Products

");

writer.println("

  • ");

for(Product product :products){

writer.println("

"+product.getName()+"("

+currencyFormat.format(product.getPrice())

+") ("+"Details)");

}

writer.println("

");

writer.println("View Cart");

writer.println("");

}

}

java web登录状态保持_java web用于保持状态的4种方法相关推荐

  1. java list转set去重_Java中List去重的四种方法

    Java中List去重的四种方法 package com.lxz.test; import java.util.ArrayList; import java.util.HashSet; import ...

  2. java wed登录面 代码_Java Web用户登录实例代码

    实现功能: 1.用户登陆.注销 2.利用session记录用户登陆信息 3.在JSP中展示已登陆用户信息 实现原理: 登陆后通过判断用户名和密码是否和存储的一致,如果一致,就把用户信息放到sessio ...

  3. java wed登录面 代码_java web 登录界面

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  4. java wed登录面 代码_Java Web登录界面

    非常激动的开通了我的第一个博客,在这里希望大家能多多指点,相互学习. 一个简单的登录界面 首先我们先把这个登录分为三块: 一.数据库 数据库我用的是MYSQL: 二.前端 三.后台 1.  后台代码的 ...

  5. Java文件关闭close语句_java – 关于用于关闭流的close方法()

    调用close()会导致刷新所有数据.你构建了一个PrintWriter而没有启用自动刷新(其中一个构造函数的第二个参数),这意味着你必须手动调用flush(),close()会为你做. 关闭还可以释 ...

  6. java 判断数的位数_Java判断数字位数的两种方法

    版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创! 恰饭广告 普通方法: import java.util.Scanner; public class Digits { pub ...

  7. java中集合的排序_Java中集合排序的两种方法

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  8. java 中map的优点_java 中map遍历的四种方法和优缺点

    /** * 在for-each循环中使用entries来遍历 * 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用 * 如果遍历的是一个空的map,会报数组越界 ,java5引入 ...

  9. java怎么创建子线程_Java创建子线程的两种方法

    摘要: 其实两种方法归结起来看还是一种,都是利用Thread的构造器进行创建,区别就是一种是无参的,一种是有参的. 一.继承Thread线程类: 通过继承Thread类,重写run方法,子类对象就可以 ...

最新文章

  1. 加了好友怎么还掉血_微信聊天窗口出现风险提醒,无法添加好友解决办法
  2. Metasploit设置VERBOSE参数技巧
  3. hust sci列表
  4. 【十大经典数据挖掘算法】Naïve Bayes
  5. 安装好了pytorch,但不知道安装路径怎么办?——快速找到pytorch安装路径
  6. EGOImageView 解析
  7. chromedriver@2.41.0 install: `node install.js`安装失败解决;npm安装报错
  8. 在linux中检测go语言,Linux AIDE(文件完整性检测)-Go语言中文社区
  9. 前端设计必备-Font awesome 插件使用菜鸟言语
  10. 华为HCC2014的变与不变
  11. 【Try to Hack】masscan
  12. c++ vtable 深入解析
  13. 如何压缩css代码,在开发中怎么压缩js和css?有哪些办法?
  14. 四级英语口语模拟测试软件,2018年大学英语四级口语考试模拟
  15. WerFault.exe 占用CPU 100%的问题处理
  16. 【程序设计】定时任务调度平台需求说明书
  17. leetcode【135】Candy【c++版,双数组,单数组,坡峰坡谷】
  18. esp32 smtp发送邮件micropython
  19. Linux Shell - 脚本中自动确认需要输入确认的命令
  20. 给未来的你nbsp;nbsp;—nbsp;李开复在2011…

热门文章

  1. 用户登陆_华为路由器AAA用户密码登陆你了解吗?
  2. 嵌入式C语言编程——.h文件与.c文件
  3. 都兰县第一中学计算机,都兰县第一中学教案.doc
  4. linux数字设定法设定权限,Linux chmod命令详解和使用实例(改变文件或目录的访问权限)...
  5. matlab int 积不出,matlab – 点积:*命令与循环给出不同的结果
  6. java简单系统_Java简单学生管理系统
  7. python socket编程_Python学习记录-socket编程
  8. pb 调用虹软_python调用虹软2.0
  9. vant按需引入没样式_vue vant-ui样式出不来的问题
  10. 大楼通信综合布线系统_某办公大楼综合布线系统设计实例,小白可以借鉴一下,大神请绕路...