Java JPA和InnoDB,以及JSP/JSTL问题
有几个问题:Java JPA和InnoDB,以及JSP/JSTL问题,java,jsp,jpa,jstl,Java,Jsp,Jpa,Jstl,有几个问题: 如果我已经用注释CascadeType.ALL映射了一个客户的I-var列表订单,那么我是否也应该在删除CASCADE的MySQL InnoDB中设置关系?还是这些会干扰 是否有必要在每个JSP文件中都说?我可以在web.xml中将其设置为配置参数吗 是否可以让编译器检查servlet映射url和JSP中的url,或者以某种方式强制它们同步?示例:在web.xml/login和login.jsp:(注意额外的n) 和${value}之间的区别是什么?两者似乎都能工作(除非您需要默认
列表订单
,那么我是否也应该在删除CASCADE的MySQL InnoDB中设置关系
?还是这些会干扰
?我可以在web.xml中将其设置为配置参数吗/login
和login.jsp:
(注意额外的n)
和${value}之间的区别是什么?两者似乎都能工作(除非您需要默认值)?我什么时候应该用哪个String possibleUserID = request.getParameter("userid");
if(possibleUserID == null){
errors.add("User-ID must be exist");
} else {
if(possibleUserID.trim().length() == 0){
errors.add("User-ID must be filled in");
}
// etc
}
没有某种web框架?1。不,你不必这样做。级联由JPA提供商管理
5.没有。您可以编写自己的实用程序类或验证框架,也可以使用现有的实用程序类或验证框架。1。不,您不必这样做。级联由JPA提供商管理 5.没有。编写自己的实用程序类或验证框架,或者使用现有的实用程序类或验证框架。4)
执行XML转义,${value}
不执行XML转义,${value}4)
执行XML转义,${value}
不执行XML转义
要有一个合适的数据模型,是的,您应该
您最终可以使用一个过滤器,它可以执行HttpServeletResponse#setCharacterEncoding()
和#setContentType()
,但对于普通JSP页面,我更喜欢上面的@page
。如有必要,只需在IDE中JSP模板的顶部添加额外的行,这样您就不必每次都输入它
不,这不是编译器的责任
c:out
将转义HTML实体,而EL-in模板文本则不会。要重新显示用户控制的输入,应使用c:out
。否则,简单的EL就足够了。例如:
String input = "<script>alert('XSS');</script>";
<p><c:out value="${input}" /></p> <!-- works fine, no alert, just escaped. -->
<p>${input}</p> <!-- JS get interpreted and executed! XSS! -->
String input=“警报('XSS');”;
${input}
当然,还有更好的办法。但是,由于您不想使用框架,所以到此为止。我至少可以说,关键是。最小化和重构代码重复。还要尽量使其抽象化,以便易于扩展和重用。以下是一些提示:
String username = view.getField("username", REQUIRED, MINLENGTH(3));
String email = view.getField("email", REQUIRED, EMAIL);
Integer age = view.getField("age", Integer.class, NUMBER);
// ...
public String getField(String name, Validator... validators) {
return getField(name, String.class, validators);
}
public <T extends Object> T getField(String name, Class<T> type, Validator... validators) {
String value = request.getParameter(name);
return validateAndConvert(name, value, type, validators);
}
private <T extends Object> T validateAndConvert
(String name, String value, Class<T> type, Validator... validators)
{
value = (value != null && !value.trim().isEmpty()) ? value.trim() : null;
try {
for (Validator validator : validators) {
validator.validate(value);
}
} catch (ValidatorException e) {
setError(name, e.getMessage());
}
return (value != null) ? Converter.convert(value, type) : null;
}
stringusername=view.getField(“username”,必需,MINLENGTH(3));
字符串email=view.getField(“email”,必填,email);
整数年龄=view.getField(“年龄”,Integer.class,NUMBER);
// ...
公共字符串getField(字符串名称、验证程序…验证程序){
返回getField(名称、String.class、验证器);
}
公共T getField(字符串名称、类类型、验证器…验证器){
字符串值=request.getParameter(名称);
返回validateAndConvert(名称、值、类型、验证器);
}
私有T验证数据转换
(字符串名称、字符串值、类类型、验证器…验证器)
{
value=(value!=null&&!value.trim().isEmpty())?value.trim():null;
试一试{
for(验证器验证器:验证器){
validator.validate(值);
}
}捕获(异常验证程序){
setError(名称,例如getMessage());
}
返回(值!=null)?转换器。转换(值,类型):null;
}
要有一个合适的数据模型,是的,您应该
您最终可以使用一个过滤器,它可以执行HttpServeletResponse#setCharacterEncoding()
和#setContentType()
,但对于普通JSP页面,我更喜欢上面的@page
。如有必要,只需在IDE中JSP模板的顶部添加额外的行,这样您就不必每次都输入它
不,这不是编译器的责任
c:out
将转义HTML实体,而EL-in模板文本则不会。要重新显示用户控制的输入,应使用c:out
。否则,简单的EL就足够了。例如:
String input = "<script>alert('XSS');</script>";
<p><c:out value="${input}" /></p> <!-- works fine, no alert, just escaped. -->
<p>${input}</p> <!-- JS get interpreted and executed! XSS! -->
String input=“警报('XSS');”;
${input}
当然,还有更好的办法。但是,由于您不想使用框架,所以到此为止。我至少可以说,关键是。最小化和重构代码重复。还要尽量使其抽象化,以便易于扩展和重用。以下是一些提示:
String username = view.getField("username", REQUIRED, MINLENGTH(3));
String email = view.getField("email", REQUIRED, EMAIL);
Integer age = view.getField("age", Integer.class, NUMBER);
// ...
public String getField(String name, Validator... validators) {
return getField(name, String.class, validators);
}
public <T extends Object> T getField(String name, Class<T> type, Validator... validators) {
String value = request.getParameter(name);
return validateAndConvert(name, value, type, validators);
}
private <T extends Object> T validateAndConvert
(String name, String value, Class<T> type, Validator... validators)
{
value = (value != null && !value.trim().isEmpty()) ? value.trim() : null;
try {
for (Validator validator : validators) {
validator.validate(value);
}
} catch (ValidatorException e) {
setError(name, e.getMessage());
}
return (value != null) ? Converter.convert(value, type) : null;
}
stringusername=view.getField(“username”,必需,MINLENGTH(3));
字符串email=view.getField(“email”,必填,email);
整数年龄=view.getField(“年龄”,Integer.class,NUMBER);
// ...
公共字符串getField(字符串名称、验证程序…验证程序){
返回getField(名称、String.class、验证器);
}
公共T getField(字符串名称、类类型、验证器…验证器){
字符串值=request.getParameter(名称);
返回validateAndConvert(名称、值、类型、验证器);
}
私有T验证数据转换
(字符串名称、字符串值、类类型、验证器…验证器)
{
value=(value!=null&&!value.trim().isEmpty())?value.trim():null;
试一试{
for(验证器验证器:验证器){
validator.validate(值);
}
}捕获(异常验证程序){
setError(名称,例如getMessage());
}
返回(值!=null)?转换器。转换(值,类型):null;
}