jsp学习笔记day2
一、jsp基础语法
1、注释
显式注释语法:
<!--注释内容-->客户端可以看见
隐式注释语法:客户端不能看见
<%
//单行注释
/*多行注释*/
%>
2、
Scriptlet(脚本小程序)
<%%>:主要用于定义局部变量、编写语句
<%!%>:主要用于定义全局变量、方法、类,不能出现其他语句
尽量不要在JSP中定义类和方法<%=%>:表达式输出
<%
scriptlet标签
String info = "www.baidu.com";
%>
<h1>website=<%=info%></h1> 3、
<jsp:scriptlet> String url="www.baidu.com"; </jsp:scriptlet> <h2><%=url%></h2> 4、page常用指令
如下:
指令属性 |
描述 |
language |
声明所使用的脚本语言,目前只有Java一种,所以可以不声明。 |
extends |
指定JSP页面产生的Servlet继承的父类 |
import |
指定所导入的包。(java.lang.*、javax.servlet.*、javax.servlet.jsp.*、和java.servlet.http.*几个包在程序编译时已经被导入,所以不需要特备声明) |
session |
指定JSP页面是否可以使用Session对象(默认值为session=”true”)。 |
buffer |
指定缓冲区的大小,默认是8KB。如果为none,则表示不设置缓冲区。(此属性要和autoFlush一起使用) |
autoFlush |
指定输出缓冲区即将溢出时,是否强制输出缓冲区的内容。可以设置为true或false(默认为true)。 |
isThreadSafe |
指定JSP是否支持多线程。可以设置为true或false,若为true,则表示该页面可以处理多个用户的请求;如果为false,则此JSP一次只能处理一个页面的用户请求。 |
info |
设置JSP页面的相关信息。可以使用servlet.getServletInfo()方法获取到JSP页面中的文本信息。 |
ErrorPage |
指定错误处理页面。当JSP出错时,会自动调用该指定所指定的错误处理页面。(此属性要和isErrorPage一起使用) |
isErrorPage |
指定JSP文件是否进行异常处理。可以设置为true或false,如果设置为true,则errorPage指定的页面出错时才能跳转到此页面进行错误处理。 |
contentType |
指定JSP页面的编码方式和JSP页面响应的MIME类型(默认的MIME类型为text/html,默认的字符集类型为charset=ISO-8859-1)。例如:contentType=“text/html;charset=GBK” |
pageEncoding |
指定页面的编码方式。默认值为pageEncoding=“iso-8859-1”,若设为中文编码可以是pageEncoding=“GBK”。 |
isELIgnored |
指定JSP文件是否支持EL表达式。 |
注释:对于以上属性,只有import属性可以多次出现,其他属性均只能出现一次。
contentType设置MIME
MIME表示打开文件的应用程序类型,
page指令中,contentType可以指定文件的显示方式
例如:
<%@ page language="java" contentType="text/html;charset=GBK"%>
<%@ page language="java" contentType="application/word;charset=GBK"%>
pageEncoding设置文件编码
charset是指服务器发送给客户端的内容编码,pageEncoding指的是JSP文件本身的编码。如果pageEncoding存在,那么JSP编码由pageEncoding决定,否则由charset决定,如果两个属性都不存在,则默认为ISO-8859-1
例如:
<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
一般一个JSP页面只需要按照网页显示(text/html),则使用pageEncoding设置编码即可。
errorPage错误页的设置
错误页设置两步骤:
1. errorPage属性指定错误出现时的跳转页;
2. isErrorPage属性指定错误页标识
例如:
错误页中:
<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
<%@page errorPage="error.jsp"%><!--一出现错误即跳转到错误处理页-->
错误处理页中:
<%@ page language="java" contengType="text/html;pageEncoding=GBK"%>
<%@ page isErrorPage="true"%><!--表示该页面用于处理错误-->
错误页跳转输入服务器端跳转
可以修改Web.xml文件,实现在虚拟目录指定全局的错误处理
<error-page>
<error-code>500</error-code>
<location>/ch05/error.jsp</location>
</error-page>
依然服务器端跳转
5、数据库操作
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.sql.*"%>
<html>
<head><title>www.bruce.com</title></head>
<body>
<%!
//定义数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
public static final String DBURL = "jdbc:mysql://localhost:3306/mldn";
public static final String DBUSER = "root";
public static final String DBPASS = "mysqladmin";
%>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
%>
<%
try{
Class.forName(DBDRIVER);
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);
String sql = "SELECT empno,ename,job,sal,hiredate FROM emp";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
%>
<center>
<table border="1" width="80%">
<tr>
<td>雇员编号</td>
<td>雇员姓名</td>
<td>雇员工作</td>
<td>雇员工资</td>
<td>雇员日期</td>
</tr>
<%
while(rs.next()){
int empno = rs.getInt(1);
String ename = rs.getString(2);
String job = rs.getString(3);
float sal = rs.getFloat(4);
java.util.Date date = rs.getDate(5);
%>
<tr>
<td><%=empno%></td>
<td><%=ename%></td>
<td><%=job%></td>
<td><%=sal%></td>
<td><%=date%></td>
</tr>
<%
}
%>
</table>
</center>
<%
}catch(Exception e){
e.printStack();
}finally{
rs.close();
pstmt.close();
conn.close();
}
%>
</body>
</html>
6、包含指令
静态包含
语法:<%@ include file = "要包含的文件路径"%>
包含的文件可以是JSP,HTML,文本,或者是一段Java程序。包含操作实际上是将被导入的文件内容导入,一起进行编译,最后再将一份整体的内容展现给用户
例如:
<body>
<%@include file="info.html"%>
</body>
动态包含
语法:
1. 不传递参数: <jsp:include page="{要包含的文件路径\<%=表达式%>}" flush="true\false"/>
- 传递参数:
<jsp:include page="{要包含的文件路径\<%=表达式%>}" flush="true\false">
<jsp:param name="参数名" value="参数内容"/>
//可以传递多个参数
</jsp:include>
例如:
包含页:include_demo.jsp
<jsp:include page="receive_param.jsp">
<jsp:param name="name" value="<%=username>">
<jsp:param name="info" value="Bruce">
</jsp:include>
被包含页:receive_param.jsp
<%@ page contentType="text/html" pageEncoding="GBK"%>
<h1>参数1:<%=request.getParameter("name")%></h1>
<h1>参数2:<%=request.getParameter("info")%></h1>
false表示完全被读进来再输出,true表示buffer满了就输出,一般都设置为true,默认为true
动态包含是先处理再输出
7、跳转指令
语法:
1. 不传递参数: <jsp:forward page="{要包含的文件路径\<%=表达式%>}"/>
2. 传递参数:
<jsp:forward page="{要包含的文件路径\<%=表达式%>}">
<jsp:param name="" value=""/>
//可以传递多个参数
</jsp:forward>
上述跳转属于服务器端跳转
8、jsp九大内置对象
内置对象 | 类型 | 描述 |
---|---|---|
pageContext | javax.servlet.jsp.PageContext | 页面容器 |
request | javax.servlet.HttpServletRequest | 请求 |
response | javax.servlet.HttpServletResponse | 回应 |
session | javax.servlet.HttpSession | 保存 |
application | javax.servlet.ServletContext | 共享信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
out | javax.servlet.jspWriter | 页面输出 |
page | java.lang.Object | |
exception | java.lang.Throwable |
四种属性
属性名 | 属性范围 |
---|---|
page | 只在一个页面中保存属性 |
request | 一次请求中保存属性,服务器跳转后仍有效 |
session | 一次会话范围中保存,任何跳转都有效,重新打开浏览器无效 |
application | 整个服务器保存,所有用户都可以使用 |
4个内置对象都支持以下操作方法:
public void setAttribute(String name,Object o)
public Object getAttribute(String name)
public void removeAttribute(String name)
request对象
request对象主要作用是接收客户端发送来的请求,是javax.servlet.http.HttpServletRequest接口的实例化对象
常用方法 | 描述 |
---|---|
public String getParameter(String name) | 接收请求参数 |
public String[] getParameterValues(String name) | 接收一组请求参数 |
public Enumeration getParameterNames() | 取得请求参数名 |
public String getRemoteAddr() | 取得客户端IP地址 |
void setCharacterEncoding(String env)throws UnsupportedEncodingException | 设置统一的请求编码 |
public boolean isUserInRole(String role) | 用户身份认证 |
public Httpsession getSession() | 取得当前的session对象 |
pubic StringBuffer getRequestURL() | 返回正在请求的路径 |
pubic Enumeration getHeaderNames() | 取得全部头信息的名称 |
pubic Enumeration getHeader(String name) | 根据名称取得头信息的内容 |
public String getMethod() | 取得用户的提交方式(get/post) |
public String getServletPath() | 取得访问的路径 |
public String getContextPath() | 取得上下文资源路径 |
解决乱码
例如:
<body>
<%
request.setCharacterEncoding("GBK");
%>
</body>
例如:接收表单全部内容
定义表单页:request_form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>request_form.html</title>
</head> <body>
<form action="request_demo.jsp" method="post"><!-- 用post,否则乱码 -->>
姓名:<input type="text" name="uname"><br /> 兴趣:<input
type="checkbox" name="**inst" value="唱歌">唱歌<input
type="checkbox" name="**inst" value="跳舞">跳舞<input
type="checkbox" name="**inst" value="游泳">游泳<br /> 自我介绍:
<textarea cols="30" rows="3" name="note"></textarea>
<input type="hidden" name="uid" value="1"> <input
type="submit" value="提交"> <input type="reset" value="重置">
<br />
</form>
</body>
</html>
定义读取页:request_demo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'request_demo.jsp' starting page</title>
</head> <body>
<%
request.setCharacterEncoding("GBK");//不能少,否则容易乱码
%>
<table border="1">
<tr>
<th>参数名称</th>
<th>参数内容</th>
</tr>
<%
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String paramName = (String) enu.nextElement();
%>
<tr>
<td><%=paramName%></td>
<td>
<%
if (paramName.startsWith("**")) {
String paramValue[] = request
.getParameterValues(paramName);
for (int i = 0; i < paramValue.length; i++) {
%> <%=paramValue[i]%>、
<%
}
} else {
String paramValue = request.getParameter(paramName);
%>
<%=paramValue%>
<%
}
%>
</td>
</tr>
<%
}
%> </table>
</body>
</html>
显示全部头信息
<%@ page contextType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>取得头信息的名称和内容</title></head>
<body>
<%
Enumeration enu = request.getHeaderNames();
while(enu.hasMoreElements()){
String headerName = (String)enu.nextElement();
String headerValue = request.getHeader(headerName);
%>
<h5><%=headerName%>--><%=headerValue%></h5>
<%
}
%>
</body>
</html>
角色验证
增加新用户需要修改conf/tomcat-user.xml文件。
<user username="10202357" password="Tu86511620" roles="admin" />
配置完之后还需要配置web.xml文件,在web.xml文件中加入对某一资源的验证操作
角色验证即在JSP页面中调用request.isUserInRole(“”)
response对象
response对象的主要作用是对客户端请求的响应,是javax.servlet.http.HttpServletResponse接口的实例
常用方法 | 描述 |
---|---|
public void addCookie(Cookie cookie) | 给客户端增加Cookie |
public void setHeader(String name,String value) | 设置回应的头信息 |
public void sendRedirect(String location)throws IOException | 页面跳转 |
设置头信息
例如:
设置自动刷新:
<% reponse.setHeader("refresh","2") %>
定时跳转:
<% reponse.setHeader("refresh","2";URL="hello.html") %>
定时跳转(JSP response\HTML方式)都属于客户端跳转
例子
<html>
<head>
<title>测试html页面的跳转</title>
<META HTTP-EQUIV="refresh" CONTENT="3;URL=hello.html">
</head>
<body>
<h3>
3秒后跳转到hello.html页面,如果没有跳转请按<a href="hello.html">这里</a>!
</h3>
</body>
</html>
当一个页面中没有JSP代码又想执行定时跳转的时候才使用HTML形式的设置跳转头信息
页面跳转
<% response.sendRedirect("01.html"); %>
与<jsp:forward>
不同,response属于客户端跳转,要在整个页面执行完以后才执行跳转。 <jsp:forward>
可以方便地进行参数传递,而且服务器端跳转要比客户端跳转更常用
操作cookie
Cookie的常用方法 | 描述 |
---|---|
public Cookie(String name,String value) | |
public String getName() | |
public String getValue() | |
public void setMaxAge(int expiry) | 设置Cookie的保存时间,以秒为单位 |
Cookie是服务器给客户端增加的,所以使用reponse对象
例子
<%
Cookie c1 = new Cookie("Tu","Bruce");//第一个参数是属性名,第二个参数是属性值
c1.setMaxAge(60);//Cookie保存60秒
response.addCoolie(c1);//向客户端增加Cookie
%>
例如:取出Cookie
<%
Cookie c[] = request.getCookies();
for(int x = 0; x < c.length; x++){
%>
<h3><%=c[x].getName()%>--><%=c[x].getValue()%></h3>
<%
}
%>
session对象
在开发中session对象最主要的用处是完成用户的登录、注销等常见功能。
常用方法 | 描述 |
---|---|
public String getId() | 取得Session Id |
public long getCreationTime() | 取得Session的创建时间 |
public long getLastAccessedTime() | 取得Session的最后一次操作时间 |
public boolean isNew() | 判断是否是新的Session |
public void invalidate() | 让Session失效 |
public Enumeration getAttributeNames() | 得到全部属性的名称 |
登录与注销
实例:
编写表单并进行验证login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>登录注销</title>
</head> <body>
<form action="login.jsp">
用户名:<input type="text" name="uname" /></br> 密 码:<input
type="password" name="upass"> <input type="submit" value="登录">
<input type="reset" value="重置">
</form>
<%
String name = request.getParameter("uname");
String password = request.getParameter("upass");
if (!(name == null || "".equals(name) || password == null || ""
.equals(password))) {
if ("Bruce".equals(name) && "2222".equals(password)) {
response.setHeader("refresh", "2,URL=welcome.jsp");
session.setAttribute("userid", name);
%>
<h3>用户登录成功,两秒后跳转到欢迎页!</h3>
<h3>
如果没有跳转,请点击<a href="welcome.jsp">这里</a>
</h3>
<%
} else {
%>
<h3>错误的用户名和密码</h3>
<%
} }
%>
</body>
</html>
登录成功欢迎页welcome.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>'welcome.jsp'</title>
</head> <body>
<%
if (session.getAttribute("userid") != null) {
%>
<h3>
欢迎<%=session.getAttribute("userid")%>光临本系统,<a href="logout.jsp">注销</a>
</h3>
<%
} else {
%>
<h3>
请先进行系统的<a href="login.jsp">登录</a>
</h3>
<%
}
%>
</body>
</html>
登录注销logout.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<html>
<head>
<title>'logout.jsp'</title>
</head> <body>
<%
response.setHeader("refresh", "2;login.jsp");
session.invalidate();
%>
<h3>你已经成功注销,两面后自动跳转回首页</h3>
<h3>
如果没有跳转,请点击<a href="login.jsp">这里</a>
</h3>
</body>
</html>
判断新用户
<% session.isNew(); %>
取得用户的操作时间
<%
long start = session.getCreationTime();
long end = session.getLastAccessedTime();
long time = (end-start)/1000;//得出操作的秒
%>
application对象
常用方法 | 描述 |
---|---|
String getRealPath(String path) | 得到虚拟目录对应的绝对路径 |
public Enumeration getAttributeNames() | 得到所有属性的名称 |
public String getContextPath() | 取得当前的虚拟路径名称 |
取得虚拟目录对应的绝对路径
<%
String path1 = application.getRealPath("/");
String path2 = this.getServletContext().getRealPath("/");//两个方法的结果一样
%>
例如:保存表单内容在Web项目的根目录中的note文件夹中
表单递交页面form.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>form.html</title>
</head> <body>
<form action="input.jsp">
输入文件名称:<input type="text" name="filename"> 输入文件内容:
<textarea name="filecontent" cols="30" rows="3"></textarea>
<input type="submit" value="保存"> <input type="reset"
value="重置">
</form>
</body>
</html>
处理页面input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<html>
<head>
<title>My JSP 'input.jsp' starting page</title>
</head> <body>
<%
String realPath = this.getServletContext().getRealPath("/");
%>
<h3><%=realPath%></h3>
<%
String name = request.getParameter("filename");
String content = request.getParameter("filecontent");
String fileName = this.getServletContext().getRealPath("/")
+ "note" + File.separator + name;
File file = new File(fileName);
if (!(file.getParentFile().exists())) {
file.getParentFile().mkdir();
}
PrintStream ps = new PrintStream(new FileOutputStream(file));
ps.println(content);
ps.close();
%>
</body>
</html>
类似用FileOutputStream也可以完成创建文件并写入,body体改为
<body>
<%
String realPath = this.getServletContext().getRealPath("/");
%>
<h3><%=realPath%></h3>
<%
String name = request.getParameter("filename");
String content = request.getParameter("filecontent");
String fileName = this.getServletContext().getRealPath("/")
+ "note" + File.separator + name + ".txt";
File file = new File(fileName);
if (!(file.getParentFile().exists())) {
file.getParentFile().mkdir();
}
FileOutputStream fo = new FileOutputStream(file);
byte b[] = content.getBytes();
fo.write(b);
fo.close();
%>
</body>
结果一样。
网站计数器
<%@page import="java.io.*"%>
<%@page import="java.math.*"%>
<%@page import="java.util.*"%>
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'Count.jsp' starting page</title>
</head> <body>
<%!BigInteger count = null;%>
<%!//为了方便,方法直接定义放在在JSP文件中
public BigInteger load(File file) {
BigInteger count = null;
try {
if (file.exists()) {
Scanner scan = new Scanner(new FileInputStream(file));
if (scan.hasNext()) {
count = new BigInteger(scan.next());
scan.close();
}
}else {
count = new BigInteger("0");
save(file, count);
}
} catch (Exception e) {
e.printStackTrace();
}
return count;
} public void save(File file, BigInteger count) {
try {
PrintStream ps = null;
ps = new PrintStream(new FileOutputStream(file));
ps.println(count);
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
}%>
<%
String filename = this.getServletContext().getRealPath("/")
+ "count.txt";
File file = new File(filename);
if (session.isNew()) {
synchronized (this) {
count = load(file);
count = count.add(new BigInteger("1"));
save(file, count);
}
}
%>
<h2>
您是第<%=count%>位访客!
</h2>
</body>
</html>
jsp学习笔记day2的更多相关文章
- JSP学习笔记
JSP学习笔记 Jsp网页主要分为Elements与Template Data两部分. Template Data:JSP Container不处理的部分,例如HTML内容 Elements:必须经由 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象
JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...
- JSP 学习笔记1
JSP 学习笔记 JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例--JSP页面有系统编译成Servlet,Servlet再负责响应用户请求. 1.JSP注释 < ...
- jsp学习笔记:mvc开发模式
jsp学习笔记:mvc开发模式2017-10-12 22:17:33 model(javabe)与view层交互 view(视图层,html.jsp) controller(控制层,处理用户提交的信息 ...
- JSP学习笔记2
<JAVA遇见HTML——JSP篇>学习笔记(下) 1.Javabean Javabeans就是符合某种规范的java类,使用Javabeans的好处是[解决代码的重复编写],减少代码冗余 ...
- (转) jsp学习笔记
fromhttp://www.cnblogs.com/tao975/p/4445070.html 什么是JSP JSP的优势 JSP的劣势 JSP与PHP的比较 JSP工作原理 JSP的九大内置对象 ...
- 《从零开始学Swift》学习笔记(Day2)——使用Web网站编写Swift代码
Swift 2.0学习笔记——使用Web网站编写Swift代码 原创文章,欢迎转载.转载请注明:关东升的博客 Swift程序不能在Windows其他平台编译和运行,有人提供了一个网站swiftstub ...
- 重温JSP学习笔记--三大指令九大内置对象
最近在温习javaweb的相关基础知识,鉴于我弄丢了记满了整整一本的笔记,决定以后把笔记和一些学习上的心得以及碰到的一些问题统统都放在网上,今天看了一下jsp的相关基础,以下是笔记: JSP三大指令: ...
随机推荐
- py函数式编程
函数式编程把计算视为函数而非指令,纯函数式编程不需要变量,没有副作用,测试简单,python支持的函数式编程不是纯函数式编程,允许有变量存在,支持高阶函数,支持闭包,有限度的支持匿名函数 变量可以指向 ...
- 正式学习MVC 03
1.View -> Controller的数据通信 1) 通过url查询字符串 public ActionResult Index(string user) { return Content(u ...
- 使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less
之前只知道webpack很强大,但是一直没有深入学习过,这次从头看了一下教程,然后从0开始搭建了一个多入口网站的开发脚手架,期间遇到过很多问题,所以有心整理一下,希望能给大家一点帮助. 多HTML网站 ...
- 【猫狗数据集】谷歌colab之使用pytorch读取自己数据集(猫狗数据集)
之前在:https://www.cnblogs.com/xiximayou/p/12398285.html创建好了数据集,将它上传到谷歌colab 在colab上的目录如下: 在utils中的rdat ...
- url,href和src的区别,defer和async的区别
URL(Uniform Resource Locator):统一资源定位符,互联网上的每个文件都有一个唯一的URL,基本URL包含协议,IP地址,路径和文件名. 重点:herf和src的区别 href ...
- 初探Linux
这是一个小小新手根据自己对Linux的理解而写下的笔记,记录的是大体的学习内容.记录的笔记不全面,甚至没有整体的概念,但也希望能够给部分人一些入门的帮助,实机基于CentOS 7. 导语:学习一件新事 ...
- mysql(8.0连接navicat发生的错误解决方法)
关于mysql(8.0连接navicat发生的错误解决方法)数据库安装图形化界面无法更改加密的方式导致无法连接问题为解决; Alter user 'root'@'localhost' identifi ...
- linux ftp服务器设置,只允许用户访问指定的文件夹,禁止访问其他文件夹
在Linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd ...
- failed to open directory
解决方法: 解决方案的路径不要包含中文!
- Android开发走过的坑(持续更新)
1 华为 nova真机 打印不出Log 参考资料:http://www.apkbus.com/thread-585228-1-1.html 解决:针对权限问题,我们当然也可以解决的,华为手机在你的拨号 ...